Patch "iscsi-target: Fix rx_login_comp hang after login failure" has been added to the 3.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iscsi-target: Fix rx_login_comp hang after login failure
to the 3.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
iscsi-target-fix-rx_login_comp-hang-after-login-failure.patch
and it can be found in the queue-3.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ca82c2bded29b38d36140bfa1e76a7bbfcade390Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger <[email protected]>
Date: Thu, 5 Nov 2015 14:11:59 -0800
Subject: iscsi-target: Fix rx_login_comp hang after login failure
From: Nicholas Bellinger <[email protected]>
commit ca82c2bded29b38d36140bfa1e76a7bbfcade390 upstream.
This patch addresses a case where iscsi_target_do_tx_login_io() fails sending the last login response PDU, after the RX/TX threads have already been started.
The case centers around iscsi_target_rx_thread() not invoking allow_signal(SIGINT) before the send_sig(SIGINT, ...) occurs from the failure path, resulting in RX thread hanging indefinately on iscsi_conn->rx_login_comp.
Note this bug is a regression introduced by:
commit e54198657b65625085834847ab6271087323ffea
Author: Nicholas Bellinger <[email protected]>
Date: Wed Jul 22 23:14:19 2015 -0700
iscsi-target: Fix iscsit_start_kthreads failure OOPs
To address this bug, complete ->rx_login_complete for good measure in the failure path, and immediately return from RX thread context if connection state did not actually reach full feature phase (TARG_CONN_STATE_LOGGED_IN).
--- drivers/target/iscsi/iscsi_target.c | 13 ++++++++++++- drivers/target/iscsi/iscsi_target_nego.c | 1 + 2 files changed, 13 insertions(+), 1 deletion(-)
drivers/target/iscsi/iscsi_target.c +12 -1
@@ -3960,6 +3960,17 @@ reject:return iscsit_add_reject (conn,ISCSI_REASON_BOOKMARK_NO_RESOURCES , buf); } +static bool iscsi_target_check_conn_state (struct iscsi_conn *conn) +{ +bool ret; + +spin_lock_bh (&conn->state_lock); + ret = (conn->conn_state !=TARG_CONN_STATE_LOGGED_IN ); +spin_unlock_bh (&conn->state_lock); + +return ret; +} +int iscsi_target_rx_thread (void *arg) {int ret, rc;
@@ -3977,7 +3988,7 @@ int iscsi_target_rx_thread(void *arg)* incoming iscsi/tcp socket I/O, and/or failing the connection. */ rc =wait_for_completion_interruptible (&conn->rx_login_comp); -if (rc <0 ) +if (rc <0 ||iscsi_target_check_conn_state (conn))return 0 ;if (conn->conn_transport->transport_type ==ISCSI_INFINIBAND ) {
drivers/target/iscsi/iscsi_target_nego.c +1 -0
@@ -384,6 +384,7 @@ err:if (login->login_complete) {if (conn->rx_thread && conn->rx_thread_active) {send_sig (SIGINT , conn->rx_thread,1 ); +complete (&conn->rx_login_comp);kthread_stop (conn->rx_thread); }if (conn->tx_thread && conn->tx_thread_active) {
Patches currently in stable-queue which might be from [email protected] are
queue-3.10/iscsi-target-fix-rx_login_comp-hang-after-login-failure.patch queue-3.10/iscsi-target-fix-potential-dead-lock-during-node-acl-delete.patch