}
        }
 
-       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);
 }
 
 /**
  * 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;
        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;
 }
 
 /**
                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;
 
 extern int scsi_error_handler(void *host);
 extern int scsi_decide_disposition(struct scsi_cmnd *cmd);
 extern void scsi_eh_wakeup(struct Scsi_Host *shost);
-extern int scsi_eh_scmd_add(struct scsi_cmnd *, int);
+extern void scsi_eh_scmd_add(struct scsi_cmnd *, int);
 void scsi_eh_ready_devs(struct Scsi_Host *shost,
                        struct list_head *work_q,
                        struct list_head *done_q);