[SCSI] 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. Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
debf47779e
commit
32aeef605a
|
@ -1095,7 +1095,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
|
||||
|
@ -1107,6 +1108,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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue