diff -up linux-2.6.18.i686/drivers/scsi/scsi_sysfs.c.orig linux-2.6.18.i686/drivers/scsi/scsi_sysfs.c
--- linux-2.6.18.i686/drivers/scsi/scsi_sysfs.c.orig	2011-05-17 09:39:02.000000000 +0800
+++ linux-2.6.18.i686/drivers/scsi/scsi_sysfs.c	2011-05-17 09:40:21.000000000 +0800
@@ -779,10 +779,11 @@ void __scsi_remove_target(struct scsi_ta
 	list_for_each_entry(sdev, &shost->__devices, siblings) {
 		if (sdev->channel != starget->channel ||
 		    sdev->id != starget->id ||
-		    sdev->sdev_state == SDEV_DEL)
+		    scsi_device_get(sdev))
 			continue;
 		spin_unlock_irqrestore(shost->host_lock, flags);
 		scsi_remove_device(sdev);
+		scsi_device_put(sdev);
 		spin_lock_irqsave(shost->host_lock, flags);
 		goto restart;
 	}
