[PATCH 1/4 v2] UIO: hold a reference to the device's owner while the device is open

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Hans J. Koch <hjk@...>
Cc: Greg Kroah-Hartman <gregkh@...>, <linux-kernel@...>
Date: Friday, April 11, 2008 - 5:07 am

Otherwise the device might just disappear while /dev/uioX is being used
which results in an Oops.

Signed-off-by: Uwe Kleine-König <Uwe.Kleine-Koenig@digi.com>
---

Hans J. Koch wrote:
That thing about code reordering is minor compared to having all error
handling in one place, but ...

... , it's your code, so you can find a new version below.

Best regards
Uwe

 drivers/uio/uio.c |   36 +++++++++++++++++++++---------------
 1 files changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 1175908..55cc7b8 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -301,23 +301,33 @@ static int uio_open(struct inode *inode, struct file *filep)
 	if (!idev)
 		return -ENODEV;
 
+	if (!try_module_get(idev->owner))
+		return -ENODEV;
+
 	listener = kmalloc(sizeof(*listener), GFP_KERNEL);
-	if (!listener)
-		return -ENOMEM;
+	if (!listener) {
+		ret = -ENOMEM;
+		goto err_alloc_listener;
+	}
 
 	listener->dev = idev;
 	listener->event_count = atomic_read(&idev->event);
 	filep->private_data = listener;
 
 	if (idev->info->open) {
-		if (!try_module_get(idev->owner))
-			return -ENODEV;
 		ret = idev->info->open(idev->info, inode);
-		module_put(idev->owner);
+		if (ret)
+			goto err_infoopen;
 	}
 
-	if (ret)
-		kfree(listener);
+	return 0;
+
+err_infoopen:
+
+	kfree(listener);
+err_alloc_listener:
+
+	module_put(idev->owner);
 
 	return ret;
 }
@@ -336,12 +346,11 @@ static int uio_release(struct inode *inode, struct file *filep)
 	struct uio_listener *listener = filep->private_data;
 	struct uio_device *idev = listener->dev;
 
-	if (idev->info->release) {
-		if (!try_module_get(idev->owner))
-			return -ENODEV;
+	if (idev->info->release)
 		ret = idev->info->release(idev->info, inode);
-		module_put(idev->owner);
-	}
+
+	module_put(idev->owner);
+
 	if (filep->f_flags & FASYNC)
 		ret = uio_fasync(-1, filep, 0);
 	kfree(listener);
@@ -510,10 +519,7 @@ static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
 		return -EINVAL;
 
 	if (idev->info->mmap) {
-		if (!try_module_get(idev->owner))
-			return -ENODEV;
 		ret = idev->info->mmap(idev->info, vma);
-		module_put(idev->owner);
 		return ret;
 	}
 
-- 
1.5.4.5


-- 
Uwe Kleine-König, Software Engineer
Digi International GmbH Branch Breisach, Küferstrasse 8, 79206 Breisach, Germany
Tax: 315/5781/0242 / VAT: DE153662976 / Reg. Amtsgericht Dortmund HRB 13962
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 0/4] UIO: fixes, cleanups and a new driver, Uwe Kleine-König, (Thu Apr 10, 8:36 am)
Re: [PATCH 0/3] UIO: cleanup and platform driver, Hans J. Koch, (Tue Apr 22, 9:39 am)
[PATCH 1/3] UIO: don't let UIO_CIF and UIO_SMX depend twice ..., Uwe Kleine-König, (Tue Apr 22, 5:52 am)
[PATCH 2/3] provide a dummy implementation of the clk API, Uwe Kleine-König, (Tue Apr 22, 5:52 am)
[PATCH 3/3] UIO: generic platform driver, Uwe Kleine-König, (Tue Apr 22, 5:52 am)
Re: [PATCH 3/3] UIO: generic platform driver, Hans J. Koch, (Sun Apr 27, 1:12 pm)
[PATCH] UIO: don't let UIO_CIF and UIO_SMX depend twice on UIO, Uwe Kleine-König, (Tue May 20, 5:24 am)
[PATCH] UIO: generic platform driver, Uwe Kleine-König, (Tue May 20, 5:24 am)
Re: [PATCH] UIO: generic platform driver, Hans J. Koch, (Tue May 20, 5:08 pm)
Re: [PATCH] UIO: generic platform driver, Uwe , (Mon May 26, 1:58 am)
Re: [PATCH] UIO: generic platform driver, Greg KH, (Mon May 26, 2:02 am)
Re: [PATCH] UIO: generic platform driver, Uwe , (Fri May 30, 5:16 am)
Re: [PATCH] UIO: generic platform driver, Greg KH, (Fri May 30, 12:35 pm)
Re: [PATCH] UIO: generic platform driver, Uwe , (Tue Jun 3, 3:21 am)
Re: [PATCH] UIO: generic platform driver, Hans J. Koch, (Tue Jun 3, 5:24 am)
Re: [PATCH 3/3] UIO: generic platform driver, Ben Nizette, (Tue Apr 22, 6:26 am)
Re: [PATCH 3/3] UIO: generic platform driver, Hans J. Koch, (Tue Apr 22, 9:35 am)
[PATCH 1/4] UIO: hold a reference to the device's owner whil..., Uwe Kleine-König, (Thu Apr 10, 8:37 am)
[PATCH 1/4 v2] UIO: hold a reference to the device's owner w..., Uwe , (Fri Apr 11, 5:07 am)
[PATCH 2/4] UIO: use menuconfig, Uwe Kleine-König, (Thu Apr 10, 8:37 am)
Re: [PATCH 2/4] UIO: use menuconfig, Hans J. Koch, (Thu Apr 10, 3:39 pm)
Re: [PATCH 2/4] UIO: use menuconfig, Greg KH, (Fri Apr 11, 5:36 pm)
Re: [PATCH 2/4] UIO: use menuconfig, Hans J. Koch, (Fri Apr 11, 6:58 pm)
[PATCH 3/4] UIO: wrap all uio drivers in "if UIO" and "endif", Uwe Kleine-König, (Thu Apr 10, 8:37 am)
[PATCH 4/4] [RFC] UIO: generic platform driver, Uwe Kleine-König, (Thu Apr 10, 8:37 am)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Hans J. Koch, (Thu Apr 10, 6:48 pm)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Hans J. Koch, (Fri Apr 11, 5:24 am)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Hans J. Koch, (Fri Apr 11, 3:59 pm)
Re: [PATCH 4/4 v2] [RFC] UIO: generic platform driver, Hans J. Koch, (Fri Apr 11, 6:54 pm)
Re: [PATCH 4/4 v2] [RFC] UIO: generic platform driver, Hans J. Koch, (Fri Apr 11, 6:33 am)
Re: [PATCH 4/4 v2] [RFC] UIO: generic platform driver, Hans J. Koch, (Fri Apr 11, 7:17 am)
Re: [PATCH 4/4 v2] [RFC] UIO: generic platform driver, Russell King - ARM Linux, (Sat Apr 12, 9:16 am)
Re: [PATCH] Re: [PATCH 4/4 v2] [RFC] UIO: generic platform d..., Russell King - ARM Linux, (Mon Apr 14, 5:37 am)
Re: [PATCH] Re: [PATCH 4/4 v2] [RFC] UIO: generic platform d..., Russell King - ARM Linux, (Mon Apr 14, 6:17 am)
Re: [PATCH] Re: [PATCH 4/4 v2] [RFC] UIO: generic platform d..., Russell King - ARM Linux, (Mon Apr 14, 7:37 am)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Hans J. Koch, (Thu Apr 10, 3:54 pm)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Hans J. Koch, (Thu Apr 10, 5:17 pm)
Re: [PATCH 4/4] [RFC] UIO: generic platform driver, Ben Nizette, (Thu Apr 10, 9:34 pm)