]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.fixes/scsi-restart-lookup-by-target
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.fixes / scsi-restart-lookup-by-target
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/scsi-restart-lookup-by-target b/src/patches/suse-2.6.27.31/patches.fixes/scsi-restart-lookup-by-target
new file mode 100644 (file)
index 0000000..1f82fad
--- /dev/null
@@ -0,0 +1,38 @@
+From: Hannes Reinecke <hare@suse.de>
+Subject: Skip deleted devices in __scsi_device_lookup_by_target()
+References: bnc#465346
+
+__scsi_device_lookup_by_target() will always return
+the first sdev with a matching LUN, regardless of
+the state. However, when this sdev is in SDEV_DEL
+scsi_device_lookup_by_target() will ignore this
+device and so any valid device on the list after
+the deleted device will never be found.
+So we have to modify __scsi_device_lookup_by_target()
+to skip any device in SDEV_DEL.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
+index f8b79d4..537bb92 100644
+--- a/drivers/scsi/scsi.c
++++ b/drivers/scsi/scsi.c
+@@ -1099,7 +1099,8 @@ EXPORT_SYMBOL(__starget_for_each_device);
+  * Description: Looks up the scsi_device with the specified @lun for a given
+  * @starget.  The returned scsi_device does not have an additional
+  * reference.  You must hold the host's host_lock over this call and
+- * any access to the returned scsi_device.
++ * any access to the returned scsi_device. A scsi_device in state
++ * SDEV_DEL is skipped.
+  *
+  * Note:  The only reason why drivers should use this is because
+  * they need to access the device list in irq context.  Otherwise you
+@@ -1111,6 +1112,8 @@ struct scsi_device *__scsi_device_lookup_by_target(struct scsi_target *starget,
+       struct scsi_device *sdev;
+       list_for_each_entry(sdev, &starget->devices, same_target_siblings) {
++              if (sdev->sdev_state == SDEV_DEL)
++                      continue;
+               if (sdev->lun ==lun)
+                       return sdev;
+       }