diff options
author | Marek Szyprowski <m.szyprowski@samsung.com> | 2016-02-18 08:59:26 +0100 |
---|---|---|
committer | Felipe Balbi <balbi@kernel.org> | 2016-02-23 08:51:37 +0200 |
commit | 7b0a271d5cadf5fbb5a9c7cb868776af2a2c248c (patch) | |
tree | 1fb5ea768329098b575f077ff0b450a3e87fb5c0 /drivers/usb/gadget/legacy | |
parent | 31b994a4986dcdd664c597afcef2c0918763019a (diff) | |
download | linux-stable-7b0a271d5cadf5fbb5a9c7cb868776af2a2c248c.tar.gz linux-stable-7b0a271d5cadf5fbb5a9c7cb868776af2a2c248c.tar.bz2 linux-stable-7b0a271d5cadf5fbb5a9c7cb868776af2a2c248c.zip |
usb: gadget: gadgetfs: unregister gadget only if it got successfully registered
Gadgetfs driver called usb_gadget_unregister_driver unconditionally, even
if it didn't register it earlier due to other failures. This patch fixes
this.
Reported-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Vegard Nossum <vegard.nossum@oracle.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Diffstat (limited to 'drivers/usb/gadget/legacy')
-rw-r--r-- | drivers/usb/gadget/legacy/inode.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index 7e179f81d05c..87fb0fd6aaab 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -130,7 +130,8 @@ struct dev_data { setup_can_stall : 1, setup_out_ready : 1, setup_out_error : 1, - setup_abort : 1; + setup_abort : 1, + gadget_registered : 1; unsigned setup_wLength; /* the rest is basically write-once */ @@ -1179,7 +1180,8 @@ dev_release (struct inode *inode, struct file *fd) /* closing ep0 === shutdown all */ - usb_gadget_unregister_driver (&gadgetfs_driver); + if (dev->gadget_registered) + usb_gadget_unregister_driver (&gadgetfs_driver); /* at this point "good" hardware has disconnected the * device from USB; the host won't see it any more. @@ -1847,6 +1849,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) * kick in after the ep0 descriptor is closed. */ value = len; + dev->gadget_registered = true; } return value; |