Patch "iscsi-target: Fix potential dead-lock during node acl delete" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iscsi-target: Fix potential dead-lock during node acl delete
to the 3.14-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-potential-dead-lock-during-node-acl-delete.patch
and it can be found in the queue-3.14 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
26a99c19f810b2593410899a5b304b21b47428a6Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger <[email protected]>
Date: Tue, 19 Jan 2016 16:15:27 -0800
Subject: iscsi-target: Fix potential dead-lock during node acl delete
From: Nicholas Bellinger <[email protected]>
commit 26a99c19f810b2593410899a5b304b21b47428a6 upstream.
This patch is a iscsi-target specific bug-fix for a dead-lock that can occur during explicit struct se_node_acl->acl_group se_session deletion via configfs rmdir(2), when iscsi-target time2retain timer is still active.
It changes iscsi-target to obtain se_portal_group->session_lock internally using spin_in_locked() to check for the specific se_node_acl configfs shutdown rmdir(2) case.
Note this patch is intended for stable, and the subsequent v4.5-rc patch converts target_core_tpg.c to use proper se_sess->sess_kref reference counting for both se_node_acl deletion + se_node_acl->queue_depth se_session restart.
--- drivers/target/iscsi/iscsi_target_configfs.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
drivers/target/iscsi/iscsi_target_configfs.c +15 -1
@@ -1876,7 +1876,8 @@ static void lio_tpg_release_fabric_acl( }/* -* Called with spin_lock_bh(struct se_portal_group->session_lock) held.. +* Called with spin_lock_irq(struct se_portal_group->session_lock) held +* or not held. * * Also, this function calls iscsit_inc_session_usage_count() on the * struct iscsi_session in question.
@@ -1884,19 +1885,32 @@ static void lio_tpg_release_fabric_acl(static int lio_tpg_shutdown_session (struct se_session *se_sess) {struct iscsi_session *sess = se_sess->fabric_sess_ptr; +struct se_portal_group *se_tpg = se_sess->se_tpg; +bool local_lock = false; + +if (!spin_is_locked (&se_tpg->session_lock)) { +spin_lock_irq (&se_tpg->session_lock); + local_lock = true; + }spin_lock (&sess->conn_lock);if (atomic_read (&sess->session_fall_back_to_erl0) ||atomic_read (&sess->session_logout) || (sess->time2retain_timer_flags &ISCSI_TF_EXPIRED )) {spin_unlock (&sess->conn_lock); +if (local_lock) +spin_unlock_irq (&sess->conn_lock);return 0 ; }atomic_set (&sess->session_reinstatement,1 );spin_unlock (&sess->conn_lock);iscsit_stop_time2retain_timer (sess); +spin_unlock_irq (&se_tpg->session_lock); +iscsit_stop_session (sess,1 ,1 ); +if (!local_lock) +spin_lock_irq (&se_tpg->session_lock);return 1 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/iscsi-target-fix-rx_login_comp-hang-after-login-failure.patch queue-3.14/iscsi-target-fix-potential-dead-lock-during-node-acl-delete.patch