USB: fix autosuspend race in skeleton driver
as the skeleton driver was made ready for autosuspend a race condition was introduced. The reference to get device must be gotten before the autosuspend counter is upped, as this operation may sleep, dropping BKL. Dropping BKL means that the pointer to the device may become invalid. Here's the fix. Signed-off-by: Oliver Neukum <oneukum@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
57e4f041bf
commit
5b06470816
1 changed files with 7 additions and 5 deletions
|
@ -90,14 +90,16 @@ static int skel_open(struct inode *inode, struct file *file)
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* prevent the device from being autosuspended */
|
|
||||||
retval = usb_autopm_get_interface(interface);
|
|
||||||
if (retval)
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
/* increment our usage count for the device */
|
/* increment our usage count for the device */
|
||||||
kref_get(&dev->kref);
|
kref_get(&dev->kref);
|
||||||
|
|
||||||
|
/* prevent the device from being autosuspended */
|
||||||
|
retval = usb_autopm_get_interface(interface);
|
||||||
|
if (retval) {
|
||||||
|
kref_put(&dev->kref, skel_delete);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
/* save our object in the file's private structure */
|
/* save our object in the file's private structure */
|
||||||
file->private_data = dev;
|
file->private_data = dev;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue