Input: fix open count handling in input interfaces
authorOliver Neukum <oliver@neukum.org>
Fri, 12 Oct 2007 18:18:40 +0000 (14:18 -0400)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 12 Oct 2007 18:18:40 +0000 (14:18 -0400)
If input_open_device() fails we should not leave interfaces marked
as  opened.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/evdev.c
drivers/input/joydev.c
drivers/input/mousedev.c
drivers/input/tsdev.c

index bfee4f9..d404aa8 100644 (file)
@@ -192,8 +192,11 @@ static int evdev_open_device(struct evdev *evdev)
 
        if (!evdev->exist)
                retval = -ENODEV;
-       else if (!evdev->open++)
+       else if (!evdev->open++) {
                retval = input_open_device(&evdev->handle);
+               if (retval)
+                       evdev->open--;
+       }
 
        mutex_unlock(&evdev->mutex);
        return retval;
index a4272d6..f306c97 100644 (file)
@@ -205,8 +205,11 @@ static int joydev_open_device(struct joydev *joydev)
 
        if (!joydev->exist)
                retval = -ENODEV;
-       else if (!joydev->open++)
+       else if (!joydev->open++) {
                retval = input_open_device(&joydev->handle);
+               if (retval)
+                       joydev->open--;
+       }
 
        mutex_unlock(&joydev->mutex);
        return retval;
index 715def7..cc36edb 100644 (file)
@@ -428,8 +428,11 @@ static int mousedev_open_device(struct mousedev *mousedev)
                mixdev_open_devices();
        else if (!mousedev->exist)
                retval = -ENODEV;
-       else if (!mousedev->open++)
+       else if (!mousedev->open++) {
                retval = input_open_device(&mousedev->handle);
+               if (retval)
+                       mousedev->open--;
+       }
 
        mutex_unlock(&mousedev->mutex);
        return retval;
index c189f1d..1202334 100644 (file)
@@ -185,8 +185,11 @@ static int tsdev_open_device(struct tsdev *tsdev)
 
        if (!tsdev->exist)
                retval = -ENODEV;
-       else if (!tsdev->open++)
+       else if (!tsdev->open++) {
                retval = input_open_device(&tsdev->handle);
+               if (retval)
+                       tsdev->open--;
+       }
 
        mutex_unlock(&tsdev->mutex);
        return retval;