Commit fbc8a81d66bbbce3f0b4d5752f8bc8bb3c1fc439

Authored by Jonathan Corbet
1 parent 2edbf8537e

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

... ... @@ -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