Skip to content

Commit

Permalink
uas: improve abort handler
Browse files Browse the repository at this point in the history
Two changes.  First we check whenever the request is linked in the work
list and if so take it out.  Second check whenever the command is
actually in flight before asking the device to cancel it via task
management, and in case it isn't just zap the data urbs and finish it.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Gerd Hoffmann authored and Greg Kroah-Hartman committed Jan 11, 2013
1 parent efefecf commit 5d39040
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions drivers/usb/storage/uas.c
Original file line number Diff line number Diff line change
Expand Up @@ -715,8 +715,23 @@ static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
uas_log_cmd_state(cmnd, __func__);
spin_lock_irqsave(&devinfo->lock, flags);
cmdinfo->state |= COMMAND_ABORTED;
spin_unlock_irqrestore(&devinfo->lock, flags);
ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK);
if (cmdinfo->state & IS_IN_WORK_LIST) {
spin_lock(&uas_work_lock);
list_del(&cmdinfo->list);
cmdinfo->state &= ~IS_IN_WORK_LIST;
spin_unlock(&uas_work_lock);
}
if (cmdinfo->state & COMMAND_INFLIGHT) {
spin_unlock_irqrestore(&devinfo->lock, flags);
ret = uas_eh_task_mgmt(cmnd, "ABORT TASK", TMF_ABORT_TASK);
} else {
spin_unlock_irqrestore(&devinfo->lock, flags);
uas_unlink_data_urbs(devinfo, cmdinfo);
spin_lock_irqsave(&devinfo->lock, flags);
uas_try_complete(cmnd, __func__);
spin_unlock_irqrestore(&devinfo->lock, flags);
ret = SUCCESS;
}
return ret;
}

Expand Down

0 comments on commit 5d39040

Please sign in to comment.