Commit 2bea2e4abf2fe8bc7384103aeaad91089109cfba
Exists in
master
and in
4 other branches
Merge branch 'bkl-removal' of git://git.lwn.net/linux-2.6
* 'bkl-removal' of git://git.lwn.net/linux-2.6: UIO: BKL removal
Showing 1 changed file Side-by-side Diff
drivers/uio/uio.c
... | ... | @@ -47,6 +47,9 @@ |
47 | 47 | struct class *class; |
48 | 48 | } *uio_class; |
49 | 49 | |
50 | +/* Protect idr accesses */ | |
51 | +static DEFINE_MUTEX(minor_lock); | |
52 | + | |
50 | 53 | /* |
51 | 54 | * attributes |
52 | 55 | */ |
... | ... | @@ -239,7 +242,6 @@ |
239 | 242 | |
240 | 243 | static int uio_get_minor(struct uio_device *idev) |
241 | 244 | { |
242 | - static DEFINE_MUTEX(minor_lock); | |
243 | 245 | int retval = -ENOMEM; |
244 | 246 | int id; |
245 | 247 | |
246 | 248 | |
... | ... | @@ -261,7 +263,9 @@ |
261 | 263 | |
262 | 264 | static void uio_free_minor(struct uio_device *idev) |
263 | 265 | { |
266 | + mutex_lock(&minor_lock); | |
264 | 267 | idr_remove(&uio_idr, idev->minor); |
268 | + mutex_unlock(&minor_lock); | |
265 | 269 | } |
266 | 270 | |
267 | 271 | /** |
268 | 272 | |
... | ... | @@ -305,8 +309,9 @@ |
305 | 309 | struct uio_listener *listener; |
306 | 310 | int ret = 0; |
307 | 311 | |
308 | - lock_kernel(); | |
312 | + mutex_lock(&minor_lock); | |
309 | 313 | idev = idr_find(&uio_idr, iminor(inode)); |
314 | + mutex_unlock(&minor_lock); | |
310 | 315 | if (!idev) { |
311 | 316 | ret = -ENODEV; |
312 | 317 | goto out; |
313 | 318 | |
314 | 319 | |
315 | 320 | |
316 | 321 | |
... | ... | @@ -332,18 +337,15 @@ |
332 | 337 | if (ret) |
333 | 338 | goto err_infoopen; |
334 | 339 | } |
335 | - unlock_kernel(); | |
336 | 340 | return 0; |
337 | 341 | |
338 | 342 | err_infoopen: |
339 | - | |
340 | 343 | kfree(listener); |
341 | -err_alloc_listener: | |
342 | 344 | |
345 | +err_alloc_listener: | |
343 | 346 | module_put(idev->owner); |
344 | 347 | |
345 | 348 | out: |
346 | - unlock_kernel(); | |
347 | 349 | return ret; |
348 | 350 | } |
349 | 351 |