Blame SOURCES/0141-scsi-scsi-qla2xxx-Do-command-completion-on-abort-tim.patch

3d7c23
From f7760f66fe00084dc1bb92a003e1dd7c915c44e9 Mon Sep 17 00:00:00 2001
3d7c23
From: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Date: Thu, 21 Nov 2019 16:36:51 -0500
3d7c23
Subject: [PATCH 141/155] [scsi] scsi: qla2xxx: Do command completion on abort
3d7c23
 timeout
3d7c23
3d7c23
Message-id: <20191121163701.43688-17-hmadhani@redhat.com>
3d7c23
Patchwork-id: 287854
3d7c23
O-Subject: [RHLE 7.8 e-stor PATCH v3 16/26] scsi: qla2xxx: Do command completion on abort timeout
3d7c23
Bugzilla: 1731581
3d7c23
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
3d7c23
RH-Acked-by: Ewan Milne <emilne@redhat.com>
3d7c23
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
3d7c23
3d7c23
From: Quinn Tran <qutran@marvell.com>
3d7c23
3d7c23
Bugzilla 1731581
3d7c23
3d7c23
On switch, fabric and mgt command timeout, driver send Abort to tell FW to
3d7c23
return the original command.  If abort is timeout, then return both Abort
3d7c23
and original command for cleanup.
3d7c23
3d7c23
Fixes: 219d27d7147e0 ("scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands")
3d7c23
Cc: stable@vger.kernel.org # 5.2
3d7c23
Link: https://lore.kernel.org/r/20191105150657.8092-3-hmadhani@marvell.com
3d7c23
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
3d7c23
Signed-off-by: Quinn Tran <qutran@marvell.com>
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
3d7c23
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
3d7c23
(cherry picked from commit 71c80b75ce8f08c0978ce9a9816b81b5c3ce5e12)
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Signed-off-by: Jan Stancek <jstancek@redhat.com>
3d7c23
---
3d7c23
 drivers/scsi/qla2xxx/qla_def.h  |  1 +
3d7c23
 drivers/scsi/qla2xxx/qla_init.c | 18 ++++++++++++++++++
3d7c23
 2 files changed, 19 insertions(+)
3d7c23
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
3d7c23
index 61c67c99e0c3..980e9a914d80 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_def.h
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_def.h
3d7c23
@@ -552,6 +552,7 @@ typedef struct srb {
3d7c23
 	const char *name;
3d7c23
 	int iocbs;
3d7c23
 	struct qla_qpair *qpair;
3d7c23
+	struct srb *cmd_sp;
3d7c23
 	struct list_head elem;
3d7c23
 	u32 gen1;	/* scratch */
3d7c23
 	u32 gen2;	/* scratch */
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
3d7c23
index 10a1690a802d..d6feda133149 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_init.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_init.c
3d7c23
@@ -103,8 +103,22 @@ static void qla24xx_abort_iocb_timeout(void *data)
3d7c23
 	u32 handle;
3d7c23
 	unsigned long flags;
3d7c23
 
3d7c23
+	if (sp->cmd_sp)
3d7c23
+		ql_dbg(ql_dbg_async, sp->vha, 0x507c,
3d7c23
+		    "Abort timeout - cmd hdl=%x, cmd type=%x hdl=%x, type=%x\n",
3d7c23
+		    sp->cmd_sp->handle, sp->cmd_sp->type,
3d7c23
+		    sp->handle, sp->type);
3d7c23
+	else
3d7c23
+		ql_dbg(ql_dbg_async, sp->vha, 0x507c,
3d7c23
+		    "Abort timeout 2 - hdl=%x, type=%x\n",
3d7c23
+		    sp->handle, sp->type);
3d7c23
+
3d7c23
 	spin_lock_irqsave(qpair->qp_lock_ptr, flags);
3d7c23
 	for (handle = 1; handle < qpair->req->num_outstanding_cmds; handle++) {
3d7c23
+		if (sp->cmd_sp && (qpair->req->outstanding_cmds[handle] ==
3d7c23
+		    sp->cmd_sp))
3d7c23
+			qpair->req->outstanding_cmds[handle] = NULL;
3d7c23
+
3d7c23
 		/* removing the abort */
3d7c23
 		if (qpair->req->outstanding_cmds[handle] == sp) {
3d7c23
 			qpair->req->outstanding_cmds[handle] = NULL;
3d7c23
@@ -113,6 +127,9 @@ static void qla24xx_abort_iocb_timeout(void *data)
3d7c23
 	}
3d7c23
 	spin_unlock_irqrestore(qpair->qp_lock_ptr, flags);
3d7c23
 
3d7c23
+	if (sp->cmd_sp)
3d7c23
+		sp->cmd_sp->done(sp->cmd_sp, QLA_OS_TIMER_EXPIRED);
3d7c23
+
3d7c23
 	abt->u.abt.comp_status = CS_TIMEOUT;
3d7c23
 	sp->done(sp, QLA_OS_TIMER_EXPIRED);
3d7c23
 }
3d7c23
@@ -147,6 +164,7 @@ static int qla24xx_async_abort_cmd(srb_t *cmd_sp, bool wait)
3d7c23
 	sp->type = SRB_ABT_CMD;
3d7c23
 	sp->name = "abort";
3d7c23
 	sp->qpair = cmd_sp->qpair;
3d7c23
+	sp->cmd_sp = cmd_sp;
3d7c23
 	if (wait)
3d7c23
 		sp->flags = SRB_WAKEUP_ON_COMP;
3d7c23
 
3d7c23
-- 
3d7c23
2.13.6
3d7c23