mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 17:43:59 +00: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;
|
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
|
* scmd_eh_abort_handler - Handle command aborts
|
||||||
* @work: command to be aborted.
|
* @work: command to be aborted.
|
||||||
@ -166,54 +149,72 @@ scmd_eh_abort_handler(struct work_struct *work)
|
|||||||
struct scsi_cmnd *scmd =
|
struct scsi_cmnd *scmd =
|
||||||
container_of(work, struct scsi_cmnd, abort_work.work);
|
container_of(work, struct scsi_cmnd, abort_work.work);
|
||||||
struct scsi_device *sdev = scmd->device;
|
struct scsi_device *sdev = scmd->device;
|
||||||
|
struct Scsi_Host *shost = sdev->host;
|
||||||
enum scsi_disposition rtn;
|
enum scsi_disposition rtn;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (scsi_host_eh_past_deadline(sdev->host)) {
|
if (scsi_host_eh_past_deadline(shost)) {
|
||||||
SCSI_LOG_ERROR_RECOVERY(3,
|
SCSI_LOG_ERROR_RECOVERY(3,
|
||||||
scmd_printk(KERN_INFO, scmd,
|
scmd_printk(KERN_INFO, scmd,
|
||||||
"eh timeout, not aborting\n"));
|
"eh timeout, not aborting\n"));
|
||||||
} else {
|
goto out;
|
||||||
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"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
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);
|
scsi_eh_scmd_add(scmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user