+++ /dev/null
-From 1d19f7800d643b270b28d0a969c5eca455d54397 Mon Sep 17 00:00:00 2001
-From: Nicholas Bellinger <nab@linux-iscsi.org>
-Date: Wed, 15 May 2013 01:30:01 -0700
-Subject: ib_srpt: Call target_sess_cmd_list_set_waiting during shutdown_session
-
-From: Nicholas Bellinger <nab@linux-iscsi.org>
-
-commit 1d19f7800d643b270b28d0a969c5eca455d54397 upstream.
-
-Given that srpt_release_channel_work() calls target_wait_for_sess_cmds()
-to allow outstanding se_cmd_t->cmd_kref a change to complete, the call
-to perform target_sess_cmd_list_set_waiting() needs to happen in
-srpt_shutdown_session()
-
-Also, this patch adds an explicit call to srpt_shutdown_session() within
-srpt_drain_channel() so that target_sess_cmd_list_set_waiting() will be
-called in the cases where TFO->shutdown_session() is not triggered
-directly by TCM.
-
-Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-Cc: Joern Engel <joern@logfs.org>
-Cc: Roland Dreier <roland@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/infiniband/ulp/srpt/ib_srpt.c | 32 ++++++++++++++++++++++++--------
- drivers/infiniband/ulp/srpt/ib_srpt.h | 1 +
- 2 files changed, 25 insertions(+), 8 deletions(-)
-
---- a/drivers/infiniband/ulp/srpt/ib_srpt.c
-+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
-@@ -2272,6 +2272,27 @@ static void srpt_close_ch(struct srpt_rd
- }
-
- /**
-+ * srpt_shutdown_session() - Whether or not a session may be shut down.
-+ */
-+static int srpt_shutdown_session(struct se_session *se_sess)
-+{
-+ struct srpt_rdma_ch *ch = se_sess->fabric_sess_ptr;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&ch->spinlock, flags);
-+ if (ch->in_shutdown) {
-+ spin_unlock_irqrestore(&ch->spinlock, flags);
-+ return true;
-+ }
-+
-+ ch->in_shutdown = true;
-+ target_sess_cmd_list_set_waiting(se_sess);
-+ spin_unlock_irqrestore(&ch->spinlock, flags);
-+
-+ return true;
-+}
-+
-+/**
- * srpt_drain_channel() - Drain a channel by resetting the IB queue pair.
- * @cm_id: Pointer to the CM ID of the channel to be drained.
- *
-@@ -2309,6 +2330,9 @@ static void srpt_drain_channel(struct ib
- spin_unlock_irq(&sdev->spinlock);
-
- if (do_reset) {
-+ if (ch->sess)
-+ srpt_shutdown_session(ch->sess);
-+
- ret = srpt_ch_qp_err(ch);
- if (ret < 0)
- printk(KERN_ERR "Setting queue pair in error state"
-@@ -3489,14 +3513,6 @@ static void srpt_release_cmd(struct se_c
- }
-
- /**
-- * srpt_shutdown_session() - Whether or not a session may be shut down.
-- */
--static int srpt_shutdown_session(struct se_session *se_sess)
--{
-- return true;
--}
--
--/**
- * srpt_close_session() - Forcibly close a session.
- *
- * Callback function invoked by the TCM core to clean up sessions associated
---- a/drivers/infiniband/ulp/srpt/ib_srpt.h
-+++ b/drivers/infiniband/ulp/srpt/ib_srpt.h
-@@ -326,6 +326,7 @@ struct srpt_rdma_ch {
- u8 sess_name[36];
- struct work_struct release_work;
- struct completion *release_done;
-+ bool in_shutdown;
- };
-
- /**