[PATCH 04/37] staging: comedi: adjust module count on device cleanup

Ian Abbott abbotti at mev.co.uk
Thu Apr 4 13:58:45 UTC 2013


`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 at mev.co.uk>
---
 drivers/staging/comedi/comedi_fops.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
index f2bfa0e..70b2034 100644
--- a/drivers/staging/comedi/comedi_fops.c
+++ b/drivers/staging/comedi/comedi_fops.c
@@ -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);
 }
-- 
1.8.1.5




More information about the devel mailing list