aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2011-01-13 16:19:57 -0500
committerErik Gilling <konkers@android.com>2011-03-30 11:24:44 -0700
commit823ee85794524964f4d40ba5c5f960fb265d8ece (patch)
tree76a49f1dd3b634485578ad94f12ae1f3897791b0
parentb6e51276c0c18174f9d51df342df495dafa67841 (diff)
downloadexperimental-823ee85794524964f4d40ba5c5f960fb265d8ece.tar.gz
USB: gadget: f_mtp: Make sure request is dequeued if transfer is canceled
If the host cancels a file transfer while we have a read request pending, call usb_ep_dequeue to cancel the read. Also return -ECANCELED from mtp_ioctl if we are canceled in MTP_RECEIVE_FILE Signed-off-by: Mike Lockwood <lockwood@android.com>
-rw-r--r--drivers/usb/gadget/f_mtp.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/usb/gadget/f_mtp.c b/drivers/usb/gadget/f_mtp.c
index 64fe3b3cd9e..e07224fd9f8 100644
--- a/drivers/usb/gadget/f_mtp.c
+++ b/drivers/usb/gadget/f_mtp.c
@@ -756,8 +756,10 @@ static void receive_file_work(struct work_struct *data)
/* wait for our last read to complete */
ret = wait_event_interruptible(dev->read_wq,
dev->rx_done || dev->state != STATE_BUSY);
- if (ret < 0 || dev->state != STATE_BUSY) {
- r = ret;
+ if (dev->state == STATE_CANCELED) {
+ r = -ECANCELED;
+ if (!dev->rx_done)
+ usb_ep_dequeue(dev->ep_out, read_req);
break;
}
/* if xfer_file_length is 0xFFFFFFFF, then we read until