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 --
| Linus Torvalds | Re: [GIT]: Networking |
| Mark Lord | Re: [Bug #10391] 2.6.25-rc7/8: Another resume regression |
| David Miller | Slow DOWN, please!!! |
| James Bottomley | [Ksummit-2008-discuss] Fixing the Kernel Janitors project |
git: | |
| Ittay Dror | detecting rename->commit->modify->commit |
| Peter Stahlir | Git as a filesystem |
| Junio C Hamano | [ANNOUNCE] GIT 1.5.4 |
| Andreas Hildebrandt | CVS-$Id:$ replacement in git? |
| Gilles Chehade | Re: Real men don't attack straw men |
| carlopmart | About Xen: maybe a reiterative question but .. |
| Christophe Rioux | OpenBSD as host for VMWare Server |
| Kevin Neff | Patching a SSH 'Weakness' |
| David Miller | Re: [BUG] New Kernel Bugs |
| Pavel Emelyanov | [PATCH 4/5] Mark the setup_net as __net_init |
| Chris Snook | [PATCH 0/4] atlx: add atl2 support |
| Jeff Garzik | Re: [RFC][PATCH 1/1] cxgb3i: cxgb3 iSCSI initiator |
| high memory | 5 hours ago | Linux kernel |
| semaphore access speed | 8 hours ago | Applications and Utilities |
| the kernel how to power off the machine | 9 hours ago | Linux kernel |
| Easter Eggs in windows XP | 12 hours ago | Windows |
| Shared swap partition | 12 hours ago | Linux general |
| Root password | 13 hours ago | Linux general |
| Where/when DNOTIFY is used? | 15 hours ago | Linux kernel |
| How to convert Linux Kernel built-in module into a loadable module | 17 hours ago | Linux kernel |
| Linux 2.6.24 and I/O schedulers | 17 hours ago | Linux kernel |
| USB Driver -- Interrupt Polling -- A Little Help Please | 23 hours ago | Linux general |
