scsi: lpfc: Fix NVME PRLI handling during RSCN
authorDick Kennedy <dick.kennedy@broadcom.com>
Wed, 23 Aug 2017 23:55:39 +0000 (16:55 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Aug 2017 02:29:39 +0000 (22:29 -0400)
A race condition was found whereby the initiator would receive the RSCN
for a new NVME device before it had a chance to register its FC4 support
with the fabric. Thus, when queried by the initiator, it would see that
the target supported FC-NVME.

Corrected by making the assumption that the target always supports
FC-NVME thus a PRLI is sent. It's ok for the target to reject it.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_els.c

index ffbd3eddeabb4369cebc15ff15063fe43c2b91ea..6de470e158ef555cc64decbbdb0eedf894ef7fce 100644 (file)
@@ -2177,6 +2177,16 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
        uint16_t cmdsize;
        u32 local_nlp_type, elscmd;
 
+       /*
+        * If we are in RSCN mode, the FC4 types supported from a
+        * previous GFT_ID command may not be accurate. So, if we
+        * are a NVME Initiator, always look for the possibility of
+        * the remote NPort beng a NVME Target.
+        */
+       if (phba->sli_rev == LPFC_SLI_REV4 &&
+           vport->fc_flag & FC_RSCN_MODE &&
+           vport->nvmei_support)
+               ndlp->nlp_fc4_type |= NLP_FC4_NVME;
        local_nlp_type = ndlp->nlp_fc4_type;
 
  send_next_prli: