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

Commit c1e63df4 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 f1e81ba8
Loading
Loading
Loading
Loading
+20 −19
Original line number Diff line number Diff line
@@ -81,7 +81,6 @@
#include <linux/uaccess.h>

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

static int max_part;
@@ -1588,9 +1587,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;
@@ -1599,7 +1600,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;
}

@@ -1608,12 +1609,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
@@ -1621,7 +1621,7 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
		 */
		err = loop_clr_fd(lo);
		if (!err)
			goto unlock_index;
			return;
	} else if (lo->lo_state == Lo_bound) {
		/*
		 * Otherwise keep thread (if running) and config,
@@ -1631,9 +1631,8 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
		blk_mq_unfreeze_queue(lo->lo_queue);
	}

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

static const struct block_device_operations lo_fops = {
@@ -1926,7 +1925,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);
@@ -1934,7 +1933,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;
@@ -1944,9 +1943,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);
@@ -1960,7 +1963,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);
@@ -1972,7 +1974,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;
@@ -1982,7 +1983,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;
}
@@ -2066,10 +2067,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;