|
@@ -162,13 +162,7 @@ scmd_eh_abort_handler(struct work_struct *work)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (!scsi_eh_scmd_add(scmd, 0)) {
|
|
|
- SCSI_LOG_ERROR_RECOVERY(3,
|
|
|
- scmd_printk(KERN_WARNING, scmd,
|
|
|
- "terminate aborted command\n"));
|
|
|
- set_host_byte(scmd, DID_TIME_OUT);
|
|
|
- scsi_finish_command(scmd);
|
|
|
- }
|
|
|
+ scsi_eh_scmd_add(scmd, 0);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -228,28 +222,23 @@ static void scsi_eh_reset(struct scsi_cmnd *scmd)
|
|
|
* scsi_eh_scmd_add - add scsi cmd to error handling.
|
|
|
* @scmd: scmd to run eh on.
|
|
|
* @eh_flag: optional SCSI_EH flag.
|
|
|
- *
|
|
|
- * Return value:
|
|
|
- * 0 on failure.
|
|
|
*/
|
|
|
-int scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag)
|
|
|
+void scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag)
|
|
|
{
|
|
|
struct Scsi_Host *shost = scmd->device->host;
|
|
|
unsigned long flags;
|
|
|
- int ret = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
- if (!shost->ehandler)
|
|
|
- return 0;
|
|
|
+ WARN_ON_ONCE(!shost->ehandler);
|
|
|
|
|
|
spin_lock_irqsave(shost->host_lock, flags);
|
|
|
- if (scsi_host_set_state(shost, SHOST_RECOVERY))
|
|
|
- if (scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY))
|
|
|
- goto out_unlock;
|
|
|
-
|
|
|
+ if (scsi_host_set_state(shost, SHOST_RECOVERY)) {
|
|
|
+ ret = scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY);
|
|
|
+ WARN_ON_ONCE(ret);
|
|
|
+ }
|
|
|
if (shost->eh_deadline != -1 && !shost->last_reset)
|
|
|
shost->last_reset = jiffies;
|
|
|
|
|
|
- ret = 1;
|
|
|
if (scmd->eh_eflags & SCSI_EH_ABORT_SCHEDULED)
|
|
|
eh_flag &= ~SCSI_EH_CANCEL_CMD;
|
|
|
scmd->eh_eflags |= eh_flag;
|
|
@@ -257,9 +246,7 @@ int scsi_eh_scmd_add(struct scsi_cmnd *scmd, int eh_flag)
|
|
|
list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q);
|
|
|
shost->host_failed++;
|
|
|
scsi_eh_wakeup(shost);
|
|
|
- out_unlock:
|
|
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
|
|
- return ret;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -288,13 +275,11 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)
|
|
|
rtn = host->hostt->eh_timed_out(scmd);
|
|
|
|
|
|
if (rtn == BLK_EH_NOT_HANDLED) {
|
|
|
- if (!host->hostt->no_async_abort &&
|
|
|
- scsi_abort_command(scmd) == SUCCESS)
|
|
|
- return BLK_EH_NOT_HANDLED;
|
|
|
-
|
|
|
- set_host_byte(scmd, DID_TIME_OUT);
|
|
|
- if (!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))
|
|
|
- rtn = BLK_EH_HANDLED;
|
|
|
+ if (host->hostt->no_async_abort ||
|
|
|
+ scsi_abort_command(scmd) != SUCCESS) {
|
|
|
+ set_host_byte(scmd, DID_TIME_OUT);
|
|
|
+ scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return rtn;
|