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

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