All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Smart <jsmart2021@gmail.com>
To: linux-scsi@vger.kernel.org
Cc: James Smart <jsmart2021@gmail.com>, Justin Tee <justin.tee@broadcom.com>
Subject: [PATCH 18/20] lpfc: Skip issuing ADISC when node is in NPR state
Date: Wed,  7 Jul 2021 11:43:49 -0700	[thread overview]
Message-ID: <20210707184351.67872-19-jsmart2021@gmail.com> (raw)
In-Reply-To: <20210707184351.67872-1-jsmart2021@gmail.com>

When a node moves to NPR state due to a device recovery event, the
nlp_fc4_types in the node are cleared. An ADISC received for a node in
the NPR state triggers an ADISC. Without fc4 types being known, the
calls to register with the transport are no-op'd, thus no additional
references are placed on the node by transport re-registrations. A
subsequent RSCN could trigger another unregister request, which will
decrement the reference counts, leading to the ref count hitting zero
and the node being freed while futher discovery on the node is being
attempted by the RSCN event handling.

Fix by skipping the trigger of an ADISC when in NPR state. The normal
ADISC process will kick off in the regular discovery path after receiving
a response from name server.

Co-developed-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
---
 drivers/scsi/lpfc/lpfc_nportdisc.c | 34 +++++++++++++++++-------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c
index 46c1905f6f39..27263f02ab9f 100644
--- a/drivers/scsi/lpfc/lpfc_nportdisc.c
+++ b/drivers/scsi/lpfc/lpfc_nportdisc.c
@@ -736,9 +736,13 @@ lpfc_rcv_padisc(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 		 * is already in MAPPED or UNMAPPED state.  Catch this
 		 * condition and don't set the nlp_state again because
 		 * it causes an unnecessary transport unregister/register.
+		 *
+		 * Nodes marked for ADISC will move MAPPED or UNMAPPED state
+		 * after issuing ADISC
 		 */
 		if (ndlp->nlp_type & (NLP_FCP_TARGET | NLP_NVME_TARGET)) {
-			if (ndlp->nlp_state != NLP_STE_MAPPED_NODE)
+			if ((ndlp->nlp_state != NLP_STE_MAPPED_NODE) &&
+			    !(ndlp->nlp_flag & NLP_NPR_ADISC))
 				lpfc_nlp_set_state(vport, ndlp,
 						   NLP_STE_MAPPED_NODE);
 		}
@@ -2646,14 +2650,13 @@ lpfc_rcv_prli_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 	lpfc_els_rsp_reject(vport, stat.un.lsRjtError, cmdiocb, ndlp, NULL);
 
 	if (!(ndlp->nlp_flag & NLP_DELAY_TMO)) {
-		if (ndlp->nlp_flag & NLP_NPR_ADISC) {
-			spin_lock_irq(&ndlp->lock);
-			ndlp->nlp_flag &= ~NLP_NPR_ADISC;
-			ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
-			spin_unlock_irq(&ndlp->lock);
-			lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
-			lpfc_issue_els_adisc(vport, ndlp, 0);
-		} else {
+		/*
+		 * ADISC nodes will be handled in regular discovery path after
+		 * receiving response from NS.
+		 *
+		 * For other nodes, Send PLOGI to trigger an implicit LOGO.
+		 */
+		if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
 			ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
 			lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
@@ -2686,12 +2689,13 @@ lpfc_rcv_padisc_npr_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
 	 */
 	if (!(ndlp->nlp_flag & NLP_DELAY_TMO) &&
 	    !(ndlp->nlp_flag & NLP_NPR_2B_DISC)) {
-		if (ndlp->nlp_flag & NLP_NPR_ADISC) {
-			ndlp->nlp_flag &= ~NLP_NPR_ADISC;
-			ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
-			lpfc_nlp_set_state(vport, ndlp, NLP_STE_ADISC_ISSUE);
-			lpfc_issue_els_adisc(vport, ndlp, 0);
-		} else {
+		/*
+		 * ADISC nodes will be handled in regular discovery path after
+		 * receiving response from NS.
+		 *
+		 * For other nodes, Send PLOGI to trigger an implicit LOGO.
+		 */
+		if (!(ndlp->nlp_flag & NLP_NPR_ADISC)) {
 			ndlp->nlp_prev_state = NLP_STE_NPR_NODE;
 			lpfc_nlp_set_state(vport, ndlp, NLP_STE_PLOGI_ISSUE);
 			lpfc_issue_els_plogi(vport, ndlp->nlp_DID, 0);
-- 
2.26.2


  parent reply	other threads:[~2021-07-07 18:44 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-07 18:43 [PATCH 00/20] lpfc: Update lpfc to revision 12.8.0.11 James Smart
2021-07-07 18:43 ` [PATCH 01/20] lpfc: Fix NVME support reporting in log message James Smart
2021-07-07 18:43 ` [PATCH 02/20] lpfc: Remove use of kmalloc in trace event logging James Smart
2021-07-07 18:43 ` [PATCH 03/20] lpfc: Improve firmware download logging James Smart
2021-07-07 18:43 ` [PATCH 04/20] lpfc: Fix function description comments for vmid routines James Smart
2021-07-07 18:43 ` [PATCH 05/20] lpfc: Discovery state machine fixes for LOGO handling James Smart
2021-07-07 18:43 ` [PATCH 06/20] lpfc: Fix target reset handler from falsely returning FAILURE James Smart
2021-07-07 18:43 ` [PATCH 07/20] lpfc: Keep ndlp reference until after freeing the iocb after els handling James Smart
2021-07-07 18:43 ` [PATCH 08/20] lpfc: Fix null ptr dereference with NPIV ports for RDF handling James Smart
2021-07-07 18:43 ` [PATCH 09/20] lpfc: Fix memory leaks in error paths while issuing ELS RDF/SCR request James Smart
2021-07-07 18:43 ` [PATCH 10/20] lpfc: Remove REG_LOGIN check requirement to issue an ELS RDF James Smart
2021-07-07 18:43 ` [PATCH 11/20] lpfc: Fix KASAN slab-out-of-bounds in lpfc_unreg_rpi routine James Smart
2021-07-07 18:43 ` [PATCH 12/20] lpfc: Clear outstanding active mailbox during PCI function reset James Smart
2021-07-07 18:43 ` [PATCH 13/20] lpfc: Use PBDE feature enabled bit to determine PBDE support James Smart
2021-07-07 18:43 ` [PATCH 14/20] lpfc: Enable adisc discovery after RSCN by default James Smart
2021-07-07 18:43 ` [PATCH 15/20] lpfc: Delay unregistering from transport until GIDFT or ADISC completes James Smart
2021-07-07 18:43 ` [PATCH 16/20] lpfc: Call discovery state machine when handling PLOGI/ADISC completions James Smart
2021-07-07 18:43 ` [PATCH 17/20] lpfc: Skip reg_vpi when link is down for SLI3 in ADISC cmpl path James Smart
2021-07-07 18:43 ` James Smart [this message]
2021-07-07 18:43 ` [PATCH 19/20] lpfc: Update lpfc version to 12.8.0.11 James Smart
2021-07-07 18:43 ` [PATCH 20/20] lpfc: Copyright updates for 12.8.0.11 patches James Smart
2021-07-19  2:31 ` [PATCH 00/20] lpfc: Update lpfc to revision 12.8.0.11 Martin K. Petersen
2021-07-24  2:13 ` Martin K. Petersen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210707184351.67872-19-jsmart2021@gmail.com \
    --to=jsmart2021@gmail.com \
    --cc=justin.tee@broadcom.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.