[SCSI] Eliminate error handler overload of the SCSI serial number
The error handler is using the test cmd->serial_number == 0 in the abort routines to signal that the command to be aborted has already completed normally. This design was to close a race window in the original error handler where a command could go through the normal completion routines after it timed out but before error handling was started. Mike Anderson pointed out that when we converted our timeout and softirq completions, we picked up atomicity here because the block layer now mediates this with the REQ_ATOM_COMPLETE flag and guarantees that *either* the command times out or our done routine is called, but ensures we can't get both occurring. That makes the serial number zero check redundant and it can be removed. Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
5da6141005
commit
459dbf72e4
|
@ -615,7 +615,7 @@ static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
|
static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
|
||||||
{
|
{
|
||||||
if (!scmd->device->host->hostt->eh_abort_handler)
|
if (!scmd->device->host->hostt->eh_abort_handler)
|
||||||
return FAILED;
|
return FAILED;
|
||||||
|
@ -623,31 +623,9 @@ static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
|
||||||
return scmd->device->host->hostt->eh_abort_handler(scmd);
|
return scmd->device->host->hostt->eh_abort_handler(scmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* scsi_try_to_abort_cmd - Ask host to abort a running command.
|
|
||||||
* @scmd: SCSI cmd to abort from Lower Level.
|
|
||||||
*
|
|
||||||
* Notes:
|
|
||||||
* This function will not return until the user's completion function
|
|
||||||
* has been called. there is no timeout on this operation. if the
|
|
||||||
* author of the low-level driver wishes this operation to be timed,
|
|
||||||
* they can provide this facility themselves. helper functions in
|
|
||||||
* scsi_error.c can be supplied to make this easier to do.
|
|
||||||
*/
|
|
||||||
static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* scsi_done was called just after the command timed out and before
|
|
||||||
* we had a chance to process it. (db)
|
|
||||||
*/
|
|
||||||
if (scmd->serial_number == 0)
|
|
||||||
return SUCCESS;
|
|
||||||
return __scsi_try_to_abort_cmd(scmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
|
static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
|
||||||
{
|
{
|
||||||
if (__scsi_try_to_abort_cmd(scmd) != SUCCESS)
|
if (scsi_try_to_abort_cmd(scmd) != SUCCESS)
|
||||||
if (scsi_try_bus_device_reset(scmd) != SUCCESS)
|
if (scsi_try_bus_device_reset(scmd) != SUCCESS)
|
||||||
if (scsi_try_target_reset(scmd) != SUCCESS)
|
if (scsi_try_target_reset(scmd) != SUCCESS)
|
||||||
if (scsi_try_bus_reset(scmd) != SUCCESS)
|
if (scsi_try_bus_reset(scmd) != SUCCESS)
|
||||||
|
|
|
@ -1403,11 +1403,6 @@ static void scsi_softirq_done(struct request *rq)
|
||||||
|
|
||||||
INIT_LIST_HEAD(&cmd->eh_entry);
|
INIT_LIST_HEAD(&cmd->eh_entry);
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the serial numbers back to zero
|
|
||||||
*/
|
|
||||||
cmd->serial_number = 0;
|
|
||||||
|
|
||||||
atomic_inc(&cmd->device->iodone_cnt);
|
atomic_inc(&cmd->device->iodone_cnt);
|
||||||
if (cmd->result)
|
if (cmd->result)
|
||||||
atomic_inc(&cmd->device->ioerr_cnt);
|
atomic_inc(&cmd->device->ioerr_cnt);
|
||||||
|
|
Loading…
Reference in a new issue