diff options
author | Mike Anderson <andmike@us.ibm.com> | 2005-06-16 14:13:42 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-07-30 12:11:37 -0400 |
commit | d2c9d9eafa03dbd08a8a439e6c5addb8b1f03b9b (patch) | |
tree | 2af0c85e0ffddf593821c961f0a5e729de8c6ccc /drivers/scsi | |
parent | d3301874083874f8a0ac88aa1bb7da6b62df34d2 (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.c | 18 | ||||
-rw-r--r-- | drivers/scsi/scsi.c | 2 |
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) | |||
128 | EXPORT_SYMBOL(scsi_host_set_state); | 128 | EXPORT_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 | **/ | ||
135 | static 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 | **/ |
150 | void scsi_remove_host(struct Scsi_Host *shost) | 134 | void 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 { |