]> err.no Git - linux-2.6/blobdiff - drivers/block/loop.c
[PATCH] Correct tty doc
[linux-2.6] / drivers / block / loop.c
index 9c3b94e8f03baa7d4138802e01b87e27e511c159..9dc294a74953f3793a71cb179f36224421d333e8 100644 (file)
@@ -74,6 +74,7 @@
 #include <linux/completion.h>
 #include <linux/highmem.h>
 #include <linux/gfp.h>
+#include <linux/kthread.h>
 
 #include <asm/uaccess.h>
 
@@ -578,8 +579,6 @@ static int loop_thread(void *data)
        struct loop_device *lo = data;
        struct bio *bio;
 
-       daemonize("loop%d", lo->lo_number);
-
        /*
         * loop can be used in an encrypted device,
         * hence, it mustn't be stopped at all
@@ -592,11 +591,6 @@ static int loop_thread(void *data)
        lo->lo_state = Lo_bound;
        lo->lo_pending = 1;
 
-       /*
-        * complete it, we are running
-        */
-       complete(&lo->lo_done);
-
        for (;;) {
                int pending;
 
@@ -629,7 +623,6 @@ static int loop_thread(void *data)
                        break;
        }
 
-       complete(&lo->lo_done);
        return 0;
 }
 
@@ -746,6 +739,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
        unsigned lo_blocksize;
        int             lo_flags = 0;
        int             error;
+       struct task_struct *tsk;
        loff_t          size;
 
        /* This is safe, since we have a reference from open(). */
@@ -818,7 +812,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
        lo->lo_device = bdev;
        lo->lo_flags = lo_flags;
        lo->lo_backing_file = file;
-       lo->transfer = NULL;
+       lo->transfer = transfer_none;
        lo->ioctl = NULL;
        lo->lo_sizelimit = 0;
        lo->old_gfp_mask = mapping_gfp_mask(mapping);
@@ -839,10 +833,11 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
 
        set_blocksize(bdev, lo_blocksize);
 
-       error = kernel_thread(loop_thread, lo, CLONE_KERNEL);
-       if (error < 0)
+       tsk = kthread_run(loop_thread, lo, "loop%d", lo->lo_number);
+       if (IS_ERR(tsk)) {
+               error = PTR_ERR(tsk);
                goto out_putf;
-       wait_for_completion(&lo->lo_done);
+       }
        return 0;
 
  out_putf:
@@ -898,6 +893,9 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
        if (lo->lo_state != Lo_bound)
                return -ENXIO;
 
+       if (!lo->lo_thread)
+               return -EINVAL;
+
        if (lo->lo_refcnt > 1)  /* we needed one fd for the ioctl */
                return -EBUSY;
 
@@ -911,7 +909,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
                complete(&lo->lo_bh_done);
        spin_unlock_irq(&lo->lo_lock);
 
-       wait_for_completion(&lo->lo_done);
+       kthread_stop(lo->lo_thread);
 
        lo->lo_backing_file = NULL;
 
@@ -924,6 +922,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
        lo->lo_sizelimit = 0;
        lo->lo_encrypt_key_size = 0;
        lo->lo_flags = 0;
+       lo->lo_thread = NULL;
        memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
        memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
        memset(lo->lo_file_name, 0, LO_NAME_SIZE);
@@ -1288,7 +1287,6 @@ static int __init loop_init(void)
                if (!lo->lo_queue)
                        goto out_mem4;
                mutex_init(&lo->lo_ctl_mutex);
-               init_completion(&lo->lo_done);
                init_completion(&lo->lo_bh_done);
                lo->lo_number = i;
                spin_lock_init(&lo->lo_lock);