Commit f3a03ee1 authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen

scsi: qla2xxx: Fix duplicate switch's Nport ID entries

Current code relies on switch to provide a unique combination of WWPN +
NPORTID to tract an FC port.  This patch tries to detect a case where switch
data base can get corrupted where multiple WWPNs can have the same Nport ID.
The 1st Nport ID on the list will be kept while the duplicate Nport ID will be
discarded.
Signed-off-by: default avatarQuinn Tran <quinn.tran@cavium.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7c388f91
...@@ -3619,9 +3619,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3619,9 +3619,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
fc_port_t *fcport; fc_port_t *fcport;
u32 i, rc; u32 i, rc;
bool found; bool found;
struct fab_scan_rp *rp; struct fab_scan_rp *rp, *trp;
unsigned long flags; unsigned long flags;
u8 recheck = 0; u8 recheck = 0;
u16 dup = 0, dup_cnt = 0;
ql_dbg(ql_dbg_disc, vha, 0xffff, ql_dbg(ql_dbg_disc, vha, 0xffff,
"%s enter\n", __func__); "%s enter\n", __func__);
...@@ -3652,6 +3653,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3652,6 +3653,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
for (i = 0; i < vha->hw->max_fibre_devices; i++) { for (i = 0; i < vha->hw->max_fibre_devices; i++) {
u64 wwn; u64 wwn;
int k;
rp = &vha->scan.l[i]; rp = &vha->scan.l[i];
found = false; found = false;
...@@ -3660,6 +3662,20 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3660,6 +3662,20 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
if (wwn == 0) if (wwn == 0)
continue; continue;
/* Remove duplicate NPORT ID entries from switch data base */
for (k = i + 1; k < vha->hw->max_fibre_devices; k++) {
trp = &vha->scan.l[k];
if (rp->id.b24 == trp->id.b24) {
dup = 1;
dup_cnt++;
ql_dbg(ql_dbg_disc + ql_dbg_verbose,
vha, 0xffff,
"Detected duplicate NPORT ID from switch data base: ID %06x WWN %8phN WWN %8phN\n",
rp->id.b24, rp->port_name, trp->port_name);
memset(trp, 0, sizeof(*trp));
}
}
if (!memcmp(rp->port_name, vha->port_name, WWN_SIZE)) if (!memcmp(rp->port_name, vha->port_name, WWN_SIZE))
continue; continue;
...@@ -3699,6 +3715,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3699,6 +3715,12 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
} }
} }
if (dup) {
ql_log(ql_log_warn, vha, 0xffff,
"Detected %d duplicate NPORT ID(s) from switch data base\n",
dup_cnt);
}
/* /*
* Logout all previous fabric dev marked lost, except FCP2 devices. * Logout all previous fabric dev marked lost, except FCP2 devices.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment