|
|
@@ -4544,7 +4544,18 @@ static void iscsit_logout_post_handler_closesession(
|
|
|
struct iscsi_conn *conn)
|
|
|
{
|
|
|
struct iscsi_session *sess = conn->sess;
|
|
|
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
+ int sleep = 1;
|
|
|
+ /*
|
|
|
+ * Traditional iscsi/tcp will invoke this logic from TX thread
|
|
|
+ * context during session logout, so clear tx_thread_active and
|
|
|
+ * sleep if iscsit_close_connection() has not already occured.
|
|
|
+ *
|
|
|
+ * Since iser-target invokes this logic from it's own workqueue,
|
|
|
+ * always sleep waiting for RX/TX thread shutdown to complete
|
|
|
+ * within iscsit_close_connection().
|
|
|
+ */
|
|
|
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
|
|
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
|
|
|
atomic_set(&conn->conn_logout_remove, 0);
|
|
|
complete(&conn->conn_logout_comp);
|
|
|
@@ -4558,7 +4569,10 @@ static void iscsit_logout_post_handler_closesession(
|
|
|
static void iscsit_logout_post_handler_samecid(
|
|
|
struct iscsi_conn *conn)
|
|
|
{
|
|
|
- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
+ int sleep = 1;
|
|
|
+
|
|
|
+ if (conn->conn_transport->transport_type == ISCSI_TCP)
|
|
|
+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
|
|
|
|
|
|
atomic_set(&conn->conn_logout_remove, 0);
|
|
|
complete(&conn->conn_logout_comp);
|