From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mike Snitzer Subject: [PATCH for-2.6.39] [SCSI] scsi_dh_emc: fix panic when handling multiple path failures Date: Mon, 21 Mar 2011 15:57:13 -0400 Message-ID: <1300737433-11994-1-git-send-email-snitzer@redhat.com> Return-path: Received: from mx1.redhat.com ([209.132.183.28]:13481 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754332Ab1CUT5Y (ORCPT ); Mon, 21 Mar 2011 15:57:24 -0400 Sender: linux-scsi-owner@vger.kernel.org List-Id: linux-scsi@vger.kernel.org To: James Bottomley Cc: linux-scsi@vger.kernel.org, Eddie Williams , Mike Snitzer From: Eddie Williams 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 Signed-off-by: Mike Snitzer --- 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