Daniel Wagner 9e6802
From: Arun Easi <aeasi@marvell.com>
Daniel Wagner 9e6802
Date: Wed, 15 Jun 2022 22:35:06 -0700
Daniel Wagner 9e6802
Subject: scsi: qla2xxx: Fix losing FCP-2 targets on long port disable with
Daniel Wagner 9e6802
 I/Os
Denis Kirjanov 718367
Patch-mainline: v5.20-rc1
Daniel Wagner 9e6802
Git-commit: 2416ccd3815ba1613e10a6da0a24ef21acfe5633
Daniel Wagner 9e6802
References: bsc#1201958
Daniel Wagner 9e6802
Daniel Wagner 9e6802
FCP-2 devices were not coming back online once they were lost, login
Daniel Wagner 9e6802
retries exhausted, and then came back up.  Fix this by accepting RSCN when
Daniel Wagner 9e6802
the device is not online.
Daniel Wagner 9e6802
Daniel Wagner 9e6802
Link: https://lore.kernel.org/r/20220616053508.27186-10-njavali@marvell.com
Daniel Wagner 9e6802
Fixes: 44c57f205876 ("scsi: qla2xxx: Changes to support FCP2 Target")
Daniel Wagner 9e6802
Cc: stable@vger.kernel.org
Daniel Wagner 9e6802
Signed-off-by: Arun Easi <aeasi@marvell.com>
Daniel Wagner 9e6802
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner 9e6802
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner 9e6802
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner 9e6802
---
Daniel Wagner 9e6802
 drivers/scsi/qla2xxx/qla_init.c |   12 ++++++++----
Daniel Wagner 9e6802
 1 file changed, 8 insertions(+), 4 deletions(-)
Daniel Wagner 9e6802
Daniel Wagner 9e6802
--- a/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 9e6802
+++ b/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 9e6802
@@ -1835,7 +1835,8 @@ void qla2x00_handle_rscn(scsi_qla_host_t
Daniel Wagner 9e6802
 	case RSCN_PORT_ADDR:
Daniel Wagner 9e6802
 		fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1);
Daniel Wagner 9e6802
 		if (fcport) {
Daniel Wagner 9e6802
-			if (fcport->flags & FCF_FCP2_DEVICE) {
Daniel Wagner 9e6802
+			if (fcport->flags & FCF_FCP2_DEVICE &&
Daniel Wagner 9e6802
+			    atomic_read(&fcport->state) == FCS_ONLINE) {
Daniel Wagner 9e6802
 				ql_dbg(ql_dbg_disc, vha, 0x2115,
Daniel Wagner 9e6802
 				       "Delaying session delete for FCP2 portid=%06x %8phC ",
Daniel Wagner 9e6802
 					fcport->d_id.b24, fcport->port_name);
Daniel Wagner 9e6802
@@ -1867,7 +1868,8 @@ void qla2x00_handle_rscn(scsi_qla_host_t
Daniel Wagner 9e6802
 		break;
Daniel Wagner 9e6802
 	case RSCN_AREA_ADDR:
Daniel Wagner 9e6802
 		list_for_each_entry(fcport, &vha->vp_fcports, list) {
Daniel Wagner 9e6802
-			if (fcport->flags & FCF_FCP2_DEVICE)
Daniel Wagner 9e6802
+			if (fcport->flags & FCF_FCP2_DEVICE &&
Daniel Wagner 9e6802
+			    atomic_read(&fcport->state) == FCS_ONLINE)
Daniel Wagner 9e6802
 				continue;
Daniel Wagner 9e6802
 
Daniel Wagner 9e6802
 			if ((ea->id.b24 & 0xffff00) == (fcport->d_id.b24 & 0xffff00)) {
Daniel Wagner 9e6802
@@ -1878,7 +1880,8 @@ void qla2x00_handle_rscn(scsi_qla_host_t
Daniel Wagner 9e6802
 		break;
Daniel Wagner 9e6802
 	case RSCN_DOM_ADDR:
Daniel Wagner 9e6802
 		list_for_each_entry(fcport, &vha->vp_fcports, list) {
Daniel Wagner 9e6802
-			if (fcport->flags & FCF_FCP2_DEVICE)
Daniel Wagner 9e6802
+			if (fcport->flags & FCF_FCP2_DEVICE &&
Daniel Wagner 9e6802
+			    atomic_read(&fcport->state) == FCS_ONLINE)
Daniel Wagner 9e6802
 				continue;
Daniel Wagner 9e6802
 
Daniel Wagner 9e6802
 			if ((ea->id.b24 & 0xff0000) == (fcport->d_id.b24 & 0xff0000)) {
Daniel Wagner 9e6802
@@ -1890,7 +1893,8 @@ void qla2x00_handle_rscn(scsi_qla_host_t
Daniel Wagner 9e6802
 	case RSCN_FAB_ADDR:
Daniel Wagner 9e6802
 	default:
Daniel Wagner 9e6802
 		list_for_each_entry(fcport, &vha->vp_fcports, list) {
Daniel Wagner 9e6802
-			if (fcport->flags & FCF_FCP2_DEVICE)
Daniel Wagner 9e6802
+			if (fcport->flags & FCF_FCP2_DEVICE &&
Daniel Wagner 9e6802
+			    atomic_read(&fcport->state) == FCS_ONLINE)
Daniel Wagner 9e6802
 				continue;
Daniel Wagner 9e6802
 
Daniel Wagner 9e6802
 			fcport->scan_needed = 1;