]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
Staging: comedi: Allow 'open' driver method to fail
authorIan Abbott <abbotti@mev.co.uk>
Wed, 19 May 2010 13:10:00 +0000 (14:10 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 17 Jun 2010 20:28:56 +0000 (13:28 -0700)
Some comedi drivers should return an error from their 'open' method when
something goes wrong.  Change the prototype of the 'open' method in
'struct comedi_device' to allow this, and change the drivers that use it.
Propagate any error to the 'open' file operation.

The corresponding 'close' method won't be called when the 'open' method
fails, so drivers failing the 'open' need to clean up any mess they
created.

The dt9812 and serial2002 drivers can now return an error on 'open'.
The jr3_pci driver also uses the 'open' method but doesn't fail it.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/comedi/comedi_fops.c
drivers/staging/comedi/comedidev.h
drivers/staging/comedi/drivers/dt9812.c
drivers/staging/comedi/drivers/jr3_pci.c
drivers/staging/comedi/drivers/serial2002.c

index aeb2c00875cd2110117afae796edb95748134e39..14091313cebbe66c419b73453ccd0b158d89c1da 100644 (file)
@@ -1845,8 +1845,15 @@ ok:
                }
        }
 
-       if (dev->attached && dev->use_count == 0 && dev->open)
-               dev->open(dev);
+       if (dev->attached && dev->use_count == 0 && dev->open) {
+               int rc = dev->open(dev);
+               if (rc < 0) {
+                       module_put(dev->driver->module);
+                       module_put(THIS_MODULE);
+                       mutex_unlock(&dev->mutex);
+                       return rc;
+               }
+       }
 
        dev->use_count++;
 
index 4eb2b77f56dc55ef9442e00935094a630742318b..41ef9207f99c6f45258a2139e1fbea16fb8dacdf 100644 (file)
@@ -285,7 +285,7 @@ struct comedi_device {
 
        struct fasync_struct *async_queue;
 
-       void (*open) (struct comedi_device *dev);
+       int (*open) (struct comedi_device *dev);
        void (*close) (struct comedi_device *dev);
 };
 
index 96caae36279c6a642441b47a0a3aa7bf3310d877..d01d2dc79112b8c47dac6216e29446eb775c3f89 100644 (file)
@@ -890,8 +890,10 @@ static struct usb_driver dt9812_usb_driver = {
  * Comedi functions
  */
 
-static void dt9812_comedi_open(struct comedi_device *dev)
+static int dt9812_comedi_open(struct comedi_device *dev)
 {
+       int result = -ENODEV;
+
        down(&devpriv->slot->mutex);
        if (devpriv->slot->usb) {
                /* We have an attached device, fill in current range info */
@@ -934,8 +936,10 @@ static void dt9812_comedi_open(struct comedi_device *dev)
                        }
                        break;
                }
+               result = 0;
        }
        up(&devpriv->slot->mutex);
+       return result;
 }
 
 static int dt9812_di_rinsn(struct comedi_device *dev,
index d330b1886846f866103ba746d2fb93653619258b..4683a0b90f22382ff3c4d099f75b8fb10f4e292e 100644 (file)
@@ -373,7 +373,7 @@ static int jr3_pci_ai_insn_read(struct comedi_device *dev,
        return result;
 }
 
-static void jr3_pci_open(struct comedi_device *dev)
+static int jr3_pci_open(struct comedi_device *dev)
 {
        int i;
        struct jr3_pci_dev_private *devpriv = dev->private;
@@ -388,6 +388,7 @@ static void jr3_pci_open(struct comedi_device *dev)
                               p->channel_no);
                }
        }
+       return 0;
 }
 
 int read_idm_word(const u8 * data, size_t size, int *pos, unsigned int *val)
index 0792617ebc3557c327d5c05f36389c6af1d1ae7d..a4a99b870369b270a6ae7db29c6ff2d89eeca728 100644 (file)
@@ -393,15 +393,16 @@ static void serial_write(struct file *f, struct serial_data data)
        }
 }
 
-static void serial_2002_open(struct comedi_device *dev)
+static int serial_2002_open(struct comedi_device *dev)
 {
+       int result;
        char port[20];
 
        sprintf(port, "/dev/ttyS%d", devpriv->port);
        devpriv->tty = filp_open(port, O_RDWR, 0);
        if (IS_ERR(devpriv->tty)) {
-               printk("serial_2002: file open error = %ld\n",
-                      PTR_ERR(devpriv->tty));
+               result = (int)PTR_ERR(devpriv->tty);
+               printk("serial_2002: file open error = %d\n", result);
        } else {
                struct config_t {
 
@@ -673,7 +674,9 @@ static void serial_2002_open(struct comedi_device *dev)
                                }
                        }
                }
+               result = 0;
        }
+       return result;
 }
 
 static void serial_2002_close(struct comedi_device *dev)