tree ab04eda0ed5763908dfbb5803e44052e53607f40
parent f888ba3ce77c66bece3d804caf7d559838209a4a
author [EMAIL PROTECTED] <[EMAIL PROTECTED]> Wed, 10 Aug 2005 23:02:30 -0400
committer James Bottomley <[EMAIL PROTECTED](none)> Fri, 12 Aug 2005 22:08:54 

[SCSI] lpfc driver 8.0.30 : dev_loss and nodev timeouts

Fix handling of the dev_loss and nodev timeouts.

Symptoms: when remote port disappears for a period of time longer then
either nodev_tmo or dev_loss_tmo, the lpfc driver worker thread will
stall removing that remote port.

Cause: removing remote port involves un-blocking and sync-ing
corresponding block device queue. But corresponding node in the lpfc
driver is still in the NPR(?node port recovery?) state and mid-layer
gets SCSI_MLQUEUE_HOST_BUSY as a return value when it is trying to call
queuecommand() with command for that node (AKA remote port)

Fix: Instead of returning SCSI_MLQUEUE_HOST_BUS from queuecommand() for
nodes in NPR states complete it with retry-able error code  DID_BUS_BUSY

Signed-off-by: James Smart <[EMAIL PROTECTED]>
Signed-off-by: James Bottomley <[EMAIL PROTECTED]>

 drivers/scsi/lpfc/lpfc_scsi.c |    4 ++++
 1 files changed, 4 insertions(+)

diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -753,6 +753,10 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd
                        cmnd->result = ScsiResult(DID_NO_CONNECT, 0);
                        goto out_fail_command;
+               else if (ndlp->nlp_state == NLP_STE_NPR_NODE) {
+                       cmnd->result = ScsiResult(DID_BUS_BUSY, 0);
+                       goto out_fail_command;
+               }
                 * The device is most likely recovered and the driver
                 * needs a bit more time to finish.  Ask the midlayer
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to