Skip deleted devices in __scsi_device_lookup_by_target()
PATCH 1/1 Skip deleted devices in __scsi_device_lookup_by_target()
Hi all,
this is a modified patch of my earlier patch 'Restart scsi_device_lookup_by_target'.
After discussions with Matthew Wilcox and James B. it turned out that it's actually better to skip deleted devices from __scsi_device_lookup_by_target(), leaving scsi_device_lookup_by_target() untouched.
So here it goes.
James, please apply.
Cheers,
Hannes
Signature · 4 lines
Dr. Hannes Reinecke zSeries & Storage [email protected] +49 911 74053 688 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Markus Rex, HRB 16746 (AG Nürnberg)
Skip deleted devices in __scsi_device_lookup_by_target()
__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.
drivers/scsi/scsi.c +4 -1
@@ -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; }