]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - queue-4.9/revert-loop-get-rid-of-loop_index_mutex.patch
b9ec9a7058ef46fefe40504b407b4fc36aa610ac
[thirdparty/kernel/stable-queue.git] / queue-4.9 / revert-loop-get-rid-of-loop_index_mutex.patch
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"
5
6 From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
7
8 This reverts commit 6a8f1d8d701462937ce01a3f2219af5435372af7 which is
9 commit 0a42e99b58a208839626465af194cfe640ef9493 upstream.
10
11 It does not work properly in the 4.9.y tree and causes more problems
12 than it fixes, so revert it.
13
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>
18 ---
19 drivers/block/loop.c | 39 +++++++++++++++++++--------------------
20 1 file changed, 19 insertions(+), 20 deletions(-)
21
22 --- a/drivers/block/loop.c
23 +++ b/drivers/block/loop.c
24 @@ -81,6 +81,7 @@
25 #include <asm/uaccess.h>
26
27 static DEFINE_IDR(loop_index_idr);
28 +static DEFINE_MUTEX(loop_index_mutex);
29 static DEFINE_MUTEX(loop_ctl_mutex);
30
31 static int max_part;
32 @@ -1559,11 +1560,9 @@ static int lo_compat_ioctl(struct block_
33 static int lo_open(struct block_device *bdev, fmode_t mode)
34 {
35 struct loop_device *lo;
36 - int err;
37 + int err = 0;
38
39 - err = mutex_lock_killable(&loop_ctl_mutex);
40 - if (err)
41 - return err;
42 + mutex_lock(&loop_index_mutex);
43 lo = bdev->bd_disk->private_data;
44 if (!lo) {
45 err = -ENXIO;
46 @@ -1572,7 +1571,7 @@ static int lo_open(struct block_device *
47
48 atomic_inc(&lo->lo_refcnt);
49 out:
50 - mutex_unlock(&loop_ctl_mutex);
51 + mutex_unlock(&loop_index_mutex);
52 return err;
53 }
54
55 @@ -1581,11 +1580,12 @@ static void lo_release(struct gendisk *d
56 struct loop_device *lo;
57 int err;
58
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))
63 - goto out_unlock;
64 + goto unlock_index;
65
66 + mutex_lock(&loop_ctl_mutex);
67 if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
68 /*
69 * In autoclear mode, stop the loop thread
70 @@ -1593,7 +1593,7 @@ static void lo_release(struct gendisk *d
71 */
72 err = loop_clr_fd(lo);
73 if (!err)
74 - return;
75 + goto unlock_index;
76 } else {
77 /*
78 * Otherwise keep thread (if running) and config,
79 @@ -1602,8 +1602,9 @@ static void lo_release(struct gendisk *d
80 loop_flush(lo);
81 }
82
83 -out_unlock:
84 mutex_unlock(&loop_ctl_mutex);
85 +unlock_index:
86 + mutex_unlock(&loop_index_mutex);
87 }
88
89 static const struct block_device_operations lo_fops = {
90 @@ -1889,7 +1890,7 @@ static struct kobject *loop_probe(dev_t
91 struct kobject *kobj;
92 int err;
93
94 - mutex_lock(&loop_ctl_mutex);
95 + mutex_lock(&loop_index_mutex);
96 err = loop_lookup(&lo, MINOR(dev) >> part_shift);
97 if (err < 0)
98 err = loop_add(&lo, MINOR(dev) >> part_shift);
99 @@ -1897,7 +1898,7 @@ static struct kobject *loop_probe(dev_t
100 kobj = NULL;
101 else
102 kobj = get_disk(lo->lo_disk);
103 - mutex_unlock(&loop_ctl_mutex);
104 + mutex_unlock(&loop_index_mutex);
105
106 *part = 0;
107 return kobj;
108 @@ -1907,13 +1908,9 @@ static long loop_control_ioctl(struct fi
109 unsigned long parm)
110 {
111 struct loop_device *lo;
112 - int ret;
113 -
114 - ret = mutex_lock_killable(&loop_ctl_mutex);
115 - if (ret)
116 - return ret;
117 + int ret = -ENOSYS;
118
119 - ret = -ENOSYS;
120 + mutex_lock(&loop_index_mutex);
121 switch (cmd) {
122 case LOOP_CTL_ADD:
123 ret = loop_lookup(&lo, parm);
124 @@ -1927,6 +1924,7 @@ static long loop_control_ioctl(struct fi
125 ret = loop_lookup(&lo, parm);
126 if (ret < 0)
127 break;
128 + mutex_lock(&loop_ctl_mutex);
129 if (lo->lo_state != Lo_unbound) {
130 ret = -EBUSY;
131 mutex_unlock(&loop_ctl_mutex);
132 @@ -1938,6 +1936,7 @@ static long loop_control_ioctl(struct fi
133 break;
134 }
135 lo->lo_disk->private_data = NULL;
136 + mutex_unlock(&loop_ctl_mutex);
137 idr_remove(&loop_index_idr, lo->lo_number);
138 loop_remove(lo);
139 break;
140 @@ -1947,7 +1946,7 @@ static long loop_control_ioctl(struct fi
141 break;
142 ret = loop_add(&lo, -1);
143 }
144 - mutex_unlock(&loop_ctl_mutex);
145 + mutex_unlock(&loop_index_mutex);
146
147 return ret;
148 }
149 @@ -2030,10 +2029,10 @@ static int __init loop_init(void)
150 THIS_MODULE, loop_probe, NULL, NULL);
151
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++)
156 loop_add(&lo, i);
157 - mutex_unlock(&loop_ctl_mutex);
158 + mutex_unlock(&loop_index_mutex);
159
160 printk(KERN_INFO "loop: module loaded\n");
161 return 0;