Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
scsi: lpfc: Exit PRLI completion handling early if ndlp not in PRLI_I…
Browse files Browse the repository at this point in the history
…SSUE state

In a large SAN testing configuration, frequent target port toggle tests are
occasionally resulting in missing lun path rediscoveries.  An outstanding
PRLI can be inflight when a target RSCN dissappearance occurs, causing the
driver to retry PRLIs using invalid rpi contexts.

Fix by verifying that an ndlp's state was not restarted from PRLI_ISSUE
due to an intermediate RSCN.  If not in a valid state, early exit PRLI
completion handling.

The last follow up RSCN indicating target reappearance retriggers
PLOGI/PRLI with a valid rpi context and is expected to succeed in LUN path
rediscovery.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Justin Tee authored and martinkpetersen committed Jan 12, 2023
1 parent ecdf4dd commit c051f1a
Showing 1 changed file with 26 additions and 2 deletions.
28 changes: 26 additions & 2 deletions drivers/scsi/lpfc/lpfc_els.c
Original file line number Diff line number Diff line change
Expand Up @@ -2373,15 +2373,30 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
/* PRLI failed */
lpfc_printf_vlog(vport, mode, loglevel,
"2754 PRLI failure DID:%06X Status:x%x/x%x, "
"data: x%x\n",
"data: x%x x%x\n",
ndlp->nlp_DID, ulp_status,
ulp_word4, ndlp->fc4_prli_sent);
ulp_word4, ndlp->nlp_state,
ndlp->fc4_prli_sent);

/* Do not call DSM for lpfc_els_abort'ed ELS cmds */
if (!lpfc_error_lost_link(ulp_status, ulp_word4))
lpfc_disc_state_machine(vport, ndlp, cmdiocb,
NLP_EVT_CMPL_PRLI);

/* The following condition catches an inflight transition
* mismatch typically caused by an RSCN. Skip any
* processing to allow recovery.
*/
if (ndlp->nlp_state >= NLP_STE_PLOGI_ISSUE &&
ndlp->nlp_state <= NLP_STE_REG_LOGIN_ISSUE) {
lpfc_printf_vlog(vport, KERN_WARNING, LOG_NODE,
"2784 PRLI cmpl: state mismatch "
"DID x%06x nstate x%x nflag x%x\n",
ndlp->nlp_DID, ndlp->nlp_state,
ndlp->nlp_flag);
goto out;
}

/*
* For P2P topology, retain the node so that PLOGI can be
* attempted on it again.
Expand Down Expand Up @@ -4673,6 +4688,15 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
/* the nameserver fails */
maxretry = 0;
delay = 100;
} else if (cmd == ELS_CMD_PRLI &&
ndlp->nlp_state != NLP_STE_PRLI_ISSUE) {
/* State-command disagreement. The PRLI was
* failed with an invalid rpi meaning there
* some unexpected state change. Don't retry.
*/
maxretry = 0;
retry = 0;
break;
}
retry = 1;
break;
Expand Down

0 comments on commit c051f1a

Please sign in to comment.