diff options
Diffstat (limited to 'drivers/hid/hidraw.c')
| -rw-r--r-- | drivers/hid/hidraw.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index 93e62b161501..e63c56a0d57f 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c @@ -272,7 +272,12 @@ static int hidraw_open(struct inode *inode, struct file *file)  		goto out;  	} -	down_read(&minors_rwsem); +	/* +	 * Technically not writing to the hidraw_table but a write lock is +	 * required to protect the device refcount. This is symmetrical to +	 * hidraw_release(). +	 */ +	down_write(&minors_rwsem);  	if (!hidraw_table[minor] || !hidraw_table[minor]->exist) {  		err = -ENODEV;  		goto out_unlock; @@ -301,7 +306,7 @@ static int hidraw_open(struct inode *inode, struct file *file)  	spin_unlock_irqrestore(&hidraw_table[minor]->list_lock, flags);  	file->private_data = list;  out_unlock: -	up_read(&minors_rwsem); +	up_write(&minors_rwsem);  out:  	if (err < 0)  		kfree(list);  |