From: Jonathan Corbet Date: Thu, 15 May 2008 16:39:37 +0000 (-0600) Subject: UIO: cdev lock_kernel() pushdown X-Git-Tag: v2.6.27-rc1~1103^2~130 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fbc8a81d66bbbce3f0b4d5752f8bc8bb3c1fc439;p=linux-2.6 UIO: cdev lock_kernel() pushdown Signed-off-by: Jonathan Corbet --- diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index 55cc7b8042..1a0415e77a 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -297,12 +297,17 @@ static int uio_open(struct inode *inode, struct file *filep) struct uio_listener *listener; int ret = 0; + lock_kernel(); idev = idr_find(&uio_idr, iminor(inode)); - if (!idev) - return -ENODEV; + if (!idev) { + ret = -ENODEV; + goto out; + } - if (!try_module_get(idev->owner)) - return -ENODEV; + if (!try_module_get(idev->owner)) { + ret = -ENODEV; + goto out; + } listener = kmalloc(sizeof(*listener), GFP_KERNEL); if (!listener) { @@ -319,7 +324,7 @@ static int uio_open(struct inode *inode, struct file *filep) if (ret) goto err_infoopen; } - + unlock_kernel(); return 0; err_infoopen: @@ -329,6 +334,8 @@ err_alloc_listener: module_put(idev->owner); +out: + unlock_kernel(); return ret; }