scsi: lpfc: Correct loss of fc4 type on remote port address change
authorJames Smart <jsmart2021@gmail.com>
Tue, 23 Oct 2018 20:41:09 +0000 (13:41 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 Dec 2019 08:14:10 +0000 (09:14 +0100)
[ Upstream commit d83ca3ea833d7a66d49225e4191c4e37cab8f079 ]

An address change for a remote port cause PRLI for the wrong protocol
to be sent.  The node copy done in the discovery code skipped copying
the fc4 protocols supported as well.

Fix the copy logic for the address change.  Beefed up log messages in
this area as well.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_nportdisc.c

index 95449f97101d38c614d93340cbf996c90b712943..e5db20e8979d59415da939300fc0e87bf9bd5075 100644 (file)
@@ -1550,8 +1550,10 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
         */
        new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName);
 
+       /* return immediately if the WWPN matches ndlp */
        if (new_ndlp == ndlp && NLP_CHK_NODE_ACT(new_ndlp))
                return ndlp;
+
        if (phba->sli_rev == LPFC_SLI_REV4) {
                active_rrqs_xri_bitmap = mempool_alloc(phba->active_rrq_pool,
                                                       GFP_KERNEL);
@@ -1560,9 +1562,13 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                               phba->cfg_rrq_xri_bitmap_sz);
        }
 
-       lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
-                "3178 PLOGI confirm: ndlp %p x%x: new_ndlp %p\n",
-                ndlp, ndlp->nlp_DID, new_ndlp);
+       lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
+                        "3178 PLOGI confirm: ndlp x%x x%x x%x: "
+                        "new_ndlp x%x x%x x%x\n",
+                        ndlp->nlp_DID, ndlp->nlp_flag,  ndlp->nlp_fc4_type,
+                        (new_ndlp ? new_ndlp->nlp_DID : 0),
+                        (new_ndlp ? new_ndlp->nlp_flag : 0),
+                        (new_ndlp ? new_ndlp->nlp_fc4_type : 0));
 
        if (!new_ndlp) {
                rc = memcmp(&ndlp->nlp_portname, name,
@@ -1611,6 +1617,14 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                               phba->cfg_rrq_xri_bitmap_sz);
        }
 
+       /* At this point in this routine, we know new_ndlp will be
+        * returned. however, any previous GID_FTs that were done
+        * would have updated nlp_fc4_type in ndlp, so we must ensure
+        * new_ndlp has the right value.
+        */
+       if (vport->fc_flag & FC_FABRIC)
+               new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type;
+
        lpfc_unreg_rpi(vport, new_ndlp);
        new_ndlp->nlp_DID = ndlp->nlp_DID;
        new_ndlp->nlp_prev_state = ndlp->nlp_prev_state;
@@ -1732,6 +1746,12 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
            active_rrqs_xri_bitmap)
                mempool_free(active_rrqs_xri_bitmap,
                             phba->active_rrq_pool);
+
+       lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS | LOG_NODE,
+                        "3173 PLOGI confirm exit: new_ndlp x%x x%x x%x\n",
+                        new_ndlp->nlp_DID, new_ndlp->nlp_flag,
+                        new_ndlp->nlp_fc4_type);
+
        return new_ndlp;
 }
 
index a0658d15822872ddb8a3c8c179fa0b022e1dd4cb..043bca6449cd0352243147a4a5648674a8595937 100644 (file)
@@ -2829,8 +2829,9 @@ lpfc_disc_state_machine(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
        /* DSM in event <evt> on NPort <nlp_DID> in state <cur_state> */
        lpfc_printf_vlog(vport, KERN_INFO, LOG_DISCOVERY,
                         "0211 DSM in event x%x on NPort x%x in "
-                        "state %d Data: x%x\n",
-                        evt, ndlp->nlp_DID, cur_state, ndlp->nlp_flag);
+                        "state %d Data: x%x x%x\n",
+                        evt, ndlp->nlp_DID, cur_state,
+                        ndlp->nlp_flag, ndlp->nlp_fc4_type);
 
        lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_DSM,
                 "DSM in:          evt:%d ste:%d did:x%x",