usb: gadget: ffs: call functionfs_unbind() if _ffs_func_bind() fails
authorRobert Baldyga <r.baldyga@samsung.com>
Mon, 13 Jul 2015 09:03:50 +0000 (11:03 +0200)
committerFelipe Balbi <balbi@ti.com>
Fri, 31 Jul 2015 13:57:57 +0000 (08:57 -0500)
Function ffs_do_functionfs_bind() calls functionfs_bind() which allocates
usb request and increments refcounts. These things needs to be cleaned
up by if further steps of initialization fail by calling functionfs_unbind().

Signed-off-by: Robert Baldyga <r.baldyga@samsung.com>
Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/function/f_fs.c

index 6e7be91e6097cf0cfb4d6106decc141aeb8a5eb3..adc6d52efa4639387c30bcde2ae7cee95331b1bc 100644 (file)
@@ -2897,11 +2897,17 @@ static int ffs_func_bind(struct usb_configuration *c,
                         struct usb_function *f)
 {
        struct f_fs_opts *ffs_opts = ffs_do_functionfs_bind(f, c);
+       struct ffs_function *func = ffs_func_from_usb(f);
+       int ret;
 
        if (IS_ERR(ffs_opts))
                return PTR_ERR(ffs_opts);
 
-       return _ffs_func_bind(c, f);
+       ret = _ffs_func_bind(c, f);
+       if (ret && !--ffs_opts->refcnt)
+               functionfs_unbind(func->ffs);
+
+       return ret;
 }