Преглед изворни кода

UIO: cdev lock_kernel() pushdown

Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Jonathan Corbet пре 17 година
родитељ
комит
fbc8a81d66
1 измењених фајлова са 12 додато и 5 уклоњено
  1. 12 5
      drivers/uio/uio.c

+ 12 - 5
drivers/uio/uio.c

@@ -297,12 +297,17 @@ static int uio_open(struct inode *inode, struct file *filep)
 	struct uio_listener *listener;
 	struct uio_listener *listener;
 	int ret = 0;
 	int ret = 0;
 
 
+	lock_kernel();
 	idev = idr_find(&uio_idr, iminor(inode));
 	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);
 	listener = kmalloc(sizeof(*listener), GFP_KERNEL);
 	if (!listener) {
 	if (!listener) {
@@ -319,7 +324,7 @@ static int uio_open(struct inode *inode, struct file *filep)
 		if (ret)
 		if (ret)
 			goto err_infoopen;
 			goto err_infoopen;
 	}
 	}
-
+	unlock_kernel();
 	return 0;
 	return 0;
 
 
 err_infoopen:
 err_infoopen:
@@ -329,6 +334,8 @@ err_alloc_listener:
 
 
 	module_put(idev->owner);
 	module_put(idev->owner);
 
 
+out:
+	unlock_kernel();
 	return ret;
 	return ret;
 }
 }