1 From 40be92f86e231126b4445ed185147004205c110c Mon Sep 17 00:00:00 2001
2 From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
3 Date: Wed, 27 Feb 2019 15:00:55 +0100
4 Subject: Revert "loop: Get rid of loop_index_mutex"
6 From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
8 This reverts commit 6a8f1d8d701462937ce01a3f2219af5435372af7 which is
9 commit 0a42e99b58a208839626465af194cfe640ef9493 upstream.
11 It does not work properly in the 4.9.y tree and causes more problems
12 than it fixes, so revert it.
14 Reported-by: Thomas Lindroth <thomas.lindroth@gmail.com>
15 Reported-by: Jan Kara <jack@suse.cz>
16 Cc: Jens Axboe <axboe@kernel.dk>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 drivers/block/loop.c | 39 +++++++++++++++++++--------------------
20 1 file changed, 19 insertions(+), 20 deletions(-)
22 --- a/drivers/block/loop.c
23 +++ b/drivers/block/loop.c
25 #include <asm/uaccess.h>
27 static DEFINE_IDR(loop_index_idr);
28 +static DEFINE_MUTEX(loop_index_mutex);
29 static DEFINE_MUTEX(loop_ctl_mutex);
32 @@ -1559,11 +1560,9 @@ static int lo_compat_ioctl(struct block_
33 static int lo_open(struct block_device *bdev, fmode_t mode)
35 struct loop_device *lo;
39 - err = mutex_lock_killable(&loop_ctl_mutex);
42 + mutex_lock(&loop_index_mutex);
43 lo = bdev->bd_disk->private_data;
46 @@ -1572,7 +1571,7 @@ static int lo_open(struct block_device *
48 atomic_inc(&lo->lo_refcnt);
50 - mutex_unlock(&loop_ctl_mutex);
51 + mutex_unlock(&loop_index_mutex);
55 @@ -1581,11 +1580,12 @@ static void lo_release(struct gendisk *d
56 struct loop_device *lo;
59 - mutex_lock(&loop_ctl_mutex);
60 + mutex_lock(&loop_index_mutex);
61 lo = disk->private_data;
62 if (atomic_dec_return(&lo->lo_refcnt))
66 + mutex_lock(&loop_ctl_mutex);
67 if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
69 * In autoclear mode, stop the loop thread
70 @@ -1593,7 +1593,7 @@ static void lo_release(struct gendisk *d
72 err = loop_clr_fd(lo);
78 * Otherwise keep thread (if running) and config,
79 @@ -1602,8 +1602,9 @@ static void lo_release(struct gendisk *d
84 mutex_unlock(&loop_ctl_mutex);
86 + mutex_unlock(&loop_index_mutex);
89 static const struct block_device_operations lo_fops = {
90 @@ -1889,7 +1890,7 @@ static struct kobject *loop_probe(dev_t
94 - mutex_lock(&loop_ctl_mutex);
95 + mutex_lock(&loop_index_mutex);
96 err = loop_lookup(&lo, MINOR(dev) >> part_shift);
98 err = loop_add(&lo, MINOR(dev) >> part_shift);
99 @@ -1897,7 +1898,7 @@ static struct kobject *loop_probe(dev_t
102 kobj = get_disk(lo->lo_disk);
103 - mutex_unlock(&loop_ctl_mutex);
104 + mutex_unlock(&loop_index_mutex);
108 @@ -1907,13 +1908,9 @@ static long loop_control_ioctl(struct fi
111 struct loop_device *lo;
114 - ret = mutex_lock_killable(&loop_ctl_mutex);
120 + mutex_lock(&loop_index_mutex);
123 ret = loop_lookup(&lo, parm);
124 @@ -1927,6 +1924,7 @@ static long loop_control_ioctl(struct fi
125 ret = loop_lookup(&lo, parm);
128 + mutex_lock(&loop_ctl_mutex);
129 if (lo->lo_state != Lo_unbound) {
131 mutex_unlock(&loop_ctl_mutex);
132 @@ -1938,6 +1936,7 @@ static long loop_control_ioctl(struct fi
135 lo->lo_disk->private_data = NULL;
136 + mutex_unlock(&loop_ctl_mutex);
137 idr_remove(&loop_index_idr, lo->lo_number);
140 @@ -1947,7 +1946,7 @@ static long loop_control_ioctl(struct fi
142 ret = loop_add(&lo, -1);
144 - mutex_unlock(&loop_ctl_mutex);
145 + mutex_unlock(&loop_index_mutex);
149 @@ -2030,10 +2029,10 @@ static int __init loop_init(void)
150 THIS_MODULE, loop_probe, NULL, NULL);
152 /* pre-create number of devices given by config or max_loop */
153 - mutex_lock(&loop_ctl_mutex);
154 + mutex_lock(&loop_index_mutex);
155 for (i = 0; i < nr; i++)
157 - mutex_unlock(&loop_ctl_mutex);
158 + mutex_unlock(&loop_index_mutex);
160 printk(KERN_INFO "loop: module loaded\n");