scsi: lpfc: Fix SCSI lun discovery when port configured for both SCSI and NVME
authorJames Smart <jsmart2021@gmail.com>
Mon, 5 Mar 2018 20:04:06 +0000 (12:04 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Mar 2018 01:55:23 +0000 (21:55 -0400)
When a port is configured for NVME and SCSI Initiator support and it probes
a target supporting both SCSI and NVME, NVME devices are discovered, but
SCSI devices are not.

The nlp_fc4_type for all NPorts should be cleared on Link Up or just before
GID_FTs get issued, as opposed to just during GID_FT cmpl.  RSCN activity as
well as Link Up can trigger GID_FT.  One GID_FT may complete before the next
one is issued.

Fix by clearng nlp_fc4_type on link up and just before both GID_FTs are
issued.  During port swapping, copy nlp_fc4_type to the new ndlp

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_ct.c
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_hbadisc.c

index ebe8ac1b88e726876c30577d912209daa79d5322..0617c8ea88c6fd582a56e14bbbb62b8df76ed4e6 100644 (file)
@@ -471,7 +471,6 @@ lpfc_prep_node_fc4type(struct lpfc_vport *vport, uint32_t Did, uint8_t fc4_type)
                                "Parse GID_FTrsp: did:x%x flg:x%x x%x",
                                Did, ndlp->nlp_flag, vport->fc_flag);
 
-                       ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
                        /* By default, the driver expects to support FCP FC4 */
                        if (fc4_type == FC_TYPE_FCP)
                                ndlp->nlp_fc4_type |= NLP_FC4_FCP;
index 09e4eb9fbc69b564fb8e1461ea2493c95bfc85e6..74895e62aaeaab6ae30d4d0b4cf206911a9c2739 100644 (file)
@@ -1661,6 +1661,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                if (ndlp->nrport) {
                        ndlp->nrport = NULL;
                        lpfc_nlp_put(ndlp);
+                       new_ndlp->nlp_fc4_type = ndlp->nlp_fc4_type;
                }
 
                /* We shall actually free the ndlp with both nlp_DID and
index 7855afa13568e36cdff0c1ce8376789b82594d1a..3e7712cd6c9ac525705d7e8226b33881b2312f0a 100644 (file)
@@ -959,6 +959,7 @@ lpfc_linkup_cleanup_nodes(struct lpfc_vport *vport)
        struct lpfc_nodelist *ndlp;
 
        list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
+               ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
                if (!NLP_CHK_NODE_ACT(ndlp))
                        continue;
                if (ndlp->nlp_state == NLP_STE_UNUSED_NODE)
@@ -3875,6 +3876,10 @@ int
 lpfc_issue_gidft(struct lpfc_vport *vport)
 {
        struct lpfc_hba *phba = vport->phba;
+       struct lpfc_nodelist *ndlp;
+
+       list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp)
+               ndlp->nlp_fc4_type &= ~(NLP_FC4_FCP | NLP_FC4_NVME);
 
        /* Good status, issue CT Request to NameServer */
        if ((phba->cfg_enable_fc4_type == LPFC_ENABLE_BOTH) ||