]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
scsi: lpfc: Fix nvmet node ref count handling
authorJames Smart <jsmart2021@gmail.com>
Fri, 2 Jun 2017 04:07:00 +0000 (21:07 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 01:37:30 +0000 (21:37 -0400)
When unloading the driver, the NVMET driver would wait the full 30
seconds for its UNMAPPED initiator node to get removed before continuing
with the unload process.  NVMEI worked correctly.

For each rport put into UNMAPPED or MAPPED state by NVMET, the driver
puts a reference on the NDLP.  The difference is that NVMEI has a
unregister call for its rports and the extra reference is removed in the
unregister process.  For NVMET, the driver has to remove the reference
explicitly when dropping out of UNMAPPED or MAPPED because there is no
unregister call.

Add a call to lpfc_nlp_put on the ndlp when NVMET and the old state was
UNMAPPED or MAPPED.

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_hbadisc.c

index 055fedd761ead03543b9c3e5629d5195670cd772..db2d0e692ddf97b467cbe9d3e0222a1f388d5ca0 100644 (file)
@@ -4167,14 +4167,14 @@ lpfc_nlp_state_cleanup(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
                        lpfc_unregister_remote_port(ndlp);
                }
 
-               /* Notify the NVME transport of this rport's loss on the
-                * Initiator.  For NVME Target, should upcall transport
-                * in the else clause when API available.
-                */
                if (ndlp->nlp_fc4_type & NLP_FC4_NVME) {
                        vport->phba->nport_event_cnt++;
                        if (vport->phba->nvmet_support == 0)
+                               /* Start devloss */
                                lpfc_nvme_unregister_port(vport, ndlp);
+                       else
+                               /* NVMET has no upcall. */
+                               lpfc_nlp_put(ndlp);
                }
        }