aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/devio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/core/devio.c')
-rw-r--r--drivers/usb/core/devio.c11
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);