staging: comedi: use refcount while reading /proc/comedi
authorIan Abbott <abbotti@mev.co.uk>
Fri, 8 Nov 2013 15:03:36 +0000 (15:03 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Nov 2013 00:16:44 +0000 (16:16 -0800)
In the seq_file 'show' handler for "/proc/comedi" - `comedi_read()` in
"comedi/proc.c",  call `comedi_dev_get_from_minor()` instead of
`comedi_dev_from_minor()` to increment the reference counter for the
`struct comedi_device` while it is being examined.  Call
`comedi_dev_put()` to decrement the reference afterwards.  Also acquire
the `attach_lock` rwsem while checking whether the device is attached.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/proc.c

index ade00035d3bb5863cb2fe5b1fd29581b2e0b8aa6..da6bc5855ebc5e08530515cfb8799dbaeb4deaa6 100644 (file)
@@ -41,16 +41,20 @@ static int comedi_read(struct seq_file *m, void *v)
                     "driver_name, board_name, n_subdevices");
 
        for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) {
-               struct comedi_device *dev = comedi_dev_from_minor(i);
+               struct comedi_device *dev = comedi_dev_get_from_minor(i);
+
                if (!dev)
                        continue;
 
+               down_read(&dev->attach_lock);
                if (dev->attached) {
                        devices_q = 1;
                        seq_printf(m, "%2d: %-20s %-20s %4d\n",
                                   i, dev->driver->driver_name,
                                   dev->board_name, dev->n_subdevices);
                }
+               up_read(&dev->attach_lock);
+               comedi_dev_put(dev);
        }
        if (!devices_q)
                seq_puts(m, "no devices\n");