aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2012-09-25 04:47:07 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-25 18:32:23 -0400
commit0871d7d86ce3788ba40391df3a259df2285776cd (patch)
treeb1a67af0086a748f2745b4c95ecc7f0411f794d9
parentef018cc9f894efcca7e785ee75f1dd546e11afee (diff)
USB: uas: fix abort
Properly report aborted commands. Also don't access cmdinfo after kicking task management, it may not be valid any more once it returns. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/storage/uas.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
index 42976eccf3a7..df1d72e46933 100644
--- a/drivers/usb/storage/uas.c
+++ b/drivers/usb/storage/uas.c
@@ -191,6 +191,10 @@ static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
191 cmdinfo->state |= COMMAND_COMPLETED; 191 cmdinfo->state |= COMMAND_COMPLETED;
192 usb_free_urb(cmdinfo->data_in_urb); 192 usb_free_urb(cmdinfo->data_in_urb);
193 usb_free_urb(cmdinfo->data_out_urb); 193 usb_free_urb(cmdinfo->data_out_urb);
194 if (cmdinfo->state & COMMAND_ABORTED) {
195 scmd_printk(KERN_INFO, cmnd, "abort completed\n");
196 cmnd->result = DID_ABORT << 16;
197 }
194 cmnd->scsi_done(cmnd); 198 cmnd->scsi_done(cmnd);
195 return 0; 199 return 0;
196} 200}
@@ -303,9 +307,6 @@ static void uas_data_cmplt(struct urb *urb)
303 } else { 307 } else {
304 sdb->resid = sdb->length - urb->actual_length; 308 sdb->resid = sdb->length - urb->actual_length;
305 } 309 }
306 if (cmdinfo->state & COMMAND_ABORTED) {
307 return;
308 }
309 uas_try_complete(cmnd, __func__); 310 uas_try_complete(cmnd, __func__);
310} 311}
311 312
@@ -654,10 +655,6 @@ static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
654 uas_log_cmd_state(cmnd, __func__); 655 uas_log_cmd_state(cmnd, __func__);
655 cmdinfo->state |= COMMAND_ABORTED; 656 cmdinfo->state |= COMMAND_ABORTED;
656 ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK); 657 ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK);
657 if (cmdinfo->state & DATA_IN_URB_INFLIGHT)
658 usb_kill_urb(cmdinfo->data_in_urb);
659 if (cmdinfo->state & DATA_OUT_URB_INFLIGHT)
660 usb_kill_urb(cmdinfo->data_out_urb);
661 return ret; 658 return ret;
662} 659}
663 660