Nodelist entry for SCSI array ends up in UNMAPPED state. This is
due to illegal discovery State machine transition because of two
PRLIs and the first one failing with LS_RJT. Also, the error path
was designed assuming the PRLIs complete in the order they were
sent, FCP first, then NVME. In a failing case, the array thinks
about the first PRLI (FCP), but issues LS_RJT for the 2nd PRLI
immediately.

Fix PRLI completion error path for the ordering expectation.
Ensure the discovery state machine update is not set until all
outstanding PRLIs are complete.

Signed-off-by: Dick Kennedy <dick.kenn...@broadcom.com>
Signed-off-by: James Smart <james.sm...@broadcom.com>
---
 drivers/scsi/lpfc/lpfc_nportdisc.c | 29 ++++++-----------------------
 1 file changed, 6 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c 
b/drivers/scsi/lpfc/lpfc_nportdisc.c
index 022060636ae1..e790c0bc64fc 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -1936,31 +1936,14 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, 
struct lpfc_nodelist *ndlp,
                        goto out;
                }
 
-               /* When the rport rejected the FCP PRLI as unsupported.
-                * This should only happen in Pt2Pt so an NVME PRLI
-                * should be outstanding still.
-                */
-               if (npr && ndlp->nlp_flag & NLP_FCP_PRLI_RJT) {
+               /* Adjust the nlp_type accordingly if the PRLI failed */
+               if (npr)
                        ndlp->nlp_fc4_type &= ~NLP_FC4_FCP;
-                       goto out_err;
-               }
-
-               /* The LS Req had some error.  Don't let this be a
-                * target.
-                */
-               if ((ndlp->fc4_prli_sent == 1) &&
-                   (ndlp->nlp_state == NLP_STE_PRLI_ISSUE) &&
-                   (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_FCP_INITIATOR)))
-                       /* The FCP PRLI completed successfully but
-                        * the NVME PRLI failed.  Since they are sent in
-                        * succession, allow the FCP to complete.
-                        */
-                       goto out_err;
+               if (nvpr)
+                       ndlp->nlp_fc4_type &= ~NLP_FC4_NVME;
 
-               ndlp->nlp_prev_state = NLP_STE_PRLI_ISSUE;
-               ndlp->nlp_type |= NLP_FCP_INITIATOR;
-               lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
-               return ndlp->nlp_state;
+               /* We can't set the DSM state till BOTH PRLIs complete */
+               goto out_err;
        }
 
        if (npr && (npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
-- 
2.13.1

Reply via email to