]> Pileus Git - ~andy/linux/blobdiff - drivers/hid/hid-roccat.c
Merge branch 'modsplit-Oct31_2011' of git://git.kernel.org/pub/scm/linux/kernel/git...
[~andy/linux] / drivers / hid / hid-roccat.c
index 2596321bab07c0b4278b8f61c0479d9200bb2372..b685b04dbf9dec295c3842930df65a6a542d8193 100644 (file)
@@ -163,27 +163,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;
                }
        }
 
@@ -194,13 +194,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)