|
@@ -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)
|