Daniel Wagner f39f25
From: Quinn Tran <qutran@marvell.com>
Daniel Wagner f39f25
Date: Mon, 6 Jun 2022 21:46:21 -0700
Daniel Wagner f39f25
Subject: scsi: qla2xxx: edif: Fix potential stuck session in sa update
Denis Kirjanov 718367
Patch-mainline: v5.20-rc1
Daniel Wagner f39f25
Git-commit: e0fb8ce2bb9e52c846e54ad2c58b5b7beb13eb09
Daniel Wagner f39f25
References: bsc#1201958
Daniel Wagner f39f25
Daniel Wagner f39f25
When a thread is in the process of reestablish a session, a flag is set to
Daniel Wagner f39f25
prevent multiple threads/triggers from doing the same task. This flag was
Daniel Wagner f39f25
left on, and any attempt to relogin was locked out. Clear this flag if the
Daniel Wagner f39f25
attempt has failed.
Daniel Wagner f39f25
Daniel Wagner f39f25
Link: https://lore.kernel.org/r/20220607044627.19563-6-njavali@marvell.com
Daniel Wagner f39f25
Fixes: dd30706e73b7 ("scsi: qla2xxx: edif: Add key update")
Daniel Wagner f39f25
Signed-off-by: Quinn Tran <qutran@marvell.com>
Daniel Wagner f39f25
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner f39f25
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner f39f25
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner f39f25
---
Daniel Wagner f39f25
 drivers/scsi/qla2xxx/qla_edif.c |   17 ++++++++++++++---
Daniel Wagner f39f25
 1 file changed, 14 insertions(+), 3 deletions(-)
Daniel Wagner f39f25
Daniel Wagner f39f25
--- a/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner f39f25
+++ b/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner f39f25
@@ -2331,6 +2331,7 @@ edif_doorbell_show(struct device *dev, s
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 static void qla_noop_sp_done(srb_t *sp, int res)
Daniel Wagner f39f25
 {
Daniel Wagner f39f25
+	sp->fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
Daniel Wagner f39f25
 	/* ref: INIT */
Daniel Wagner f39f25
 	kref_put(&sp->cmd_kref, qla2x00_sp_release);
Daniel Wagner f39f25
 }
Daniel Wagner f39f25
@@ -2355,7 +2356,8 @@ qla24xx_issue_sa_replace_iocb(scsi_qla_h
Daniel Wagner f39f25
 	if (!sa_ctl) {
Daniel Wagner f39f25
 		ql_dbg(ql_dbg_edif, vha, 0x70e6,
Daniel Wagner f39f25
 		    "sa_ctl allocation failed\n");
Daniel Wagner f39f25
-		return -ENOMEM;
Daniel Wagner f39f25
+		rval =  -ENOMEM;
Daniel Wagner f39f25
+		goto done;
Daniel Wagner f39f25
 	}
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 	fcport = sa_ctl->fcport;
Daniel Wagner f39f25
@@ -2365,7 +2367,8 @@ qla24xx_issue_sa_replace_iocb(scsi_qla_h
Daniel Wagner f39f25
 	if (!sp) {
Daniel Wagner f39f25
 		ql_dbg(ql_dbg_edif, vha, 0x70e6,
Daniel Wagner f39f25
 		 "SRB allocation failed\n");
Daniel Wagner f39f25
-		return -ENOMEM;
Daniel Wagner f39f25
+		rval = -ENOMEM;
Daniel Wagner f39f25
+		goto done;
Daniel Wagner f39f25
 	}
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 	fcport->flags |= FCF_ASYNC_SENT;
Daniel Wagner f39f25
@@ -2394,10 +2397,18 @@ qla24xx_issue_sa_replace_iocb(scsi_qla_h
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 	rval = qla2x00_start_sp(sp);
Daniel Wagner f39f25
 
Daniel Wagner f39f25
-	if (rval != QLA_SUCCESS)
Daniel Wagner f39f25
+	if (rval != QLA_SUCCESS) {
Daniel Wagner f39f25
 		rval = QLA_FUNCTION_FAILED;
Daniel Wagner f39f25
+		goto done_free_sp;
Daniel Wagner f39f25
+	}
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 	return rval;
Daniel Wagner f39f25
+done_free_sp:
Daniel Wagner f39f25
+	kref_put(&sp->cmd_kref, qla2x00_sp_release);
Daniel Wagner f39f25
+	fcport->flags &= ~FCF_ASYNC_SENT;
Daniel Wagner f39f25
+done:
Daniel Wagner f39f25
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
Daniel Wagner f39f25
+	return rval;
Daniel Wagner f39f25
 }
Daniel Wagner f39f25
 
Daniel Wagner f39f25
 void qla24xx_sa_update_iocb(srb_t *sp, struct sa_update_28xx *sa_update_iocb)