| From c9408f1001e3ce1b1a31ffde40016cb9646726a7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 Sep 2018 10:18:25 -0700 |
| Subject: scsi: qla2xxx: Fix duplicate switch's Nport ID entries |
| |
| From: Quinn Tran <quinn.tran@cavium.com> |
| |
| [ Upstream commit f3a03ee1102a44ccbd2c5de80a6e862ba23e9b55 ] |
| |
| 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: Quinn Tran <quinn.tran@cavium.com> |
| Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/qla2xxx/qla_gs.c | 24 +++++++++++++++++++++++- |
| 1 file changed, 23 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c |
| index d611cf722244c..b8d3403c3c85a 100644 |
| --- a/drivers/scsi/qla2xxx/qla_gs.c |
| +++ b/drivers/scsi/qla2xxx/qla_gs.c |
| @@ -3902,9 +3902,10 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) |
| fc_port_t *fcport; |
| u32 i, rc; |
| bool found; |
| - struct fab_scan_rp *rp; |
| + struct fab_scan_rp *rp, *trp; |
| unsigned long flags; |
| u8 recheck = 0; |
| + u16 dup = 0, dup_cnt = 0; |
| |
| ql_dbg(ql_dbg_disc, vha, 0xffff, |
| "%s enter\n", __func__); |
| @@ -3935,6 +3936,7 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) |
| |
| for (i = 0; i < vha->hw->max_fibre_devices; i++) { |
| u64 wwn; |
| + int k; |
| |
| rp = &vha->scan.l[i]; |
| found = false; |
| @@ -3943,6 +3945,20 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) |
| if (wwn == 0) |
| 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)) |
| continue; |
| |
| @@ -3982,6 +3998,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. |
| */ |
| -- |
| 2.20.1 |
| |