Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[pandora-kernel.git] / drivers / hid / hid-roccat.c
index 5666e75..56ce12c 100644 (file)
@@ -162,27 +162,27 @@ static int roccat_open(struct inode *inode, struct file *file)
 
        device = devices[minor];
 
-       mutex_lock(&device->readers_lock);
-
        if (!device) {
                pr_emerg("roccat device with minor %d doesn't exist\n", minor);
                error = -ENODEV;
-               goto exit_err;
+               goto exit_err_devices;
        }
 
+       mutex_lock(&device->readers_lock);
+
        if (!device->open++) {
                /* power on device on adding first reader */
                error = hid_hw_power(device->hid, PM_HINT_FULLON);
                if (error < 0) {
                        --device->open;
-                       goto exit_err;
+                       goto exit_err_readers;
                }
 
                error = hid_hw_open(device->hid);
                if (error < 0) {
                        hid_hw_power(device->hid, PM_HINT_NORMAL);
                        --device->open;
-                       goto exit_err;
+                       goto exit_err_readers;
                }
        }
 
@@ -193,13 +193,13 @@ static int roccat_open(struct inode *inode, struct file *file)
        list_add_tail(&reader->node, &device->readers);
        file->private_data = reader;
 
-exit_unlock:
+exit_err_readers:
        mutex_unlock(&device->readers_lock);
+exit_err_devices:
        mutex_unlock(&devices_lock);
+       if (error)
+               kfree(reader);
        return error;
-exit_err:
-       kfree(reader);
-       goto exit_unlock;
 }
 
 static int roccat_release(struct inode *inode, struct file *file)