mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
scsi: core: Simplify control flow in scmd_eh_abort_handler()
Simplify the nested conditionals in the function by using a label for the error path. Introduce local "shost" to avoid repeated "sdev->shost" usage. Also remove scsi_eh_complete_abort() since there is now only one place it would be called. Link: https://lore.kernel.org/r/20211029194311.17504-3-emilne@redhat.com Signed-off-by: Ewan D. Milne <emilne@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
fa55b7dcdc
commit
54d816d3d3
@ -133,23 +133,6 @@ static bool scsi_eh_should_retry_cmd(struct scsi_cmnd *cmd)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void scsi_eh_complete_abort(struct scsi_cmnd *scmd, struct Scsi_Host *shost)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
list_del_init(&scmd->eh_entry);
|
||||
/*
|
||||
* If the abort succeeds, and there is no further
|
||||
* EH action, clear the ->last_reset time.
|
||||
*/
|
||||
if (list_empty(&shost->eh_abort_list) &&
|
||||
list_empty(&shost->eh_cmd_q))
|
||||
if (shost->eh_deadline != -1)
|
||||
shost->last_reset = 0;
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* scmd_eh_abort_handler - Handle command aborts
|
||||
* @work: command to be aborted.
|
||||
@ -166,54 +149,72 @@ scmd_eh_abort_handler(struct work_struct *work)
|
||||
struct scsi_cmnd *scmd =
|
||||
container_of(work, struct scsi_cmnd, abort_work.work);
|
||||
struct scsi_device *sdev = scmd->device;
|
||||
struct Scsi_Host *shost = sdev->host;
|
||||
enum scsi_disposition rtn;
|
||||
unsigned long flags;
|
||||
|
||||
if (scsi_host_eh_past_deadline(sdev->host)) {
|
||||
if (scsi_host_eh_past_deadline(shost)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"eh timeout, not aborting\n"));
|
||||
} else {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"aborting command\n"));
|
||||
rtn = scsi_try_to_abort_cmd(sdev->host->hostt, scmd);
|
||||
if (rtn == SUCCESS) {
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
if (scsi_host_eh_past_deadline(sdev->host)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"eh timeout, not retrying "
|
||||
"aborted command\n"));
|
||||
} else if (!scsi_noretry_cmd(scmd) &&
|
||||
scsi_cmd_retry_allowed(scmd) &&
|
||||
scsi_eh_should_retry_cmd(scmd)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_WARNING, scmd,
|
||||
"retry aborted command\n"));
|
||||
scsi_eh_complete_abort(scmd, sdev->host);
|
||||
scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
|
||||
return;
|
||||
} else {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_WARNING, scmd,
|
||||
"finish aborted command\n"));
|
||||
scsi_eh_complete_abort(scmd, sdev->host);
|
||||
scsi_finish_command(scmd);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"cmd abort %s\n",
|
||||
(rtn == FAST_IO_FAIL) ?
|
||||
"not send" : "failed"));
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(sdev->host->host_lock, flags);
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"aborting command\n"));
|
||||
rtn = scsi_try_to_abort_cmd(shost->hostt, scmd);
|
||||
if (rtn != SUCCESS) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"cmd abort %s\n",
|
||||
(rtn == FAST_IO_FAIL) ?
|
||||
"not send" : "failed"));
|
||||
goto out;
|
||||
}
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
if (scsi_host_eh_past_deadline(shost)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
"eh timeout, not retrying "
|
||||
"aborted command\n"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
list_del_init(&scmd->eh_entry);
|
||||
spin_unlock_irqrestore(sdev->host->host_lock, flags);
|
||||
|
||||
/*
|
||||
* If the abort succeeds, and there is no further
|
||||
* EH action, clear the ->last_reset time.
|
||||
*/
|
||||
if (list_empty(&shost->eh_abort_list) &&
|
||||
list_empty(&shost->eh_cmd_q))
|
||||
if (shost->eh_deadline != -1)
|
||||
shost->last_reset = 0;
|
||||
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
if (!scsi_noretry_cmd(scmd) &&
|
||||
scsi_cmd_retry_allowed(scmd) &&
|
||||
scsi_eh_should_retry_cmd(scmd)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_WARNING, scmd,
|
||||
"retry aborted command\n"));
|
||||
scsi_queue_insert(scmd, SCSI_MLQUEUE_EH_RETRY);
|
||||
} else {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_WARNING, scmd,
|
||||
"finish aborted command\n"));
|
||||
scsi_finish_command(scmd);
|
||||
}
|
||||
return;
|
||||
|
||||
out:
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
list_del_init(&scmd->eh_entry);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
|
||||
scsi_eh_scmd_add(scmd);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user