[SCSI] host state model update: reimplement scsi_host_cancel
authorMike Anderson <andmike@us.ibm.com>
Thu, 16 Jun 2005 18:13:42 +0000 (11:13 -0700)
committerJames Bottomley <jejb@mulgrave.(none)>
Sat, 30 Jul 2005 16:11:37 +0000 (11:11 -0500)
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>
drivers/scsi/hosts.c
drivers/scsi/scsi.c

index 6828ca305c2a36852c02ce49131c4e796563ac04..67c4c0c3aa5e6738e36d612e5804f94c6e502dc1 100644 (file)
@@ -127,30 +127,14 @@ int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state)
 }
 EXPORT_SYMBOL(scsi_host_set_state);
 
-/**
- * scsi_host_cancel - cancel outstanding IO to this host
- * @shost:     pointer to struct Scsi_Host
- * recovery:   recovery requested to run.
- **/
-static void scsi_host_cancel(struct Scsi_Host *shost, int recovery)
-{
-       struct scsi_device *sdev;
-
-       scsi_host_set_state(shost, SHOST_CANCEL);
-       shost_for_each_device(sdev, shost) {
-               scsi_device_cancel(sdev, recovery);
-       }
-       wait_event(shost->host_wait, (shost->shost_state != SHOST_RECOVERY));
-}
-
 /**
  * scsi_remove_host - remove a scsi host
  * @shost:     a pointer to a scsi host to remove
  **/
 void scsi_remove_host(struct Scsi_Host *shost)
 {
+       scsi_host_set_state(shost, SHOST_CANCEL);
        scsi_forget_host(shost);
-       scsi_host_cancel(shost, 0);
        scsi_proc_host_rm(shost);
 
        scsi_host_set_state(shost, SHOST_DEL);
index fb85b3ced7b59b4f892f988a6c8a1e31b2e367c7..d1aa95d45a700bef26f1986f408cda1336784fed 100644 (file)
@@ -627,7 +627,7 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
        spin_lock_irqsave(host->host_lock, flags);
        scsi_cmd_get_serial(host, cmd); 
 
-       if (unlikely(host->shost_state == SHOST_CANCEL)) {
+       if (unlikely(host->shost_state == SHOST_DEL)) {
                cmd->result = (DID_NO_CONNECT << 16);
                scsi_done(cmd);
        } else {