--- /dev/null
+From d9ee65539d3eabd9ade46cca1780e3309ad0f907 Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+Date: Tue, 6 Mar 2018 12:47:08 -0500
+Subject: NFS: Fix an incorrect type in struct nfs_direct_req
+
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+
+commit d9ee65539d3eabd9ade46cca1780e3309ad0f907 upstream.
+
+The start offset needs to be of type loff_t.
+
+Fixed: 5fadeb47dcc5c ("nfs: count DIO good bytes correctly with mirroring")
+Cc: stable@vger.kernel.org # v4.0+
+Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/nfs/direct.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -86,10 +86,10 @@ struct nfs_direct_req {
+ struct nfs_direct_mirror mirrors[NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX];
+ int mirror_count;
+
++ loff_t io_start; /* Start offset for I/O */
+ ssize_t count, /* bytes actually processed */
+ max_count, /* max expected count */
+ bytes_left, /* bytes left to be sent */
+- io_start, /* start of IO */
+ error; /* any reported error */
+ struct completion completion; /* wait for i/o completion */
+
--- /dev/null
+From c4f24df942a181699c5bab01b8e5e82b925f77f3 Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+Date: Wed, 7 Mar 2018 15:22:31 -0500
+Subject: NFS: Fix unstable write completion
+
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+
+commit c4f24df942a181699c5bab01b8e5e82b925f77f3 upstream.
+
+We do want to respect the FLUSH_SYNC argument to nfs_commit_inode() to
+ensure that all outstanding COMMIT requests to the inode in question are
+complete. Currently we may exit early from both nfs_commit_inode() and
+nfs_write_inode() even if there are COMMIT requests in flight, or unstable
+writes on the commit list.
+
+In order to get the right semantics w.r.t. sync_inode(), we don't need
+to have nfs_commit_inode() reset the inode dirty flags when called from
+nfs_wb_page() and/or nfs_wb_all(). We just need to ensure that
+nfs_write_inode() leaves them in the right state if there are outstanding
+commits, or stable pages.
+
+Reported-by: Scott Mayhew <smayhew@redhat.com>
+Fixes: dc4fd9ab01ab ("nfs: don't wait on commit in nfs_commit_inode()...")
+Cc: stable@vger.kernel.org # v4.14+
+Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/nfs/write.c | 83 +++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 43 insertions(+), 40 deletions(-)
+
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -1877,40 +1877,43 @@ int nfs_generic_commit_list(struct inode
+ return status;
+ }
+
+-int nfs_commit_inode(struct inode *inode, int how)
++static int __nfs_commit_inode(struct inode *inode, int how,
++ struct writeback_control *wbc)
+ {
+ LIST_HEAD(head);
+ struct nfs_commit_info cinfo;
+ int may_wait = how & FLUSH_SYNC;
+- int error = 0;
+- int res;
++ int ret, nscan;
+
+ nfs_init_cinfo_from_inode(&cinfo, inode);
+ nfs_commit_begin(cinfo.mds);
+- res = nfs_scan_commit(inode, &head, &cinfo);
+- if (res)
+- error = nfs_generic_commit_list(inode, &head, how, &cinfo);
++ for (;;) {
++ ret = nscan = nfs_scan_commit(inode, &head, &cinfo);
++ if (ret <= 0)
++ break;
++ ret = nfs_generic_commit_list(inode, &head, how, &cinfo);
++ if (ret < 0)
++ break;
++ ret = 0;
++ if (wbc && wbc->sync_mode == WB_SYNC_NONE) {
++ if (nscan < wbc->nr_to_write)
++ wbc->nr_to_write -= nscan;
++ else
++ wbc->nr_to_write = 0;
++ }
++ if (nscan < INT_MAX)
++ break;
++ cond_resched();
++ }
+ nfs_commit_end(cinfo.mds);
+- if (res == 0)
+- return res;
+- if (error < 0)
+- goto out_error;
+- if (!may_wait)
+- goto out_mark_dirty;
+- error = wait_on_commit(cinfo.mds);
+- if (error < 0)
+- return error;
+- return res;
+-out_error:
+- res = error;
+- /* Note: If we exit without ensuring that the commit is complete,
+- * we must mark the inode as dirty. Otherwise, future calls to
+- * sync_inode() with the WB_SYNC_ALL flag set will fail to ensure
+- * that the data is on the disk.
+- */
+-out_mark_dirty:
+- __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
+- return res;
++ if (ret || !may_wait)
++ return ret;
++ return wait_on_commit(cinfo.mds);
++}
++
++int nfs_commit_inode(struct inode *inode, int how)
++{
++ return __nfs_commit_inode(inode, how, NULL);
+ }
+ EXPORT_SYMBOL_GPL(nfs_commit_inode);
+
+@@ -1920,11 +1923,11 @@ int nfs_write_inode(struct inode *inode,
+ int flags = FLUSH_SYNC;
+ int ret = 0;
+
+- /* no commits means nothing needs to be done */
+- if (!atomic_long_read(&nfsi->commit_info.ncommit))
+- return ret;
+-
+ if (wbc->sync_mode == WB_SYNC_NONE) {
++ /* no commits means nothing needs to be done */
++ if (!atomic_long_read(&nfsi->commit_info.ncommit))
++ goto check_requests_outstanding;
++
+ /* Don't commit yet if this is a non-blocking flush and there
+ * are a lot of outstanding writes for this mapping.
+ */
+@@ -1935,16 +1938,16 @@ int nfs_write_inode(struct inode *inode,
+ flags = 0;
+ }
+
+- ret = nfs_commit_inode(inode, flags);
+- if (ret >= 0) {
+- if (wbc->sync_mode == WB_SYNC_NONE) {
+- if (ret < wbc->nr_to_write)
+- wbc->nr_to_write -= ret;
+- else
+- wbc->nr_to_write = 0;
+- }
+- return 0;
+- }
++ ret = __nfs_commit_inode(inode, flags, wbc);
++ if (!ret) {
++ if (flags & FLUSH_SYNC)
++ return 0;
++ } else if (atomic_long_read(&nfsi->commit_info.ncommit))
++ goto out_mark_dirty;
++
++check_requests_outstanding:
++ if (!atomic_read(&nfsi->commit_info.rpcs_out))
++ return ret;
+ out_mark_dirty:
+ __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
+ return ret;
--- /dev/null
+From 9c6376ebddad585da4238532dd6d90ae23ffee67 Mon Sep 17 00:00:00 2001
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+Date: Wed, 7 Mar 2018 14:49:06 -0500
+Subject: pNFS: Prevent the layout header refcount going to zero in pnfs_roc()
+
+From: Trond Myklebust <trond.myklebust@primarydata.com>
+
+commit 9c6376ebddad585da4238532dd6d90ae23ffee67 upstream.
+
+Ensure that we hold a reference to the layout header when processing
+the pNFS return-on-close so that the refcount value does not inadvertently
+go to zero.
+
+Reported-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de>
+Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
+Cc: stable@vger.kernel.org # v4.10+
+Tested-by: Tigran Mkrtchyan <tigran.mkrtchyan@desy.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/nfs/pnfs.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+--- a/fs/nfs/pnfs.c
++++ b/fs/nfs/pnfs.c
+@@ -292,8 +292,11 @@ pnfs_detach_layout_hdr(struct pnfs_layou
+ void
+ pnfs_put_layout_hdr(struct pnfs_layout_hdr *lo)
+ {
+- struct inode *inode = lo->plh_inode;
++ struct inode *inode;
+
++ if (!lo)
++ return;
++ inode = lo->plh_inode;
+ pnfs_layoutreturn_before_put_layout_hdr(lo);
+
+ if (atomic_dec_and_lock(&lo->plh_refcount, &inode->i_lock)) {
+@@ -1223,10 +1226,12 @@ retry:
+ spin_lock(&ino->i_lock);
+ lo = nfsi->layout;
+ if (!lo || !pnfs_layout_is_valid(lo) ||
+- test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags))
++ test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) {
++ lo = NULL;
+ goto out_noroc;
++ }
++ pnfs_get_layout_hdr(lo);
+ if (test_bit(NFS_LAYOUT_RETURN_LOCK, &lo->plh_flags)) {
+- pnfs_get_layout_hdr(lo);
+ spin_unlock(&ino->i_lock);
+ wait_on_bit(&lo->plh_flags, NFS_LAYOUT_RETURN,
+ TASK_UNINTERRUPTIBLE);
+@@ -1294,10 +1299,12 @@ out_noroc:
+ struct pnfs_layoutdriver_type *ld = NFS_SERVER(ino)->pnfs_curr_ld;
+ if (ld->prepare_layoutreturn)
+ ld->prepare_layoutreturn(args);
++ pnfs_put_layout_hdr(lo);
+ return true;
+ }
+ if (layoutreturn)
+ pnfs_send_layoutreturn(lo, &stateid, iomode, true);
++ pnfs_put_layout_hdr(lo);
+ return false;
+ }
+
--- /dev/null
+From ba743f9148e951abe1c94f89c174ec8e44fb145b Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:12 -0800
+Subject: scsi: qla2xxx: Clear loop id after delete
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit ba743f9148e951abe1c94f89c174ec8e44fb145b upstream.
+
+Clear loop id after delete to prevent session invalidation of stale
+session.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_target.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -974,7 +974,7 @@ static void qlt_free_session_done(struct
+ qlt_send_first_logo(vha, &logo);
+ }
+
+- if (sess->logout_on_delete) {
++ if (sess->logout_on_delete && sess->loop_id != FC_NO_LOOP_ID) {
+ int rc;
+
+ rc = qla2x00_post_async_logout_work(vha, sess, NULL);
+@@ -1033,8 +1033,7 @@ static void qlt_free_session_done(struct
+ sess->login_succ = 0;
+ }
+
+- if (sess->chip_reset != ha->base_qpair->chip_reset)
+- qla2x00_clear_loop_id(sess);
++ qla2x00_clear_loop_id(sess);
+
+ if (sess->conflict) {
+ sess->conflict->login_pause = 0;
+@@ -4588,9 +4587,9 @@ qlt_find_sess_invalidate_other(scsi_qla_
+ "Invalidating sess %p loop_id %d wwn %llx.\n",
+ other_sess, other_sess->loop_id, other_wwn);
+
+-
+ other_sess->keep_nport_handle = 1;
+- *conflict_sess = other_sess;
++ if (other_sess->disc_state != DSC_DELETED)
++ *conflict_sess = other_sess;
+ qlt_schedule_sess_for_deletion(other_sess,
+ true);
+ }
--- /dev/null
+From 5d3300a9b8b122b4743aed5a178bf12c87e2b8c9 Mon Sep 17 00:00:00 2001
+From: Giridhar Malavali <giridhar.malavali@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:13 -0800
+Subject: scsi: qla2xxx: Defer processing of GS IOCB calls
+
+From: Giridhar Malavali <giridhar.malavali@cavium.com>
+
+commit 5d3300a9b8b122b4743aed5a178bf12c87e2b8c9 upstream.
+
+This patch defers processing of GS IOCB calls from interrupt context to
+avoid hardware spinlock recursion.
+
+Following stack trace is seen
+
+? mod_timer+0x193/0x330
+? ql_dbg+0xa7/0xf0 [qla2xxx]
+_raw_spin_lock_irqsave+0x31/0x40
+qla2x00_start_sp+0x3b/0x250 [qla2xxx]
+qla24xx_async_gnl+0x1d3/0x240 [qla2xxx]
+qla24xx_fcport_handle_login+0x285/0x290 [qla2xxx]
+? vprintk_func+0x20/0x50
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Giridhar Malavali <giridhar.malavali@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_init.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -973,7 +973,7 @@ int qla24xx_fcport_handle_login(struct s
+ ql_dbg(ql_dbg_disc, vha, 0x20bd,
+ "%s %d %8phC post gnl\n",
+ __func__, __LINE__, fcport->port_name);
+- qla24xx_async_gnl(vha, fcport);
++ qla24xx_post_gnl_work(vha, fcport);
+ } else {
+ ql_dbg(ql_dbg_disc, vha, 0x20bf,
+ "%s %d %8phC post login\n",
+@@ -1142,7 +1142,7 @@ void qla24xx_handle_relogin_event(scsi_q
+ ql_dbg(ql_dbg_disc, vha, 0x20e9, "%s %d %8phC post gidpn\n",
+ __func__, __LINE__, fcport->port_name);
+
+- qla24xx_async_gidpn(vha, fcport);
++ qla24xx_post_gidpn_work(vha, fcport);
+ return;
+ }
+
--- /dev/null
+From b0dcce746b32ac573343ad39cb3dc485030de95e Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:09 -0800
+Subject: scsi: qla2xxx: Fix abort command deadlock due to spinlock
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit b0dcce746b32ac573343ad39cb3dc485030de95e upstream.
+
+Original code acquires hardware_lock to add Abort IOCB onto driver
+request queue for processing. However, abort_command() will also acquire
+hardware lock to look up sp pointer before issuing abort IOCB command
+resulting into a deadlock. This patch safely removes the possible
+deadlock scenario by removing extra spinlock.
+
+Fixes: 6eb54715b54bb ("qla2xxx: Added interface to send explicit LOGO.")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_iocb.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_iocb.c
++++ b/drivers/scsi/qla2xxx/qla_iocb.c
+@@ -2394,7 +2394,6 @@ qla2x00_els_dcmd_iocb_timeout(void *data
+ struct scsi_qla_host *vha = sp->vha;
+ struct qla_hw_data *ha = vha->hw;
+ struct srb_iocb *lio = &sp->u.iocb_cmd;
+- unsigned long flags = 0;
+
+ ql_dbg(ql_dbg_io, vha, 0x3069,
+ "%s Timeout, hdl=%x, portid=%02x%02x%02x\n",
+@@ -2402,7 +2401,6 @@ qla2x00_els_dcmd_iocb_timeout(void *data
+ fcport->d_id.b.al_pa);
+
+ /* Abort the exchange */
+- spin_lock_irqsave(&ha->hardware_lock, flags);
+ if (ha->isp_ops->abort_command(sp)) {
+ ql_dbg(ql_dbg_io, vha, 0x3070,
+ "mbx abort_command failed.\n");
+@@ -2410,7 +2408,6 @@ qla2x00_els_dcmd_iocb_timeout(void *data
+ ql_dbg(ql_dbg_io, vha, 0x3071,
+ "mbx abort_command success.\n");
+ }
+- spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
+ complete(&lio->u.els_logo.comp);
+ }
--- /dev/null
+From 22e786ea47f8795c561e1a01b6a66bb2cae2fc20 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:44:57 -0800
+Subject: scsi: qla2xxx: Fix gpnid error processing
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 22e786ea47f8795c561e1a01b6a66bb2cae2fc20 upstream.
+
+Stop GPNID command from advancing if command has failed.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_gs.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/scsi/qla2xxx/qla_gs.c
++++ b/drivers/scsi/qla2xxx/qla_gs.c
+@@ -3211,6 +3211,11 @@ static void qla2x00_async_gpnid_sp_done(
+ sp->name, res, ct_req->req.port_id.port_id,
+ ct_rsp->rsp.gpn_id.port_name);
+
++ if (res) {
++ sp->free(sp);
++ return;
++ }
++
+ memset(&ea, 0, sizeof(ea));
+ memcpy(ea.port_name, ct_rsp->rsp.gpn_id.port_name, WWN_SIZE);
+ ea.sp = sp;
--- /dev/null
+From 414d9ff3f8039f85d23f619dcbbd1ba2628a1a67 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:03 -0800
+Subject: scsi: qla2xxx: Fix login state machine stuck at GPDB
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 414d9ff3f8039f85d23f619dcbbd1ba2628a1a67 upstream.
+
+This patch returns discovery state machine back to Login Complete.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_init.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -864,6 +864,7 @@ void qla24xx_handle_gpdb_event(scsi_qla_
+ int rval = ea->rc;
+ fc_port_t *fcport = ea->fcport;
+ unsigned long flags;
++ u16 opt = ea->sp->u.iocb_cmd.u.mbx.out_mb[10];
+
+ fcport->flags &= ~FCF_ASYNC_SENT;
+
+@@ -894,7 +895,8 @@ void qla24xx_handle_gpdb_event(scsi_qla_
+ }
+
+ spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
+- ea->fcport->login_gen++;
++ if (opt != PDO_FORCE_ADISC)
++ ea->fcport->login_gen++;
+ ea->fcport->deleted = 0;
+ ea->fcport->logout_on_delete = 1;
+
+@@ -918,6 +920,13 @@ void qla24xx_handle_gpdb_event(scsi_qla_
+
+ qla24xx_post_gpsc_work(vha, fcport);
+ }
++ } else if (ea->fcport->login_succ) {
++ /*
++ * We have an existing session. A late RSCN delivery
++ * must have triggered the session to be re-validate.
++ * session is still valid.
++ */
++ fcport->disc_state = DSC_LOGIN_COMPLETE;
+ }
+ spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
+ } /* gpdb event */
--- /dev/null
+From 7867b98dceb7741065c9c1b645136facad5c2e93 Mon Sep 17 00:00:00 2001
+From: "himanshu.madhani@cavium.com" <himanshu.madhani@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:16 -0800
+Subject: scsi: qla2xxx: Fix memory leak in dual/target mode
+
+From: himanshu.madhani@cavium.com <himanshu.madhani@cavium.com>
+
+commit 7867b98dceb7741065c9c1b645136facad5c2e93 upstream.
+
+When driver is loaded in Target/Dual mode, it creates QPair to support
+MQ and allocates resources for each QPair. This Qpair initialization is
+delayed until the FW personality is changed to Dual/Target mode by
+issuing chip reset. At the time of chip reset firmware is re-initilized
+in correct personality all the QPairs are initialized by sending
+MBC_INITIALIZE_MULTIQ (001Fh).
+
+This patch fixes memory leak by adding check to issue
+MBC_INITIALIZE_MULTIQ command only while deleting rsp/req queue when the
+flag is set for initiator mode, and clean up QPair resources correctly
+during the driver unload. This MBX does not need to be issued for
+Target/Dual mode because chip reset will reset ISP.
+
+Fixes: d65237c7f0860 ("scsi: qla2xxx: Fix mailbox failure while deleting Queue pairs")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_init.c | 4 +---
+ drivers/scsi/qla2xxx/qla_mid.c | 18 ++++++++++--------
+ 2 files changed, 11 insertions(+), 11 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -8092,9 +8092,6 @@ int qla2xxx_delete_qpair(struct scsi_qla
+ int ret = QLA_FUNCTION_FAILED;
+ struct qla_hw_data *ha = qpair->hw;
+
+- if (!vha->flags.qpairs_req_created && !vha->flags.qpairs_rsp_created)
+- goto fail;
+-
+ qpair->delete_in_progress = 1;
+ while (atomic_read(&qpair->ref_count))
+ msleep(500);
+@@ -8102,6 +8099,7 @@ int qla2xxx_delete_qpair(struct scsi_qla
+ ret = qla25xx_delete_req_que(vha, qpair->req);
+ if (ret != QLA_SUCCESS)
+ goto fail;
++
+ ret = qla25xx_delete_rsp_que(vha, qpair->rsp);
+ if (ret != QLA_SUCCESS)
+ goto fail;
+--- a/drivers/scsi/qla2xxx/qla_mid.c
++++ b/drivers/scsi/qla2xxx/qla_mid.c
+@@ -575,14 +575,15 @@ qla25xx_free_rsp_que(struct scsi_qla_hos
+ int
+ qla25xx_delete_req_que(struct scsi_qla_host *vha, struct req_que *req)
+ {
+- int ret = -1;
++ int ret = QLA_SUCCESS;
+
+- if (req) {
++ if (req && vha->flags.qpairs_req_created) {
+ req->options |= BIT_0;
+ ret = qla25xx_init_req_que(vha, req);
++ if (ret != QLA_SUCCESS)
++ return QLA_FUNCTION_FAILED;
+ }
+- if (ret == QLA_SUCCESS)
+- qla25xx_free_req_que(vha, req);
++ qla25xx_free_req_que(vha, req);
+
+ return ret;
+ }
+@@ -590,14 +591,15 @@ qla25xx_delete_req_que(struct scsi_qla_h
+ int
+ qla25xx_delete_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
+ {
+- int ret = -1;
++ int ret = QLA_SUCCESS;
+
+- if (rsp) {
++ if (rsp && vha->flags.qpairs_rsp_created) {
+ rsp->options |= BIT_0;
+ ret = qla25xx_init_rsp_que(vha, rsp);
++ if (ret != QLA_SUCCESS)
++ return QLA_FUNCTION_FAILED;
+ }
+- if (ret == QLA_SUCCESS)
+- qla25xx_free_rsp_que(vha, rsp);
++ qla25xx_free_rsp_que(vha, rsp);
+
+ return ret;
+ }
--- /dev/null
+From 3be63b1e1838e35ce93e83f19573e949f4b389b4 Mon Sep 17 00:00:00 2001
+From: Sawan Chandak <sawan.chandak@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:04 -0800
+Subject: scsi: qla2xxx: Fix NPIV host cleanup in target mode
+
+From: Sawan Chandak <sawan.chandak@cavium.com>
+
+commit 3be63b1e1838e35ce93e83f19573e949f4b389b4 upstream.
+
+Add check to make sure we are cleaning up global target host list only
+for NPIV hosts
+
+Fixes: bdbe24de281e2 ("scsi: qla2xxx: Cleanup NPIV host in target mode during config teardown")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Sawan Chandak <sawan.chandak@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_target.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -1561,8 +1561,11 @@ static void qlt_release(struct qla_tgt *
+
+ btree_destroy64(&tgt->lun_qpair_map);
+
+- if (ha->tgt.tgt_ops && ha->tgt.tgt_ops->remove_target)
+- ha->tgt.tgt_ops->remove_target(vha);
++ if (vha->vp_idx)
++ if (ha->tgt.tgt_ops &&
++ ha->tgt.tgt_ops->remove_target &&
++ vha->vha_tgt.target_lport_ptr)
++ ha->tgt.tgt_ops->remove_target(vha);
+
+ vha->vha_tgt.qla_tgt = NULL;
+
--- /dev/null
+From 23c645595dab7b414f23639d0a428a07515807df Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:08 -0800
+Subject: scsi: qla2xxx: Fix PRLI state check
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 23c645595dab7b414f23639d0a428a07515807df upstream.
+
+Get Port Database MBX cmd is to validate current Login state upon PRLI
+completion. Current code looks at the last login state for re-validation
+which was incorrect. This patch removed incorrect state check.
+
+Fixes: 15f30a5752287 ("qla2xxx: Use IOCB interface to submit non-critical MBX.")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_mbx.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_mbx.c
++++ b/drivers/scsi/qla2xxx/qla_mbx.c
+@@ -6078,8 +6078,7 @@ int __qla24xx_parse_gpdb(struct scsi_qla
+ }
+
+ /* Check for logged in state. */
+- if (current_login_state != PDS_PRLI_COMPLETE &&
+- last_login_state != PDS_PRLI_COMPLETE) {
++ if (current_login_state != PDS_PRLI_COMPLETE) {
+ ql_dbg(ql_dbg_mbx, vha, 0x119a,
+ "Unable to verify login-state (%x/%x) for loop_id %x.\n",
+ current_login_state, last_login_state, fcport->loop_id);
--- /dev/null
+From a084fd68e1d26174c4cc1a13fbb0112f468ff7f4 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:00 -0800
+Subject: scsi: qla2xxx: Fix re-login for Nport Handle in use
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit a084fd68e1d26174c4cc1a13fbb0112f468ff7f4 upstream.
+
+When NPort Handle is in use, driver needs to mark the handle as used and
+pick another. Instead, the code clears the handle and re-pick the same
+handle.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_gs.c | 16 ++++++++++----
+ drivers/scsi/qla2xxx/qla_init.c | 44 ++++++++++++++++++++++++++++++++++++----
+ drivers/scsi/qla2xxx/qla_isr.c | 5 ----
+ 3 files changed, 51 insertions(+), 14 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_gs.c
++++ b/drivers/scsi/qla2xxx/qla_gs.c
+@@ -2833,7 +2833,7 @@ void qla24xx_handle_gidpn_event(scsi_qla
+ }
+ } else { /* fcport->d_id.b24 != ea->id.b24 */
+ fcport->d_id.b24 = ea->id.b24;
+- if (fcport->deleted == QLA_SESS_DELETED) {
++ if (fcport->deleted != QLA_SESS_DELETED) {
+ ql_dbg(ql_dbg_disc, vha, 0x2021,
+ "%s %d %8phC post del sess\n",
+ __func__, __LINE__, fcport->port_name);
+@@ -3206,10 +3206,16 @@ static void qla2x00_async_gpnid_sp_done(
+ struct event_arg ea;
+ struct qla_work_evt *e;
+
+- ql_dbg(ql_dbg_disc, vha, 0x2066,
+- "Async done-%s res %x ID %3phC. %8phC\n",
+- sp->name, res, ct_req->req.port_id.port_id,
+- ct_rsp->rsp.gpn_id.port_name);
++ if (res)
++ ql_dbg(ql_dbg_disc, vha, 0x2066,
++ "Async done-%s fail res %x ID %3phC. %8phC\n",
++ sp->name, res, ct_req->req.port_id.port_id,
++ ct_rsp->rsp.gpn_id.port_name);
++ else
++ ql_dbg(ql_dbg_disc, vha, 0x2066,
++ "Async done-%s good ID %3phC. %8phC\n",
++ sp->name, ct_req->req.port_id.port_id,
++ ct_rsp->rsp.gpn_id.port_name);
+
+ if (res) {
+ sp->free(sp);
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -1445,6 +1445,8 @@ static void
+ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
+ {
+ port_id_t cid; /* conflict Nport id */
++ u16 lid;
++ struct fc_port *conflict_fcport;
+
+ switch (ea->data[0]) {
+ case MBS_COMMAND_COMPLETE:
+@@ -1460,8 +1462,12 @@ qla24xx_handle_plogi_done_event(struct s
+ qla24xx_post_prli_work(vha, ea->fcport);
+ } else {
+ ql_dbg(ql_dbg_disc, vha, 0x20ea,
+- "%s %d %8phC post gpdb\n",
+- __func__, __LINE__, ea->fcport->port_name);
++ "%s %d %8phC LoopID 0x%x in use with %06x. post gnl\n",
++ __func__, __LINE__, ea->fcport->port_name,
++ ea->fcport->loop_id, ea->fcport->d_id.b24);
++
++ set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
++ ea->fcport->loop_id = FC_NO_LOOP_ID;
+ ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
+ ea->fcport->logout_on_delete = 1;
+ ea->fcport->send_els_logo = 0;
+@@ -1506,8 +1512,38 @@ qla24xx_handle_plogi_done_event(struct s
+ ea->fcport->d_id.b.domain, ea->fcport->d_id.b.area,
+ ea->fcport->d_id.b.al_pa);
+
+- qla2x00_clear_loop_id(ea->fcport);
+- qla24xx_post_gidpn_work(vha, ea->fcport);
++ lid = ea->iop[1] & 0xffff;
++ qlt_find_sess_invalidate_other(vha,
++ wwn_to_u64(ea->fcport->port_name),
++ ea->fcport->d_id, lid, &conflict_fcport);
++
++ if (conflict_fcport) {
++ /*
++ * Another fcport share the same loop_id/nport id.
++ * Conflict fcport needs to finish cleanup before this
++ * fcport can proceed to login.
++ */
++ conflict_fcport->conflict = ea->fcport;
++ ea->fcport->login_pause = 1;
++
++ ql_dbg(ql_dbg_disc, vha, 0x20ed,
++ "%s %d %8phC NPortId %06x inuse with loopid 0x%x. post gidpn\n",
++ __func__, __LINE__, ea->fcport->port_name,
++ ea->fcport->d_id.b24, lid);
++ qla2x00_clear_loop_id(ea->fcport);
++ qla24xx_post_gidpn_work(vha, ea->fcport);
++ } else {
++ ql_dbg(ql_dbg_disc, vha, 0x20ed,
++ "%s %d %8phC NPortId %06x inuse with loopid 0x%x. sched delete\n",
++ __func__, __LINE__, ea->fcport->port_name,
++ ea->fcport->d_id.b24, lid);
++
++ qla2x00_clear_loop_id(ea->fcport);
++ set_bit(lid, vha->hw->loop_id_map);
++ ea->fcport->loop_id = lid;
++ ea->fcport->keep_nport_handle = 0;
++ qlt_schedule_sess_for_deletion(ea->fcport, false);
++ }
+ break;
+ }
+ return;
+--- a/drivers/scsi/qla2xxx/qla_isr.c
++++ b/drivers/scsi/qla2xxx/qla_isr.c
+@@ -2341,7 +2341,6 @@ qla2x00_status_entry(scsi_qla_host_t *vh
+ int res = 0;
+ uint16_t state_flags = 0;
+ uint16_t retry_delay = 0;
+- uint8_t no_logout = 0;
+
+ sts = (sts_entry_t *) pkt;
+ sts24 = (struct sts_entry_24xx *) pkt;
+@@ -2612,7 +2611,6 @@ check_scsi_status:
+ break;
+
+ case CS_PORT_LOGGED_OUT:
+- no_logout = 1;
+ case CS_PORT_CONFIG_CHG:
+ case CS_PORT_BUSY:
+ case CS_INCOMPLETE:
+@@ -2643,9 +2641,6 @@ check_scsi_status:
+ port_state_str[atomic_read(&fcport->state)],
+ comp_status);
+
+- if (no_logout)
+- fcport->logout_on_delete = 0;
+-
+ qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
+ qlt_schedule_sess_for_deletion_lock(fcport);
+ }
--- /dev/null
+From 4005a995668b8fd58f4cf1460dd4cf63efa18363 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:06 -0800
+Subject: scsi: qla2xxx: Fix Relogin being triggered too fast
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 4005a995668b8fd58f4cf1460dd4cf63efa18363 upstream.
+
+Current driver design schedules relogin process via DPC thread every 1
+second. In a large fabric, this DPC thread tries to schedule too many
+jobs and might get overloaded. As a result of this processing of DPC
+thread, it can schedule relogin earlier than 1 second.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_def.h | 1 +
+ drivers/scsi/qla2xxx/qla_mid.c | 22 ++++++++++++++--------
+ drivers/scsi/qla2xxx/qla_os.c | 22 ++++++++++++++--------
+ 3 files changed, 29 insertions(+), 16 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_def.h
++++ b/drivers/scsi/qla2xxx/qla_def.h
+@@ -4085,6 +4085,7 @@ typedef struct scsi_qla_host {
+ #define LOOP_READY 5
+ #define LOOP_DEAD 6
+
++ unsigned long relogin_jif;
+ unsigned long dpc_flags;
+ #define RESET_MARKER_NEEDED 0 /* Send marker to ISP. */
+ #define RESET_ACTIVE 1
+--- a/drivers/scsi/qla2xxx/qla_mid.c
++++ b/drivers/scsi/qla2xxx/qla_mid.c
+@@ -343,15 +343,21 @@ qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
+ "FCPort update end.\n");
+ }
+
+- if ((test_and_clear_bit(RELOGIN_NEEDED, &vha->dpc_flags)) &&
+- !test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags) &&
+- atomic_read(&vha->loop_state) != LOOP_DOWN) {
++ if (test_bit(RELOGIN_NEEDED, &vha->dpc_flags) &&
++ !test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags) &&
++ atomic_read(&vha->loop_state) != LOOP_DOWN) {
+
+- ql_dbg(ql_dbg_dpc, vha, 0x4018,
+- "Relogin needed scheduled.\n");
+- qla2x00_relogin(vha);
+- ql_dbg(ql_dbg_dpc, vha, 0x4019,
+- "Relogin needed end.\n");
++ if (!vha->relogin_jif ||
++ time_after_eq(jiffies, vha->relogin_jif)) {
++ vha->relogin_jif = jiffies + HZ;
++ clear_bit(RELOGIN_NEEDED, &vha->dpc_flags);
++
++ ql_dbg(ql_dbg_dpc, vha, 0x4018,
++ "Relogin needed scheduled.\n");
++ qla2x00_relogin(vha);
++ ql_dbg(ql_dbg_dpc, vha, 0x4019,
++ "Relogin needed end.\n");
++ }
+ }
+
+ if (test_and_clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags) &&
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -4860,7 +4860,7 @@ void qla2x00_relogin(struct scsi_qla_hos
+ */
+ if (atomic_read(&fcport->state) != FCS_ONLINE &&
+ fcport->login_retry && !(fcport->flags & FCF_ASYNC_SENT)) {
+- fcport->login_retry--;
++
+ if (fcport->flags & FCF_FABRIC_DEVICE) {
+ ql_dbg(ql_dbg_disc, fcport->vha, 0x2108,
+ "%s %8phC DS %d LS %d\n", __func__,
+@@ -4871,6 +4871,7 @@ void qla2x00_relogin(struct scsi_qla_hos
+ ea.fcport = fcport;
+ qla2x00_fcport_event_handler(vha, &ea);
+ } else {
++ fcport->login_retry--;
+ status = qla2x00_local_device_login(vha,
+ fcport);
+ if (status == QLA_SUCCESS) {
+@@ -5853,16 +5854,21 @@ qla2x00_do_dpc(void *data)
+ }
+
+ /* Retry each device up to login retry count */
+- if ((test_and_clear_bit(RELOGIN_NEEDED,
+- &base_vha->dpc_flags)) &&
++ if (test_bit(RELOGIN_NEEDED, &base_vha->dpc_flags) &&
+ !test_bit(LOOP_RESYNC_NEEDED, &base_vha->dpc_flags) &&
+ atomic_read(&base_vha->loop_state) != LOOP_DOWN) {
+
+- ql_dbg(ql_dbg_dpc, base_vha, 0x400d,
+- "Relogin scheduled.\n");
+- qla2x00_relogin(base_vha);
+- ql_dbg(ql_dbg_dpc, base_vha, 0x400e,
+- "Relogin end.\n");
++ if (!base_vha->relogin_jif ||
++ time_after_eq(jiffies, base_vha->relogin_jif)) {
++ base_vha->relogin_jif = jiffies + HZ;
++ clear_bit(RELOGIN_NEEDED, &base_vha->dpc_flags);
++
++ ql_dbg(ql_dbg_dpc, base_vha, 0x400d,
++ "Relogin scheduled.\n");
++ qla2x00_relogin(base_vha);
++ ql_dbg(ql_dbg_dpc, base_vha, 0x400e,
++ "Relogin end.\n");
++ }
+ }
+ loop_resync_check:
+ if (test_and_clear_bit(LOOP_RESYNC_NEEDED,
--- /dev/null
+From 76f9a2dd4c60183879a1898bcd56a1dbab19a85d Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:11 -0800
+Subject: scsi: qla2xxx: Fix scan state field for fcport
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 76f9a2dd4c60183879a1898bcd56a1dbab19a85d upstream.
+
+Add correct value of scan_state field indicating state of the FC port
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_target.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -5788,6 +5788,7 @@ static fc_port_t *qlt_get_port_database(
+ tfcp->port_type = fcport->port_type;
+ tfcp->supported_classes = fcport->supported_classes;
+ tfcp->flags |= fcport->flags;
++ tfcp->scan_state = QLA_FCPORT_FOUND;
+
+ del = fcport;
+ fcport = tfcp;
--- /dev/null
+From 2e01d0ba868ec1d4d55ddcba519339e072b0bf4d Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:44:56 -0800
+Subject: scsi: qla2xxx: Fix system crash for Notify ack timeout handling
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 2e01d0ba868ec1d4d55ddcba519339e072b0bf4d upstream.
+
+Fix NULL pointer crash due to missing timeout handling callback for
+Notify Ack IOCB.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_target.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -665,7 +665,7 @@ int qla24xx_async_notify_ack(scsi_qla_ho
+ qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha)+2);
+
+ sp->u.iocb_cmd.u.nack.ntfy = ntfy;
+-
++ sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
+ sp->done = qla2x00_async_nack_sp_done;
+
+ rval = qla2x00_start_sp(sp);
--- /dev/null
+From 19759033e0d0beed70421ab9258f5ede79e070ae Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:15 -0800
+Subject: scsi: qla2xxx: Fix system crash in qlt_plogi_ack_unref
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 19759033e0d0beed70421ab9258f5ede79e070ae upstream.
+
+Fix system crash due to NULL pointer access.
+
+qlt_plogi_ack_t and fc_port structures were not properly bound before
+calling qlt_plogi_ack_unref().
+
+RIP: 0010:qlt_plogi_ack_unref+0xa1/0x150 [qla2xxx]
+Call Trace:
+qla24xx_create_new_sess+0xb1/0x320 [qla2xxx]
+qla2x00_do_work+0x123/0x260 [qla2xxx]
+qla2x00_iocb_work_fn+0x30/0x40 [qla2xxx]
+process_one_work+0x1f3/0x530
+worker_thread+0x4e/0x480
+kthread+0x10c/0x140
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Giridhar Malavali <giridhar.malavali@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_os.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -4734,11 +4734,11 @@ void qla24xx_create_new_sess(struct scsi
+ } else {
+ list_add_tail(&fcport->list, &vha->vp_fcports);
+
+- if (pla) {
+- qlt_plogi_ack_link(vha, pla, fcport,
+- QLT_PLOGI_LINK_SAME_WWN);
+- pla->ref_count--;
+- }
++ }
++ if (pla) {
++ qlt_plogi_ack_link(vha, pla, fcport,
++ QLT_PLOGI_LINK_SAME_WWN);
++ pla->ref_count--;
+ }
+ }
+ spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
--- /dev/null
+From a01c77d2cbc45ba527e884e5c30363a1200a4130 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:44:58 -0800
+Subject: scsi: qla2xxx: Move session delete to driver work queue
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit a01c77d2cbc45ba527e884e5c30363a1200a4130 upstream.
+
+Move session delete from system work queue to driver's work queue for in
+time processing.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_os.c | 3 ++-
+ drivers/scsi/qla2xxx/qla_target.c | 3 ++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -3177,10 +3177,11 @@ qla2x00_probe_one(struct pci_dev *pdev,
+ host->can_queue, base_vha->req,
+ base_vha->mgmt_svr_loop_id, host->sg_tablesize);
+
++ ha->wq = alloc_workqueue("qla2xxx_wq", WQ_MEM_RECLAIM, 0);
++
+ if (ha->mqenable) {
+ bool mq = false;
+ bool startit = false;
+- ha->wq = alloc_workqueue("qla2xxx_wq", WQ_MEM_RECLAIM, 0);
+
+ if (QLA_TGT_MODE_ENABLED()) {
+ mq = true;
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -1205,7 +1205,8 @@ void qlt_schedule_sess_for_deletion(stru
+ ql_dbg(ql_dbg_tgt, sess->vha, 0xe001,
+ "Scheduling sess %p for deletion\n", sess);
+
+- schedule_work(&sess->del_work);
++ INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn);
++ queue_work(sess->vha->hw->wq, &sess->del_work);
+ }
+
+ void qlt_schedule_sess_for_deletion_lock(struct fc_port *sess)
--- /dev/null
+From bf07ef86e882013522876f7c834c8eea085f35b4 Mon Sep 17 00:00:00 2001
+From: Giridhar Malavali <giridhar.malavali@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:14 -0800
+Subject: scsi: qla2xxx: Remove aborting ELS IOCB call issued as part of timeout.
+
+From: Giridhar Malavali <giridhar.malavali@cavium.com>
+
+commit bf07ef86e882013522876f7c834c8eea085f35b4 upstream.
+
+This fix the spinlock recursion issue seen while unloading the driver.
+
+14 [ffff9f2e21e03db8] native_queued_spin_lock_slowpath at ffffffffad0d8802
+15 [ffff9f2e21e03dc0] do_raw_spin_lock at ffffffffad0d99e4
+16 [ffff9f2e21e03dd8] _raw_spin_lock_irqsave at ffffffffad652471
+17 [ffff9f2e21e03e00] qla2x00_els_dcmd_iocb_timeout at ffffffffc070cd63
+18 [ffff9f2e21e03e40] qla2x00_sp_timeout at ffffffffc06f06d3 [qla2xxx]
+19 [ffff9f2e21e03e68] call_timer_fn at ffffffffad0f97d8
+20 [ffff9f2e21e03ed8] run_timer_softirq at ffffffffad0faf47
+21 [ffff9f2e21e03f68] __softirqentry_text_start at ffffffffad655f32
+
+Fixes: 6eb54715b54bb ("qla2xxx: Added interface to send explicit LOGO.")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Giridhar Malavali <giridhar.malavali@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_iocb.c | 10 ----------
+ 1 file changed, 10 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_iocb.c
++++ b/drivers/scsi/qla2xxx/qla_iocb.c
+@@ -2392,7 +2392,6 @@ qla2x00_els_dcmd_iocb_timeout(void *data
+ srb_t *sp = data;
+ fc_port_t *fcport = sp->fcport;
+ struct scsi_qla_host *vha = sp->vha;
+- struct qla_hw_data *ha = vha->hw;
+ struct srb_iocb *lio = &sp->u.iocb_cmd;
+
+ ql_dbg(ql_dbg_io, vha, 0x3069,
+@@ -2400,15 +2399,6 @@ qla2x00_els_dcmd_iocb_timeout(void *data
+ sp->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area,
+ fcport->d_id.b.al_pa);
+
+- /* Abort the exchange */
+- if (ha->isp_ops->abort_command(sp)) {
+- ql_dbg(ql_dbg_io, vha, 0x3070,
+- "mbx abort_command failed.\n");
+- } else {
+- ql_dbg(ql_dbg_io, vha, 0x3071,
+- "mbx abort_command success.\n");
+- }
+-
+ complete(&lio->u.els_logo.comp);
+ }
+
--- /dev/null
+From 063b36d6b0ad74c748d536f5cb47bac2f850a0fa Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:10 -0800
+Subject: scsi: qla2xxx: Replace fcport alloc with qla2x00_alloc_fcport
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 063b36d6b0ad74c748d536f5cb47bac2f850a0fa upstream.
+
+Current code manually allocate an fcport structure that is not properly
+initialize. Replace kzalloc with qla2x00_alloc_fcport, so that all
+fields are initialized. Also set set scan flag to port found
+
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_target.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/scsi/qla2xxx/qla_target.c
++++ b/drivers/scsi/qla2xxx/qla_target.c
+@@ -5759,7 +5759,7 @@ static fc_port_t *qlt_get_port_database(
+ unsigned long flags;
+ u8 newfcport = 0;
+
+- fcport = kzalloc(sizeof(*fcport), GFP_KERNEL);
++ fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
+ if (!fcport) {
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf06f,
+ "qla_target(%d): Allocation of tmp FC port failed",
--- /dev/null
+From 25ad76b703d9ad536f3411b15b1070aeb059ab55 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:01 -0800
+Subject: scsi: qla2xxx: Retry switch command on time out
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 25ad76b703d9ad536f3411b15b1070aeb059ab55 upstream.
+
+Retry GID_PN & GPN_ID switch commands for time out case.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_gs.c | 34 ++++++++++++++++++++++++++--------
+ 1 file changed, 26 insertions(+), 8 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_gs.c
++++ b/drivers/scsi/qla2xxx/qla_gs.c
+@@ -175,6 +175,9 @@ qla2x00_chk_ms_status(scsi_qla_host_t *v
+ set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
+ }
+ break;
++ case CS_TIMEOUT:
++ rval = QLA_FUNCTION_TIMEOUT;
++ /* drop through */
+ default:
+ ql_dbg(ql_dbg_disc, vha, 0x2033,
+ "%s failed, completion status (%x) on port_id: "
+@@ -2889,9 +2892,22 @@ static void qla2x00_async_gidpn_sp_done(
+ ea.rc = res;
+ ea.event = FCME_GIDPN_DONE;
+
+- ql_dbg(ql_dbg_disc, vha, 0x204f,
+- "Async done-%s res %x, WWPN %8phC ID %3phC \n",
+- sp->name, res, fcport->port_name, id);
++ if (res == QLA_FUNCTION_TIMEOUT) {
++ ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
++ "Async done-%s WWPN %8phC timed out.\n",
++ sp->name, fcport->port_name);
++ qla24xx_post_gidpn_work(sp->vha, fcport);
++ sp->free(sp);
++ return;
++ } else if (res) {
++ ql_dbg(ql_dbg_disc, sp->vha, 0xffff,
++ "Async done-%s fail res %x, WWPN %8phC\n",
++ sp->name, res, fcport->port_name);
++ } else {
++ ql_dbg(ql_dbg_disc, vha, 0x204f,
++ "Async done-%s good WWPN %8phC ID %3phC\n",
++ sp->name, fcport->port_name, id);
++ }
+
+ qla2x00_fcport_event_handler(vha, &ea);
+
+@@ -3217,11 +3233,6 @@ static void qla2x00_async_gpnid_sp_done(
+ sp->name, ct_req->req.port_id.port_id,
+ ct_rsp->rsp.gpn_id.port_name);
+
+- if (res) {
+- sp->free(sp);
+- return;
+- }
+-
+ memset(&ea, 0, sizeof(ea));
+ memcpy(ea.port_name, ct_rsp->rsp.gpn_id.port_name, WWN_SIZE);
+ ea.sp = sp;
+@@ -3231,6 +3242,13 @@ static void qla2x00_async_gpnid_sp_done(
+ ea.rc = res;
+ ea.event = FCME_GPNID_DONE;
+
++ if (res) {
++ if (res == QLA_FUNCTION_TIMEOUT)
++ qla24xx_post_gpnid_work(sp->vha, &ea.id);
++ sp->free(sp);
++ return;
++ }
++
+ qla2x00_fcport_event_handler(vha, &ea);
+
+ e = qla2x00_alloc_work(vha, QLA_EVT_GPNID_DONE);
--- /dev/null
+From 2d73ac6102d943c4be4945735a338005359c6abc Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:45:02 -0800
+Subject: scsi: qla2xxx: Serialize GPNID for multiple RSCN
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit 2d73ac6102d943c4be4945735a338005359c6abc upstream.
+
+GPNID is triggered by RSCN. For multiple RSCNs of the same affected
+NPORT ID, serialize the GPNID to prevent confusion.
+
+Fixes: 726b85487067d ("qla2xxx: Add framework for async fabric discovery")
+Cc: <stable@vger.kernel.org> # 4.10+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_def.h | 48 ++++++++++++++++++++++-------------------
+ drivers/scsi/qla2xxx/qla_gs.c | 35 +++++++++++++++++++++++++----
+ drivers/scsi/qla2xxx/qla_isr.c | 2 -
+ drivers/scsi/qla2xxx/qla_os.c | 1
+ 4 files changed, 58 insertions(+), 28 deletions(-)
+
+--- a/drivers/scsi/qla2xxx/qla_def.h
++++ b/drivers/scsi/qla2xxx/qla_def.h
+@@ -315,6 +315,29 @@ struct srb_cmd {
+ /* To identify if a srb is of T10-CRC type. @sp => srb_t pointer */
+ #define IS_PROT_IO(sp) (sp->flags & SRB_CRC_CTX_DSD_VALID)
+
++/*
++ * 24 bit port ID type definition.
++ */
++typedef union {
++ uint32_t b24 : 24;
++
++ struct {
++#ifdef __BIG_ENDIAN
++ uint8_t domain;
++ uint8_t area;
++ uint8_t al_pa;
++#elif defined(__LITTLE_ENDIAN)
++ uint8_t al_pa;
++ uint8_t area;
++ uint8_t domain;
++#else
++#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
++#endif
++ uint8_t rsvd_1;
++ } b;
++} port_id_t;
++#define INVALID_PORT_ID 0xFFFFFF
++
+ struct els_logo_payload {
+ uint8_t opcode;
+ uint8_t rsvd[3];
+@@ -332,6 +355,7 @@ struct ct_arg {
+ u32 rsp_size;
+ void *req;
+ void *rsp;
++ port_id_t id;
+ };
+
+ /*
+@@ -480,6 +504,7 @@ typedef struct srb {
+ const char *name;
+ int iocbs;
+ struct qla_qpair *qpair;
++ struct list_head elem;
+ u32 gen1; /* scratch */
+ u32 gen2; /* scratch */
+ union {
+@@ -2144,28 +2169,6 @@ struct imm_ntfy_from_isp {
+ #define REQUEST_ENTRY_SIZE (sizeof(request_t))
+
+
+-/*
+- * 24 bit port ID type definition.
+- */
+-typedef union {
+- uint32_t b24 : 24;
+-
+- struct {
+-#ifdef __BIG_ENDIAN
+- uint8_t domain;
+- uint8_t area;
+- uint8_t al_pa;
+-#elif defined(__LITTLE_ENDIAN)
+- uint8_t al_pa;
+- uint8_t area;
+- uint8_t domain;
+-#else
+-#error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined!"
+-#endif
+- uint8_t rsvd_1;
+- } b;
+-} port_id_t;
+-#define INVALID_PORT_ID 0xFFFFFF
+
+ /*
+ * Switch info gathering structure.
+@@ -4223,6 +4226,7 @@ typedef struct scsi_qla_host {
+ wait_queue_head_t fcport_waitQ;
+ wait_queue_head_t vref_waitq;
+ uint8_t min_link_speed_feat;
++ struct list_head gpnid_list;
+ } scsi_qla_host_t;
+
+ struct qla27xx_image_status {
+--- a/drivers/scsi/qla2xxx/qla_gs.c
++++ b/drivers/scsi/qla2xxx/qla_gs.c
+@@ -3221,16 +3221,17 @@ static void qla2x00_async_gpnid_sp_done(
+ (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp;
+ struct event_arg ea;
+ struct qla_work_evt *e;
++ unsigned long flags;
+
+ if (res)
+ ql_dbg(ql_dbg_disc, vha, 0x2066,
+- "Async done-%s fail res %x ID %3phC. %8phC\n",
+- sp->name, res, ct_req->req.port_id.port_id,
++ "Async done-%s fail res %x rscn gen %d ID %3phC. %8phC\n",
++ sp->name, res, sp->gen1, ct_req->req.port_id.port_id,
+ ct_rsp->rsp.gpn_id.port_name);
+ else
+ ql_dbg(ql_dbg_disc, vha, 0x2066,
+- "Async done-%s good ID %3phC. %8phC\n",
+- sp->name, ct_req->req.port_id.port_id,
++ "Async done-%s good rscn gen %d ID %3phC. %8phC\n",
++ sp->name, sp->gen1, ct_req->req.port_id.port_id,
+ ct_rsp->rsp.gpn_id.port_name);
+
+ memset(&ea, 0, sizeof(ea));
+@@ -3242,11 +3243,20 @@ static void qla2x00_async_gpnid_sp_done(
+ ea.rc = res;
+ ea.event = FCME_GPNID_DONE;
+
++ spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
++ list_del(&sp->elem);
++ spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
++
+ if (res) {
+ if (res == QLA_FUNCTION_TIMEOUT)
+ qla24xx_post_gpnid_work(sp->vha, &ea.id);
+ sp->free(sp);
+ return;
++ } else if (sp->gen1) {
++ /* There was anoter RSNC for this Nport ID */
++ qla24xx_post_gpnid_work(sp->vha, &ea.id);
++ sp->free(sp);
++ return;
+ }
+
+ qla2x00_fcport_event_handler(vha, &ea);
+@@ -3282,8 +3292,9 @@ int qla24xx_async_gpnid(scsi_qla_host_t
+ {
+ int rval = QLA_FUNCTION_FAILED;
+ struct ct_sns_req *ct_req;
+- srb_t *sp;
++ srb_t *sp, *tsp;
+ struct ct_sns_pkt *ct_sns;
++ unsigned long flags;
+
+ if (!vha->flags.online)
+ goto done;
+@@ -3294,8 +3305,22 @@ int qla24xx_async_gpnid(scsi_qla_host_t
+
+ sp->type = SRB_CT_PTHRU_CMD;
+ sp->name = "gpnid";
++ sp->u.iocb_cmd.u.ctarg.id = *id;
++ sp->gen1 = 0;
+ qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
+
++ spin_lock_irqsave(&vha->hw->tgt.sess_lock, flags);
++ list_for_each_entry(tsp, &vha->gpnid_list, elem) {
++ if (tsp->u.iocb_cmd.u.ctarg.id.b24 == id->b24) {
++ tsp->gen1++;
++ spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
++ sp->free(sp);
++ goto done;
++ }
++ }
++ list_add_tail(&sp->elem, &vha->gpnid_list);
++ spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags);
++
+ sp->u.iocb_cmd.u.ctarg.req = dma_alloc_coherent(&vha->hw->pdev->dev,
+ sizeof(struct ct_sns_pkt), &sp->u.iocb_cmd.u.ctarg.req_dma,
+ GFP_KERNEL);
+--- a/drivers/scsi/qla2xxx/qla_isr.c
++++ b/drivers/scsi/qla2xxx/qla_isr.c
+@@ -1569,7 +1569,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vh
+ /* borrowing sts_entry_24xx.comp_status.
+ same location as ct_entry_24xx.comp_status
+ */
+- res = qla2x00_chk_ms_status(vha, (ms_iocb_entry_t *)pkt,
++ res = qla2x00_chk_ms_status(sp->vha, (ms_iocb_entry_t *)pkt,
+ (struct ct_sns_rsp *)sp->u.iocb_cmd.u.ctarg.rsp,
+ sp->name);
+ sp->done(sp, res);
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -4499,6 +4499,7 @@ struct scsi_qla_host *qla2x00_create_hos
+ INIT_LIST_HEAD(&vha->qp_list);
+ INIT_LIST_HEAD(&vha->gnl.fcports);
+ INIT_LIST_HEAD(&vha->nvme_rport_list);
++ INIT_LIST_HEAD(&vha->gpnid_list);
+
+ spin_lock_init(&vha->work_lock);
+ spin_lock_init(&vha->cmd_list_lock);
--- /dev/null
+From d68b850e1bfb9afb24b888a946165a186a710195 Mon Sep 17 00:00:00 2001
+From: Quinn Tran <quinn.tran@cavium.com>
+Date: Mon, 4 Dec 2017 14:44:59 -0800
+Subject: scsi: qla2xxx: Skip IRQ affinity for Target QPairs
+
+From: Quinn Tran <quinn.tran@cavium.com>
+
+commit d68b850e1bfb9afb24b888a946165a186a710195 upstream.
+
+Fix co-existence between Block MQ and Target Mode. Block MQ and
+initiator mode requires midlayer queue mapping to check for IRQ to be
+affinitized. For target mode, it's not the case.
+
+Fixes: 09620eeb62c41 ("scsi: qla2xxx: Add debug knob for user control workload")
+Cc: <stable@vger.kernel.org> # 4.12+
+Signed-off-by: Quinn Tran <quinn.tran@cavium.com>
+Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/scsi/qla2xxx/qla_os.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -6592,9 +6592,14 @@ qla83xx_disable_laser(scsi_qla_host_t *v
+
+ static int qla2xxx_map_queues(struct Scsi_Host *shost)
+ {
++ int rc;
+ scsi_qla_host_t *vha = (scsi_qla_host_t *)shost->hostdata;
+
+- return blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev);
++ if (USER_CTRL_IRQ(vha->hw))
++ rc = blk_mq_map_queues(&shost->tag_set);
++ else
++ rc = blk_mq_pci_map_queues(&shost->tag_set, vha->hw->pdev);
++ return rc;
+ }
+
+ static const struct pci_error_handlers qla2xxx_err_handler = {
tpm-delete-the-tpm_tis_clk_enable-flag.patch
tpm-remove-unused-variables.patch
tpm-only-attempt-to-disable-the-lpc-clkrun-if-is-already-enabled.patch
+scsi-qla2xxx-fix-system-crash-for-notify-ack-timeout-handling.patch
+scsi-qla2xxx-fix-gpnid-error-processing.patch
+scsi-qla2xxx-move-session-delete-to-driver-work-queue.patch
+scsi-qla2xxx-skip-irq-affinity-for-target-qpairs.patch
+scsi-qla2xxx-fix-re-login-for-nport-handle-in-use.patch
+scsi-qla2xxx-retry-switch-command-on-time-out.patch
+scsi-qla2xxx-serialize-gpnid-for-multiple-rscn.patch
+scsi-qla2xxx-fix-login-state-machine-stuck-at-gpdb.patch
+scsi-qla2xxx-fix-npiv-host-cleanup-in-target-mode.patch
+scsi-qla2xxx-fix-relogin-being-triggered-too-fast.patch
+scsi-qla2xxx-fix-prli-state-check.patch
+scsi-qla2xxx-fix-abort-command-deadlock-due-to-spinlock.patch
+scsi-qla2xxx-replace-fcport-alloc-with-qla2x00_alloc_fcport.patch
+scsi-qla2xxx-fix-scan-state-field-for-fcport.patch
+scsi-qla2xxx-clear-loop-id-after-delete.patch
+scsi-qla2xxx-defer-processing-of-gs-iocb-calls.patch
+scsi-qla2xxx-remove-aborting-els-iocb-call-issued-as-part-of-timeout.patch
+scsi-qla2xxx-fix-system-crash-in-qlt_plogi_ack_unref.patch
+scsi-qla2xxx-fix-memory-leak-in-dual-target-mode.patch
+nfs-fix-an-incorrect-type-in-struct-nfs_direct_req.patch
+pnfs-prevent-the-layout-header-refcount-going-to-zero-in-pnfs_roc.patch
+nfs-fix-unstable-write-completion.patch
rdma-ucma-limit-possible-option-size.patch
rdma-ucma-check-that-user-doesn-t-overflow-qp-state.patch
rdma-mlx5-fix-integer-overflow-while-resizing-cq.patch