From: Eddie Williams <eddie.williams@xxxxxxxxxxxx> Do not sdev_printk() a scsi_device that was, or is being, deleted. If multiple failures occur (e.g. FC switch with multiple paths fails), and both the active path and next path is failed in the process, the scsi_device associated with the next path can be accessed after it was deleted. Signed-off-by: Eddie Williams <eddie.williams@xxxxxxxxxxxx> Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> --- drivers/scsi/device_handler/scsi_dh_emc.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c index 48441f6..670f059 100644 --- a/drivers/scsi/device_handler/scsi_dh_emc.c +++ b/drivers/scsi/device_handler/scsi_dh_emc.c @@ -537,14 +537,14 @@ static int clariion_activate(struct scsi_device *sdev, result = clariion_send_inquiry(sdev, csdev); if (result != SCSI_DH_OK) - goto done; + goto out; if (csdev->lun_state == CLARIION_LUN_OWNED) goto done; result = send_trespass_cmd(sdev, csdev); if (result != SCSI_DH_OK) - goto done; + goto out; sdev_printk(KERN_INFO, sdev,"%s: %s trespass command sent\n", CLARIION_NAME, csdev->flags&CLARIION_SHORT_TRESPASS?"short":"long" ); @@ -552,7 +552,7 @@ static int clariion_activate(struct scsi_device *sdev, /* Update status */ result = clariion_send_inquiry(sdev, csdev); if (result != SCSI_DH_OK) - goto done; + goto out; done: sdev_printk(KERN_INFO, sdev, @@ -561,10 +561,12 @@ done: csdev->port, lun_state[csdev->lun_state], csdev->default_sp + 'A'); +out: if (fn) fn(data, result); return 0; } + /* * params - parameters in the following format * "no_of_params\0param1\0param2\0param3\0...\0" -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html