scsi: qla2xxx: Set Nport ID for N2N
authorQuinn Tran <qutran@marvell.com>
Wed, 26 Feb 2020 22:40:21 +0000 (14:40 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 29 Feb 2020 01:32:37 +0000 (20:32 -0500)
When transitioning from loop to N2N, stale NPort ID is not
re-assigned. Stale ID can collide with remote device.  This patch will
re-assign NPort ID on N2N is detected.

Link: https://lore.kernel.org/r/20200226224022.24518-18-hmadhani@marvell.com
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_mbx.c

index dee7edc..9fd83d1 100644 (file)
@@ -3924,11 +3924,29 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
                                fcport->scan_state = QLA_FCPORT_SCAN;
                                fcport->n2n_flag = 0;
                        }
+                       id.b24 = 0;
+                       if (wwn_to_u64(vha->port_name) >
+                           wwn_to_u64(rptid_entry->u.f1.port_name)) {
+                               vha->d_id.b24 = 0;
+                               vha->d_id.b.al_pa = 1;
+                               ha->flags.n2n_bigger = 1;
+
+                               id.b.al_pa = 2;
+                               ql_dbg(ql_dbg_async, vha, 0x5075,
+                                   "Format 1: assign local id %x remote id %x\n",
+                                   vha->d_id.b24, id.b24);
+                       } else {
+                               ql_dbg(ql_dbg_async, vha, 0x5075,
+                                   "Format 1: Remote login - Waiting for WWPN %8phC.\n",
+                                   rptid_entry->u.f1.port_name);
+                               ha->flags.n2n_bigger = 0;
+                       }
 
                        fcport = qla2x00_find_fcport_by_wwpn(vha,
                            rptid_entry->u.f1.port_name, 1);
                        spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
 
+
                        if (fcport) {
                                fcport->plogi_nack_done_deadline = jiffies + HZ;
                                fcport->dm_login_expire = jiffies + 2*HZ;
@@ -3939,6 +3957,11 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
                                if (vha->flags.nvme_enabled)
                                        fcport->fc4_type |= FS_FC4TYPE_NVME;
 
+                               if (wwn_to_u64(vha->port_name) >
+                                   wwn_to_u64(fcport->port_name)) {
+                                       fcport->d_id = id;
+                               }
+
                                switch (fcport->disc_state) {
                                case DSC_DELETED:
                                        set_bit(RELOGIN_NEEDED,
@@ -3951,25 +3974,6 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
                                        break;
                                }
                        } else {
-                               id.b24 = 0;
-                               if (wwn_to_u64(vha->port_name) >
-                                   wwn_to_u64(rptid_entry->u.f1.port_name)) {
-                                       vha->d_id.b24 = 0;
-                                       vha->d_id.b.al_pa = 1;
-                                       ha->flags.n2n_bigger = 1;
-                                       ha->flags.n2n_ae = 0;
-
-                                       id.b.al_pa = 2;
-                                       ql_dbg(ql_dbg_async, vha, 0x5075,
-                                           "Format 1: assign local id %x remote id %x\n",
-                                           vha->d_id.b24, id.b24);
-                               } else {
-                                       ql_dbg(ql_dbg_async, vha, 0x5075,
-                                           "Format 1: Remote login - Waiting for WWPN %8phC.\n",
-                                           rptid_entry->u.f1.port_name);
-                                       ha->flags.n2n_bigger = 0;
-                                       ha->flags.n2n_ae = 1;
-                               }
                                qla24xx_post_newsess_work(vha, &id,
                                    rptid_entry->u.f1.port_name,
                                    rptid_entry->u.f1.node_name,