Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c7b2eff0 authored by Serge E. Hallyn's avatar Serge E. Hallyn Committed by Linus Torvalds
Browse files

[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: default avatarSerge E. Hallyn <serue@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2f72100c
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -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(). */
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ struct loop_device {
	struct bio 		*lo_bio;
	struct bio		*lo_biotail;
	int			lo_state;
	struct completion	lo_done;
	struct task_struct	*lo_thread;
	struct completion	lo_bh_done;
	struct mutex		lo_ctl_mutex;
	int			lo_pending;