[PATCH] kthread: update loop.c to use kthread
Update loop.c to use a kthread instead of a deprecated kernel_thread for loop devices. [akpm@osdl.org: don't change the thread's name] Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
2f72100c01
Коммит
c7b2eff059
|
@ -74,6 +74,7 @@
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/kthread.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
@ -578,8 +579,6 @@ static int loop_thread(void *data)
|
||||||
struct loop_device *lo = data;
|
struct loop_device *lo = data;
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
|
|
||||||
daemonize("loop%d", lo->lo_number);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* loop can be used in an encrypted device,
|
* loop can be used in an encrypted device,
|
||||||
* hence, it mustn't be stopped at all
|
* 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_state = Lo_bound;
|
||||||
lo->lo_pending = 1;
|
lo->lo_pending = 1;
|
||||||
|
|
||||||
/*
|
|
||||||
* complete it, we are running
|
|
||||||
*/
|
|
||||||
complete(&lo->lo_done);
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int pending;
|
int pending;
|
||||||
|
|
||||||
|
@ -629,7 +623,6 @@ static int loop_thread(void *data)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
complete(&lo->lo_done);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,6 +739,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
|
||||||
unsigned lo_blocksize;
|
unsigned lo_blocksize;
|
||||||
int lo_flags = 0;
|
int lo_flags = 0;
|
||||||
int error;
|
int error;
|
||||||
|
struct task_struct *tsk;
|
||||||
loff_t size;
|
loff_t size;
|
||||||
|
|
||||||
/* This is safe, since we have a reference from open(). */
|
/* This is safe, since we have a reference from open(). */
|
||||||
|
@ -839,10 +833,11 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
|
||||||
|
|
||||||
set_blocksize(bdev, lo_blocksize);
|
set_blocksize(bdev, lo_blocksize);
|
||||||
|
|
||||||
error = kernel_thread(loop_thread, lo, CLONE_KERNEL);
|
tsk = kthread_run(loop_thread, lo, "loop%d", lo->lo_number);
|
||||||
if (error < 0)
|
if (IS_ERR(tsk)) {
|
||||||
|
error = PTR_ERR(tsk);
|
||||||
goto out_putf;
|
goto out_putf;
|
||||||
wait_for_completion(&lo->lo_done);
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_putf:
|
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)
|
if (lo->lo_state != Lo_bound)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
|
if (!lo->lo_thread)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (lo->lo_refcnt > 1) /* we needed one fd for the ioctl */
|
if (lo->lo_refcnt > 1) /* we needed one fd for the ioctl */
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
|
@ -911,7 +909,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
|
||||||
complete(&lo->lo_bh_done);
|
complete(&lo->lo_bh_done);
|
||||||
spin_unlock_irq(&lo->lo_lock);
|
spin_unlock_irq(&lo->lo_lock);
|
||||||
|
|
||||||
wait_for_completion(&lo->lo_done);
|
kthread_stop(lo->lo_thread);
|
||||||
|
|
||||||
lo->lo_backing_file = NULL;
|
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_sizelimit = 0;
|
||||||
lo->lo_encrypt_key_size = 0;
|
lo->lo_encrypt_key_size = 0;
|
||||||
lo->lo_flags = 0;
|
lo->lo_flags = 0;
|
||||||
|
lo->lo_thread = NULL;
|
||||||
memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
|
memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE);
|
||||||
memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
|
memset(lo->lo_crypt_name, 0, LO_NAME_SIZE);
|
||||||
memset(lo->lo_file_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)
|
if (!lo->lo_queue)
|
||||||
goto out_mem4;
|
goto out_mem4;
|
||||||
mutex_init(&lo->lo_ctl_mutex);
|
mutex_init(&lo->lo_ctl_mutex);
|
||||||
init_completion(&lo->lo_done);
|
|
||||||
init_completion(&lo->lo_bh_done);
|
init_completion(&lo->lo_bh_done);
|
||||||
lo->lo_number = i;
|
lo->lo_number = i;
|
||||||
spin_lock_init(&lo->lo_lock);
|
spin_lock_init(&lo->lo_lock);
|
||||||
|
|
|
@ -59,7 +59,7 @@ struct loop_device {
|
||||||
struct bio *lo_bio;
|
struct bio *lo_bio;
|
||||||
struct bio *lo_biotail;
|
struct bio *lo_biotail;
|
||||||
int lo_state;
|
int lo_state;
|
||||||
struct completion lo_done;
|
struct task_struct *lo_thread;
|
||||||
struct completion lo_bh_done;
|
struct completion lo_bh_done;
|
||||||
struct mutex lo_ctl_mutex;
|
struct mutex lo_ctl_mutex;
|
||||||
int lo_pending;
|
int lo_pending;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче