aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/hosts.c18
-rw-r--r--drivers/scsi/scsi.c2
2 files changed, 2 insertions, 18 deletions
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index 6828ca305c2a..67c4c0c3aa5e 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -128,29 +128,13 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state)
128EXPORT_SYMBOL(scsi_host_set_state); 128EXPORT_SYMBOL(scsi_host_set_state);
129 129
130/** 130/**
131 * scsi_host_cancel - cancel outstanding IO to this host
132 * @shost: pointer to struct Scsi_Host
133 * recovery: recovery requested to run.
134 **/
135static void scsi_host_cancel(struct Scsi_Host *shost, int recovery)
136{
137 struct scsi_device *sdev;
138
139 scsi_host_set_state(shost, SHOST_CANCEL);
140 shost_for_each_device(sdev, shost) {
141 scsi_device_cancel(sdev, recovery);
142 }
143 wait_event(shost->host_wait, (shost->shost_state != SHOST_RECOVERY));
144}
145
146/**
147 * scsi_remove_host - remove a scsi host 131 * scsi_remove_host - remove a scsi host
148 * @shost: a pointer to a scsi host to remove 132 * @shost: a pointer to a scsi host to remove
149 **/ 133 **/
150void scsi_remove_host(struct Scsi_Host *shost) 134void scsi_remove_host(struct Scsi_Host *shost)
151{ 135{
136 scsi_host_set_state(shost, SHOST_CANCEL);
152 scsi_forget_host(shost); 137 scsi_forget_host(shost);
153 scsi_host_cancel(shost, 0);
154 scsi_proc_host_rm(shost); 138 scsi_proc_host_rm(shost);
155 139
156 scsi_host_set_state(shost, SHOST_DEL); 140 scsi_host_set_state(shost, SHOST_DEL);
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index fb85b3ced7b5..d1aa95d45a70 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -627,7 +627,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
627 spin_lock_irqsave(host->host_lock, flags); 627 spin_lock_irqsave(host->host_lock, flags);
628 scsi_cmd_get_serial(host, cmd); 628 scsi_cmd_get_serial(host, cmd);
629 629
630 if (unlikely(host->shost_state == SHOST_CANCEL)) { 630 if (unlikely(host->shost_state == SHOST_DEL)) {
631 cmd->result = (DID_NO_CONNECT << 16); 631 cmd->result = (DID_NO_CONNECT << 16);
632 scsi_done(cmd); 632 scsi_done(cmd);
633 } else { 633 } else {