mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-18 06:15:12 +00:00
uas: improve abort handler
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>
This commit is contained in:
parent
efefecf33a
commit
5d390403fe
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user