Blame SOURCES/0006-scsi-scsi-qla2xxx-Fix-session-cleanup-hang.patch

3d7c23
From dd167cef787e435604d9553b022a8328b8c167dc Mon Sep 17 00:00:00 2001
3d7c23
From: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Date: Thu, 1 Aug 2019 15:54:26 -0400
3d7c23
Subject: [PATCH 006/124] [scsi] scsi: qla2xxx: Fix session cleanup hang
3d7c23
3d7c23
Message-id: <20190801155618.12650-7-hmadhani@redhat.com>
3d7c23
Patchwork-id: 267790
3d7c23
O-Subject: [RHEL 7.8 e-stor PATCH 006/118] scsi: qla2xxx: Fix session cleanup hang
3d7c23
Bugzilla: 1729270
3d7c23
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
3d7c23
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
3d7c23
3d7c23
From: Quinn Tran <quinn.tran@cavium.com>
3d7c23
3d7c23
Bugzilla 1729270
3d7c23
3d7c23
On session cleanup, either an implicit LOGO or an implicit PRLO is used to
3d7c23
flush IOs.  If the flush command hit Queue Full condition, then it is
3d7c23
dropped.  This patch adds retry code to prevent command drop.
3d7c23
3d7c23
Signed-off-by: Quinn Tran <quinn.tran@cavium.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 80676d054e5a945f8192802b68093764fbf3c5fc)
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Signed-off-by: Jan Stancek <jstancek@redhat.com>
3d7c23
---
3d7c23
 drivers/scsi/qla2xxx/qla_iocb.c |  5 ++---
3d7c23
 drivers/scsi/qla2xxx/qla_os.c   | 17 +++++++++++++----
3d7c23
 2 files changed, 15 insertions(+), 7 deletions(-)
3d7c23
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
index b0ab5d362f64..348d9d3bf590 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
@@ -3716,23 +3716,22 @@ qla24xx_prlo_iocb(srb_t *sp, struct logio_entry_24xx *logio)
3d7c23
 int
3d7c23
 qla2x00_start_sp(srb_t *sp)
3d7c23
 {
3d7c23
-	int rval;
3d7c23
+	int rval = QLA_SUCCESS;
3d7c23
 	scsi_qla_host_t *vha = sp->vha;
3d7c23
 	struct qla_hw_data *ha = vha->hw;
3d7c23
 	struct qla_qpair *qp = sp->qpair;
3d7c23
 	void *pkt;
3d7c23
 	unsigned long flags;
3d7c23
 
3d7c23
-	rval = QLA_FUNCTION_FAILED;
3d7c23
 	spin_lock_irqsave(qp->qp_lock_ptr, flags);
3d7c23
 	pkt = __qla2x00_alloc_iocbs(sp->qpair, sp);
3d7c23
 	if (!pkt) {
3d7c23
+		rval = EAGAIN;
3d7c23
 		ql_log(ql_log_warn, vha, 0x700c,
3d7c23
 		    "qla2x00_alloc_iocbs failed.\n");
3d7c23
 		goto done;
3d7c23
 	}
3d7c23
 
3d7c23
-	rval = QLA_SUCCESS;
3d7c23
 	switch (sp->type) {
3d7c23
 	case SRB_LOGIN_CMD:
3d7c23
 		IS_FWI2_CAPABLE(ha) ?
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
3d7c23
index 399a9072ae02..ee09796b9847 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_os.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_os.c
3d7c23
@@ -5298,14 +5298,14 @@ qla2x00_do_work(struct scsi_qla_host *vha)
3d7c23
 	struct qla_work_evt *e, *tmp;
3d7c23
 	unsigned long flags;
3d7c23
 	LIST_HEAD(work);
3d7c23
+	int rc;
3d7c23
 
3d7c23
 	spin_lock_irqsave(&vha->work_lock, flags);
3d7c23
 	list_splice_init(&vha->work_list, &work);
3d7c23
 	spin_unlock_irqrestore(&vha->work_lock, flags);
3d7c23
 
3d7c23
 	list_for_each_entry_safe(e, tmp, &work, list) {
3d7c23
-		list_del_init(&e->list);
3d7c23
-
3d7c23
+		rc = QLA_SUCCESS;
3d7c23
 		switch (e->type) {
3d7c23
 		case QLA_EVT_AEN:
3d7c23
 			fc_host_post_event(vha->host, fc_get_event_number(),
3d7c23
@@ -5319,7 +5319,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
3d7c23
 			    e->u.logio.data);
3d7c23
 			break;
3d7c23
 		case QLA_EVT_ASYNC_LOGOUT:
3d7c23
-			qla2x00_async_logout(vha, e->u.logio.fcport);
3d7c23
+			rc = qla2x00_async_logout(vha, e->u.logio.fcport);
3d7c23
 			break;
3d7c23
 		case QLA_EVT_ASYNC_LOGOUT_DONE:
3d7c23
 			qla2x00_async_logout_done(vha, e->u.logio.fcport,
3d7c23
@@ -5364,7 +5364,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)
3d7c23
 			qla24xx_do_nack_work(vha, e);
3d7c23
 			break;
3d7c23
 		case QLA_EVT_ASYNC_PRLO:
3d7c23
-			qla2x00_async_prlo(vha, e->u.logio.fcport);
3d7c23
+			rc = qla2x00_async_prlo(vha, e->u.logio.fcport);
3d7c23
 			break;
3d7c23
 		case QLA_EVT_ASYNC_PRLO_DONE:
3d7c23
 			qla2x00_async_prlo_done(vha, e->u.logio.fcport,
3d7c23
@@ -5397,6 +5397,15 @@ qla2x00_do_work(struct scsi_qla_host *vha)
3d7c23
 			    e->u.fcport.fcport, false);
3d7c23
 			break;
3d7c23
 		}
3d7c23
+
3d7c23
+		if (rc == EAGAIN) {
3d7c23
+			/* put 'work' at head of 'vha->work_list' */
3d7c23
+			spin_lock_irqsave(&vha->work_lock, flags);
3d7c23
+			list_splice(&work, &vha->work_list);
3d7c23
+			spin_unlock_irqrestore(&vha->work_lock, flags);
3d7c23
+			break;
3d7c23
+		}
3d7c23
+		list_del_init(&e->list);
3d7c23
 		if (e->flags & QLA_EVT_FLAG_FREE)
3d7c23
 			kfree(e);
3d7c23
 
3d7c23
-- 
3d7c23
2.13.6
3d7c23