]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Staging: comedi: unlock on error in usbdux_ao_inttrig()
authorDan Carpenter <dan.carpenter@oracle.com>
Wed, 30 Nov 2011 08:42:21 +0000 (11:42 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 8 Dec 2011 20:29:39 +0000 (12:29 -0800)
If we had an invalid trignum (anything other than zero is invalid) then
we returned without unlocking.  I've modified this function to just have
one return point.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/comedi/drivers/usbduxsigma.c

index a8fea9a9173349799c0f2f629d23ce30412cf356..f4025b60cd3fc21224bd582c33a87843501216ff 100644 (file)
@@ -1523,15 +1523,17 @@ static int usbdux_ao_inttrig(struct comedi_device *dev,
                return -EFAULT;
 
        down(&this_usbduxsub->sem);
+
        if (!(this_usbduxsub->probed)) {
-               up(&this_usbduxsub->sem);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto out;
        }
        if (trignum != 0) {
                dev_err(&this_usbduxsub->interface->dev,
                        "comedi%d: usbdux_ao_inttrig: invalid trignum\n",
                        dev->minor);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto out;
        }
        if (!(this_usbduxsub->ao_cmd_running)) {
                this_usbduxsub->ao_cmd_running = 1;
@@ -1541,8 +1543,7 @@ static int usbdux_ao_inttrig(struct comedi_device *dev,
                                "comedi%d: usbdux_ao_inttrig: submitURB: "
                                "err=%d\n", dev->minor, ret);
                        this_usbduxsub->ao_cmd_running = 0;
-                       up(&this_usbduxsub->sem);
-                       return ret;
+                       goto out;
                }
                s->async->inttrig = NULL;
        } else {
@@ -1550,8 +1551,10 @@ static int usbdux_ao_inttrig(struct comedi_device *dev,
                        "comedi%d: ao_inttrig but acqu is already running.\n",
                        dev->minor);
        }
+       ret = 1;
+out:
        up(&this_usbduxsub->sem);
-       return 1;
+       return ret;
 }
 
 static int usbdux_ao_cmdtest(struct comedi_device *dev,