Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2c9d9ea authored by Mike Anderson's avatar Mike Anderson Committed by James Bottomley
Browse files

[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: default avatarMike Anderson <andmike@us.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent d3301874
Loading
Loading
Loading
Loading
+1 −17
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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 {