| From ddfd338e2e52e7b3b078e0d65c5f23dd38781a4c Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Date: Wed, 30 Jan 2019 08:34:22 +0100 |
| Subject: Revert "loop: Get rid of loop_index_mutex" |
| |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| This reverts commit 611f77199cd763e6b7c0462c2f199ddb3a089750 which is |
| commit 0a42e99b58a208839626465af194cfe640ef9493 upstream. |
| |
| It is not needed in the 4.4.y tree at this time. |
| |
| Reported-by: Jan Kara <jack@suse.cz> |
| Cc: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/block/loop.c | 39 +++++++++++++++++++-------------------- |
| 1 file changed, 19 insertions(+), 20 deletions(-) |
| |
| --- a/drivers/block/loop.c |
| +++ b/drivers/block/loop.c |
| @@ -81,6 +81,7 @@ |
| #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; |
| @@ -1570,11 +1571,9 @@ static int lo_compat_ioctl(struct block_ |
| static int lo_open(struct block_device *bdev, fmode_t mode) |
| { |
| struct loop_device *lo; |
| - int err; |
| + int err = 0; |
| |
| - err = mutex_lock_killable(&loop_ctl_mutex); |
| - if (err) |
| - return err; |
| + mutex_lock(&loop_index_mutex); |
| lo = bdev->bd_disk->private_data; |
| if (!lo) { |
| err = -ENXIO; |
| @@ -1583,7 +1582,7 @@ static int lo_open(struct block_device * |
| |
| atomic_inc(&lo->lo_refcnt); |
| out: |
| - mutex_unlock(&loop_ctl_mutex); |
| + mutex_unlock(&loop_index_mutex); |
| return err; |
| } |
| |
| @@ -1592,11 +1591,12 @@ static void lo_release(struct gendisk *d |
| struct loop_device *lo; |
| int err; |
| |
| - mutex_lock(&loop_ctl_mutex); |
| + mutex_lock(&loop_index_mutex); |
| lo = disk->private_data; |
| if (atomic_dec_return(&lo->lo_refcnt)) |
| - goto out_unlock; |
| + goto unlock_index; |
| |
| + mutex_lock(&loop_ctl_mutex); |
| if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) { |
| /* |
| * In autoclear mode, stop the loop thread |
| @@ -1604,7 +1604,7 @@ static void lo_release(struct gendisk *d |
| */ |
| err = loop_clr_fd(lo); |
| if (!err) |
| - return; |
| + goto unlock_index; |
| } else { |
| /* |
| * Otherwise keep thread (if running) and config, |
| @@ -1613,8 +1613,9 @@ static void lo_release(struct gendisk *d |
| 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 = { |
| @@ -1896,7 +1897,7 @@ static struct kobject *loop_probe(dev_t |
| struct kobject *kobj; |
| int err; |
| |
| - mutex_lock(&loop_ctl_mutex); |
| + mutex_lock(&loop_index_mutex); |
| err = loop_lookup(&lo, MINOR(dev) >> part_shift); |
| if (err < 0) |
| err = loop_add(&lo, MINOR(dev) >> part_shift); |
| @@ -1904,7 +1905,7 @@ static struct kobject *loop_probe(dev_t |
| kobj = NULL; |
| else |
| kobj = get_disk(lo->lo_disk); |
| - mutex_unlock(&loop_ctl_mutex); |
| + mutex_unlock(&loop_index_mutex); |
| |
| *part = 0; |
| return kobj; |
| @@ -1914,13 +1915,9 @@ static long loop_control_ioctl(struct fi |
| unsigned long parm) |
| { |
| struct loop_device *lo; |
| - int ret; |
| - |
| - ret = mutex_lock_killable(&loop_ctl_mutex); |
| - if (ret) |
| - return ret; |
| + int ret = -ENOSYS; |
| |
| - ret = -ENOSYS; |
| + mutex_lock(&loop_index_mutex); |
| switch (cmd) { |
| case LOOP_CTL_ADD: |
| ret = loop_lookup(&lo, parm); |
| @@ -1934,6 +1931,7 @@ static long loop_control_ioctl(struct fi |
| 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); |
| @@ -1945,6 +1943,7 @@ static long loop_control_ioctl(struct fi |
| break; |
| } |
| lo->lo_disk->private_data = NULL; |
| + mutex_unlock(&loop_ctl_mutex); |
| idr_remove(&loop_index_idr, lo->lo_number); |
| loop_remove(lo); |
| break; |
| @@ -1954,7 +1953,7 @@ static long loop_control_ioctl(struct fi |
| break; |
| ret = loop_add(&lo, -1); |
| } |
| - mutex_unlock(&loop_ctl_mutex); |
| + mutex_unlock(&loop_index_mutex); |
| |
| return ret; |
| } |
| @@ -2037,10 +2036,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_ctl_mutex); |
| + mutex_lock(&loop_index_mutex); |
| for (i = 0; i < nr; i++) |
| loop_add(&lo, i); |
| - mutex_unlock(&loop_ctl_mutex); |
| + mutex_unlock(&loop_index_mutex); |
| |
| printk(KERN_INFO "loop: module loaded\n"); |
| return 0; |