diff options
Diffstat (limited to 'drivers/usb/core/devio.c')
-rw-r--r-- | drivers/usb/core/devio.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 43c08724a2d8..fd345ad810f8 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -558,10 +558,12 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
558 | dev = usbdev_lookup_minor(iminor(inode)); | 558 | dev = usbdev_lookup_minor(iminor(inode)); |
559 | if (!dev) | 559 | if (!dev) |
560 | dev = inode->i_private; | 560 | dev = inode->i_private; |
561 | if (!dev) { | 561 | if (!dev) |
562 | kfree(ps); | ||
563 | goto out; | 562 | goto out; |
564 | } | 563 | ret = usb_autoresume_device(dev, 1); |
564 | if (ret) | ||
565 | goto out; | ||
566 | |||
565 | usb_get_dev(dev); | 567 | usb_get_dev(dev); |
566 | ret = 0; | 568 | ret = 0; |
567 | ps->dev = dev; | 569 | ps->dev = dev; |
@@ -581,6 +583,8 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
581 | list_add_tail(&ps->list, &dev->filelist); | 583 | list_add_tail(&ps->list, &dev->filelist); |
582 | file->private_data = ps; | 584 | file->private_data = ps; |
583 | out: | 585 | out: |
586 | if (ret) | ||
587 | kfree(ps); | ||
584 | mutex_unlock(&usbfs_mutex); | 588 | mutex_unlock(&usbfs_mutex); |
585 | return ret; | 589 | return ret; |
586 | } | 590 | } |
@@ -604,6 +608,7 @@ static int usbdev_release(struct inode *inode, struct file *file) | |||
604 | releaseintf(ps, ifnum); | 608 | releaseintf(ps, ifnum); |
605 | } | 609 | } |
606 | destroy_all_async(ps); | 610 | destroy_all_async(ps); |
611 | usb_autosuspend_device(dev, 1); | ||
607 | usb_unlock_device(dev); | 612 | usb_unlock_device(dev); |
608 | usb_put_dev(dev); | 613 | usb_put_dev(dev); |
609 | kfree(ps); | 614 | kfree(ps); |