diff options
Diffstat (limited to 'drivers/hid/hidraw.c')
| -rw-r--r-- | drivers/hid/hidraw.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 925992f549f0..8a4b32dca9f7 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -218,9 +218,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]; @@ -233,10 +237,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,  | 
