aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorMike Anderson <andmike@us.ibm.com>2005-06-16 14:13:42 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2005-07-30 12:11:37 -0400
commitd2c9d9eafa03dbd08a8a439e6c5addb8b1f03b9b (patch)
tree2af0c85e0ffddf593821c961f0a5e729de8c6ccc /drivers/scsi
parentd3301874083874f8a0ac88aa1bb7da6b62df34d2 (diff)
[SCSI] host state model update: reimplement scsi_host_cancel
Remove the old scsi_host_cancel function as it has not been working for sometime do to the device list possibly being empty when it is called and possible race issues. Add setting of SHOST_CANCEL at the state of beginning of scsi_remove_host. Signed-off-by: Mike Anderson <andmike@us.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
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 {