aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@steeleye.com>2005-09-18 16:05:20 -0400
committerJames Bottomley <jejb@titanic.(none)>2005-09-19 10:24:52 -0400
commit939647ee308e0ad924e776657704c7bedd498664 (patch)
treecfff68b8f65a53e186fd1e7443aa370885ac1ed9 /drivers/scsi/scsi_lib.c
parenta64358db1253b35d508a411e80a3ad23b859ec88 (diff)
[SCSI] fix oops on usb storage device disconnect
We fix the oops by enforcing the host state model. There have also been two extra states added: SHOST_CANCEL_RECOVERY and SHOST_DEL_RECOVERY so we can take the model through host removal while the recovery thread is active. Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index f065cbc1a6e5..dc9c772bc874 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -447,7 +447,7 @@ void scsi_device_unbusy(struct scsi_device *sdev)
447 447
448 spin_lock_irqsave(shost->host_lock, flags); 448 spin_lock_irqsave(shost->host_lock, flags);
449 shost->host_busy--; 449 shost->host_busy--;
450 if (unlikely((shost->shost_state == SHOST_RECOVERY) && 450 if (unlikely(scsi_host_in_recovery(shost) &&
451 shost->host_failed)) 451 shost->host_failed))
452 scsi_eh_wakeup(shost); 452 scsi_eh_wakeup(shost);
453 spin_unlock(shost->host_lock); 453 spin_unlock(shost->host_lock);
@@ -1339,7 +1339,7 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
1339 struct Scsi_Host *shost, 1339 struct Scsi_Host *shost,
1340 struct scsi_device *sdev) 1340 struct scsi_device *sdev)
1341{ 1341{
1342 if (shost->shost_state == SHOST_RECOVERY) 1342 if (scsi_host_in_recovery(shost))
1343 return 0; 1343 return 0;
1344 if (shost->host_busy == 0 && shost->host_blocked) { 1344 if (shost->host_busy == 0 && shost->host_blocked) {
1345 /* 1345 /*