aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland Dreier <roland@purestorage.com>2012-11-05 21:02:40 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2012-11-07 23:12:07 -0500
commit998866b0740f128fd2c107c167c8385406dadae0 (patch)
treed923a10a89785c75d3fb93949bd72b4332930efb
parentbb7a8c8eb9678666fb05f3bc542581365399a161 (diff)
iscsi-target: Fix potential deadlock on lock taken in timer
We need to disable BHs when taking sess_idr_lock because the iscsit_handle_time2retain_timeout() timer function takes se_tpg->session_lock, and iscsit_close_session() nests sess_idr_lock inside se_tpg->session_lock. So if the timer can run inside sess_idr_lock, we have a potential AB-BA deadlock. Fix this by disabling BHs when taking sess_idr_lock. This was found because of a lockdep warning, but it looks like a real (if highly theoretical) deadlock. In any case avoiding lockdep spew so that we can find other issues is a worthy cause. Signed-off-by: Roland Dreier <roland@purestorage.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/iscsi/iscsi_target_login.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
index f8dbec05d5e5..3f34ecf87b1e 100644
--- a/drivers/target/iscsi/iscsi_target_login.c
+++ b/drivers/target/iscsi/iscsi_target_login.c
@@ -254,9 +254,9 @@ static int iscsi_login_zero_tsih_s1(
254 kfree(sess); 254 kfree(sess);
255 return -ENOMEM; 255 return -ENOMEM;
256 } 256 }
257 spin_lock(&sess_idr_lock); 257 spin_lock_bh(&sess_idr_lock);
258 ret = idr_get_new(&sess_idr, NULL, &sess->session_index); 258 ret = idr_get_new(&sess_idr, NULL, &sess->session_index);
259 spin_unlock(&sess_idr_lock); 259 spin_unlock_bh(&sess_idr_lock);
260 260
261 if (ret < 0) { 261 if (ret < 0) {
262 pr_err("idr_get_new() for sess_idr failed\n"); 262 pr_err("idr_get_new() for sess_idr failed\n");