Commit fbc8a81d66bbbce3f0b4d5752f8bc8bb3c1fc439
1 parent
2edbf8537e
Exists in
master
and in
4 other branches
UIO: cdev lock_kernel() pushdown
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Showing 1 changed file with 12 additions and 5 deletions Side-by-side Diff
drivers/uio/uio.c
... | ... | @@ -297,12 +297,17 @@ |
297 | 297 | struct uio_listener *listener; |
298 | 298 | int ret = 0; |
299 | 299 | |
300 | + lock_kernel(); | |
300 | 301 | idev = idr_find(&uio_idr, iminor(inode)); |
301 | - if (!idev) | |
302 | - return -ENODEV; | |
302 | + if (!idev) { | |
303 | + ret = -ENODEV; | |
304 | + goto out; | |
305 | + } | |
303 | 306 | |
304 | - if (!try_module_get(idev->owner)) | |
305 | - return -ENODEV; | |
307 | + if (!try_module_get(idev->owner)) { | |
308 | + ret = -ENODEV; | |
309 | + goto out; | |
310 | + } | |
306 | 311 | |
307 | 312 | listener = kmalloc(sizeof(*listener), GFP_KERNEL); |
308 | 313 | if (!listener) { |
... | ... | @@ -319,7 +324,7 @@ |
319 | 324 | if (ret) |
320 | 325 | goto err_infoopen; |
321 | 326 | } |
322 | - | |
327 | + unlock_kernel(); | |
323 | 328 | return 0; |
324 | 329 | |
325 | 330 | err_infoopen: |
... | ... | @@ -329,6 +334,8 @@ |
329 | 334 | |
330 | 335 | module_put(idev->owner); |
331 | 336 | |
337 | +out: | |
338 | + unlock_kernel(); | |
332 | 339 | return ret; |
333 | 340 | } |
334 | 341 |