]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scsi: qla2xxx: unregister ports after GPN_FT failure
authorMartin Wilck <mwilck@suse.com>
Fri, 22 Nov 2019 22:19:24 +0000 (22:19 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 27 Nov 2019 02:33:56 +0000 (21:33 -0500)
When ports are lost due to unzoning them, and the initiator port is
not part of any more zones, the GPN_FT command used for the fabric
scan may fail. In this case, the current code simply gives up after a
few retries. But if the zone is gone, all rports should actually be
marked as lost.

Fix this by jumping to the code that handles logout after GNN_FT after
scan retries are exhausted.

Fixes: f352eeb75419 ("scsi: qla2xxx: Add ability to use GPNFT/GNNFT for RSCN handling")
Link: https://lore.kernel.org/r/20191122221912.20100-3-martin.wilck@suse.com
Tested-by: Jason Orendorf <orendorf@hpe.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Acked-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gs.c

index 67230688b05ec8fb7595afc05ed4623eacde298a..446a9d6ba25506dc06ab9c4d6a6f083f4e056ebf 100644 (file)
@@ -3587,12 +3587,23 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
                if (vha->scan.scan_retry < MAX_SCAN_RETRIES) {
                        set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
                        set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
+                       goto out;
                } else {
-                       ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0xffff,
+                       ql_dbg(ql_dbg_disc, vha, 0xffff,
                            "%s: Fabric scan failed for %d retries.\n",
                            __func__, vha->scan.scan_retry);
+                       /*
+                        * Unable to scan any rports. logout loop below
+                        * will unregister all sessions.
+                        */
+                       list_for_each_entry(fcport, &vha->vp_fcports, list) {
+                               if ((fcport->flags & FCF_FABRIC_DEVICE) != 0) {
+                                       fcport->scan_state = QLA_FCPORT_SCAN;
+                                       fcport->logout_on_delete = 0;
+                               }
+                       }
+                       goto login_logout;
                }
-               goto out;
        }
        vha->scan.scan_retry = 0;
 
@@ -3670,6 +3681,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
                    dup_cnt);
        }
 
+login_logout:
        /*
         * Logout all previous fabric dev marked lost, except FCP2 devices.
         */