|
@@ -212,9 +212,13 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
|
|
unsigned int minor = iminor(inode);
|
|
|
struct hidraw *dev;
|
|
|
struct hidraw_list *list = file->private_data;
|
|
|
+ int ret;
|
|
|
|
|
|
- if (!hidraw_table[minor])
|
|
|
- return -ENODEV;
|
|
|
+ mutex_lock(&minors_lock);
|
|
|
+ if (!hidraw_table[minor]) {
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto unlock;
|
|
|
+ }
|
|
|
|
|
|
list_del(&list->node);
|
|
|
dev = hidraw_table[minor];
|
|
@@ -227,10 +231,12 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
|
|
kfree(list->hidraw);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
kfree(list);
|
|
|
+ ret = 0;
|
|
|
+unlock:
|
|
|
+ mutex_unlock(&minors_lock);
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static long hidraw_ioctl(struct file *file, unsigned int cmd,
|