scsi: lpfc: Fix rediscovery on switch blade pull
authorDick Kennedy <dick.kennedy@broadcom.com>
Wed, 23 Aug 2017 23:55:32 +0000 (16:55 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 25 Aug 2017 02:29:35 +0000 (22:29 -0400)
When the switch blade is pulled out then plugged back in, the driver
does not issue a PLOGI to the target

When the switch blade is pulled out, it does not reset the link. The
driver ends up issuing a LOGO to the target, and finally sees devloss.
Since the driver believes that a LOGO is outstanding, it does not issue
a PLOGI to the target upon link up

Correct by placing the ndlp in UNUSED state When devloss happens in
LOGO_ISSUE state.

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

index 95b2b43ac37d4b0ba57645b5512fe09b48cf7cb6..a4488d6339c1d59b42e1179efd47419687accd5e 100644 (file)
@@ -2192,12 +2192,15 @@ lpfc_device_rm_logo_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
                          void *arg, uint32_t evt)
 {
        /*
-        * Take no action.  If a LOGO is outstanding, then possibly DevLoss has
-        * timed out and is calling for Device Remove.  In this case, the LOGO
-        * must be allowed to complete in state LOGO_ISSUE so that the rpi
-        * and other NLP flags are correctly cleaned up.
+        * DevLoss has timed out and is calling for Device Remove.
+        * In this case, abort the LOGO and cleanup the ndlp
         */
-       return ndlp->nlp_state;
+
+       lpfc_unreg_rpi(vport, ndlp);
+       /* software abort outstanding PLOGI */
+       lpfc_els_abort(vport->phba, ndlp);
+       lpfc_drop_node(vport, ndlp);
+       return NLP_STE_FREED_NODE;
 }
 
 static uint32_t