scsi: qla2xxx: Fix path recovery
authorQuinn Tran <quinn.tran@cavium.com>
Fri, 2 Jun 2017 16:11:56 +0000 (09:11 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 00:48:07 +0000 (20:48 -0400)
If the port is moved/changed, current code would trigger
a deletion. If the port is already deleted, then do relogin.

Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Reviewed-by: Bart Van Assche <Bart.VanAssche@sandisk.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_gs.c

index 9bc9aa9e164ab56852b70fb956d6f8e8206d5612..5acebaf57796a24179f25f9cf0f2efceec44bf6d 100644 (file)
@@ -3118,16 +3118,27 @@ void qla24xx_handle_gpnid_event(scsi_qla_host_t *vha, struct event_arg *ea)
 
        if (fcport) {
                /* cable moved. just plugged in */
-               ql_dbg(ql_dbg_disc, vha, 0xffff,
-                          "%s %d %8phC post del sess\n",
-                          __func__, __LINE__, fcport->port_name);
-
                fcport->rscn_gen++;
                fcport->d_id = ea->id;
                fcport->scan_state = QLA_FCPORT_FOUND;
                fcport->flags |= FCF_FABRIC_DEVICE;
 
-               qlt_schedule_sess_for_deletion_lock(fcport);
+               switch (fcport->disc_state) {
+               case DSC_DELETED:
+                       ql_dbg(ql_dbg_disc, vha, 0x210d,
+                           "%s %d %8phC login\n", __func__, __LINE__,
+                           fcport->port_name);
+                       qla24xx_fcport_handle_login(vha, fcport);
+                       break;
+               case DSC_DELETE_PEND:
+                       break;
+               default:
+                       ql_dbg(ql_dbg_disc, vha, 0x2064,
+                           "%s %d %8phC post del sess\n",
+                           __func__, __LINE__, fcport->port_name);
+                       qlt_schedule_sess_for_deletion_lock(fcport);
+                       break;
+               }
        } else {
                /* create new fcport */
                ql_dbg(ql_dbg_disc, vha, 0xffff,