staging: comedi: adjust module count on device cleanup
authorIan Abbott <abbotti@mev.co.uk>
Thu, 4 Apr 2013 13:58:45 +0000 (14:58 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Apr 2013 21:33:16 +0000 (14:33 -0700)
`comedi_device_cleanup()` is called just before freeing a comedi device.
It is possible for the device to still be open in which case the module
reference counts for the core comedi module and possibly the low-level
driver module will remain out of whack because `comedi_close()` will not
find the comedi device and so will not decrement the module counts.

This really needs to be handled better, but for now decrement the module
counts in `comedi_device_cleanup()` according to the number of
outstanding opens.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Reviewed-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/comedi_fops.c

index f2bfa0efcf74688d00d519d5935a47f7e40aca5f..70b2034116fcdc5705001f9df29aafe457390dd7 100644 (file)
@@ -2256,10 +2256,20 @@ static void comedi_device_init(struct comedi_device *dev)
 
 static void comedi_device_cleanup(struct comedi_device *dev)
 {
+       struct module *driver_module = NULL;
+
        if (dev == NULL)
                return;
        mutex_lock(&dev->mutex);
+       if (dev->attached)
+               driver_module = dev->driver->module;
        comedi_device_detach(dev);
+       while (dev->use_count > 0) {
+               if (driver_module)
+                       module_put(driver_module);
+               module_put(THIS_MODULE);
+               dev->use_count--;
+       }
        mutex_unlock(&dev->mutex);
        mutex_destroy(&dev->mutex);
 }