|
@@ -1687,6 +1687,20 @@ static void scsi_restart_operations(struct Scsi_Host *shost)
|
|
|
* requests are started.
|
|
|
*/
|
|
|
scsi_run_host_queues(shost);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * if eh is active and host_eh_scheduled is pending we need to re-run
|
|
|
+ * recovery. we do this check after scsi_run_host_queues() to allow
|
|
|
+ * everything pent up since the last eh run a chance to make forward
|
|
|
+ * progress before we sync again. Either we'll immediately re-run
|
|
|
+ * recovery or scsi_device_unbusy() will wake us again when these
|
|
|
+ * pending commands complete.
|
|
|
+ */
|
|
|
+ spin_lock_irqsave(shost->host_lock, flags);
|
|
|
+ if (shost->host_eh_scheduled)
|
|
|
+ if (scsi_host_set_state(shost, SHOST_RECOVERY))
|
|
|
+ WARN_ON(scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY));
|
|
|
+ spin_unlock_irqrestore(shost->host_lock, flags);
|
|
|
}
|
|
|
|
|
|
/**
|