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

Commit 6a8f1d8d authored by Jan Kara's avatar Jan Kara Committed by Greg Kroah-Hartman
Browse files

loop: Get rid of loop_index_mutex



commit 0a42e99b58a208839626465af194cfe640ef9493 upstream.

Now that loop_ctl_mutex is global, just get rid of loop_index_mutex as
there is no good reason to keep these two separate and it just
complicates the locking.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7d839c10
Loading
Loading
Loading
Loading
+20 −19
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@
#include <asm/uaccess.h>

static DEFINE_IDR(loop_index_idr);
static DEFINE_MUTEX(loop_index_mutex);
static DEFINE_MUTEX(loop_ctl_mutex);

static int max_part;
@@ -1560,9 +1559,11 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,
static int lo_open(struct block_device *bdev, fmode_t mode)
{
	struct loop_device *lo;
	int err = 0;
	int err;

	mutex_lock(&loop_index_mutex);
	err = mutex_lock_killable(&loop_ctl_mutex);
	if (err)
		return err;
	lo = bdev->bd_disk->private_data;
	if (!lo) {
		err = -ENXIO;
@@ -1571,7 +1572,7 @@ static int lo_open(struct block_device *bdev, fmode_t mode)

	atomic_inc(&lo->lo_refcnt);
out:
	mutex_unlock(&loop_index_mutex);
	mutex_unlock(&loop_ctl_mutex);
	return err;
}

@@ -1580,12 +1581,11 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
	struct loop_device *lo;
	int err;

	mutex_lock(&loop_index_mutex);
	mutex_lock(&loop_ctl_mutex);
	lo = disk->private_data;
	if (atomic_dec_return(&lo->lo_refcnt))
		goto unlock_index;
		goto out_unlock;

	mutex_lock(&loop_ctl_mutex);
	if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
		/*
		 * In autoclear mode, stop the loop thread
@@ -1593,7 +1593,7 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
		 */
		err = loop_clr_fd(lo);
		if (!err)
			goto unlock_index;
			return;
	} else {
		/*
		 * Otherwise keep thread (if running) and config,
@@ -1602,9 +1602,8 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
		loop_flush(lo);
	}

out_unlock:
	mutex_unlock(&loop_ctl_mutex);
unlock_index:
	mutex_unlock(&loop_index_mutex);
}

static const struct block_device_operations lo_fops = {
@@ -1890,7 +1889,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
	struct kobject *kobj;
	int err;

	mutex_lock(&loop_index_mutex);
	mutex_lock(&loop_ctl_mutex);
	err = loop_lookup(&lo, MINOR(dev) >> part_shift);
	if (err < 0)
		err = loop_add(&lo, MINOR(dev) >> part_shift);
@@ -1898,7 +1897,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
		kobj = NULL;
	else
		kobj = get_disk(lo->lo_disk);
	mutex_unlock(&loop_index_mutex);
	mutex_unlock(&loop_ctl_mutex);

	*part = 0;
	return kobj;
@@ -1908,9 +1907,13 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
			       unsigned long parm)
{
	struct loop_device *lo;
	int ret = -ENOSYS;
	int ret;

	mutex_lock(&loop_index_mutex);
	ret = mutex_lock_killable(&loop_ctl_mutex);
	if (ret)
		return ret;

	ret = -ENOSYS;
	switch (cmd) {
	case LOOP_CTL_ADD:
		ret = loop_lookup(&lo, parm);
@@ -1924,7 +1927,6 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
		ret = loop_lookup(&lo, parm);
		if (ret < 0)
			break;
		mutex_lock(&loop_ctl_mutex);
		if (lo->lo_state != Lo_unbound) {
			ret = -EBUSY;
			mutex_unlock(&loop_ctl_mutex);
@@ -1936,7 +1938,6 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
			break;
		}
		lo->lo_disk->private_data = NULL;
		mutex_unlock(&loop_ctl_mutex);
		idr_remove(&loop_index_idr, lo->lo_number);
		loop_remove(lo);
		break;
@@ -1946,7 +1947,7 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
			break;
		ret = loop_add(&lo, -1);
	}
	mutex_unlock(&loop_index_mutex);
	mutex_unlock(&loop_ctl_mutex);

	return ret;
}
@@ -2029,10 +2030,10 @@ static int __init loop_init(void)
				  THIS_MODULE, loop_probe, NULL, NULL);

	/* pre-create number of devices given by config or max_loop */
	mutex_lock(&loop_index_mutex);
	mutex_lock(&loop_ctl_mutex);
	for (i = 0; i < nr; i++)
		loop_add(&lo, i);
	mutex_unlock(&loop_index_mutex);
	mutex_unlock(&loop_ctl_mutex);

	printk(KERN_INFO "loop: module loaded\n");
	return 0;