diff options
| author | Ajay Agarwal <ajaya@codeaurora.org> | 2019-03-11 16:58:06 +0530 |
|---|---|---|
| committer | Ajay Agarwal <ajaya@codeaurora.org> | 2019-03-27 09:42:46 +0530 |
| commit | 1c738b6a5f82df06e0be76d5fb5f6136e2dcc4e8 (patch) | |
| tree | d28782d5770450235ab566fc3dcae7ba0ae44070 /drivers/usb/gadget/function | |
| parent | e764712fd7f6db7921dc4b3dbbf772d613177633 (diff) | |
usb: gadget: f_fs: Queue request after setting is_busy flag
Currently the driver queues OUT EP request after ensuring that
is_busy flag is false, and then sets it true. It might be
possible that the queued request is completed before the
execution reaches next line to set is_busy to true. As a result,
is_busy remains true even after successful completion and no
further request is queued.
Fix this by first setting is_busy to true and then queueing the
request.
Change-Id: I87fce4e2cc94be8e6b6fb63fb1fc9afb9cf0d005
Signed-off-by: Ajay Agarwal <ajaya@codeaurora.org>
Diffstat (limited to 'drivers/usb/gadget/function')
| -rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index f97193011bed..fd2150a8db2e 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -988,13 +988,14 @@ retry: * still busy. */ if (!(io_data->read && ep->is_busy)) { - ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC); ep->is_busy = true; + ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC); } spin_unlock_irq(&epfile->ffs->eps_lock); if (unlikely(ret < 0)) { + ep->is_busy = false; ret = -EIO; } else if (unlikely( wait_for_completion_interruptible(done))) { |
