Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 998866b0 authored by Roland Dreier's avatar Roland Dreier Committed by Nicholas Bellinger
Browse files

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: default avatarRoland Dreier <roland@purestorage.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent bb7a8c8e
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -254,9 +254,9 @@ static int iscsi_login_zero_tsih_s1(
		kfree(sess);
		kfree(sess);
		return -ENOMEM;
		return -ENOMEM;
	}
	}
	spin_lock(&sess_idr_lock);
	spin_lock_bh(&sess_idr_lock);
	ret = idr_get_new(&sess_idr, NULL, &sess->session_index);
	ret = idr_get_new(&sess_idr, NULL, &sess->session_index);
	spin_unlock(&sess_idr_lock);
	spin_unlock_bh(&sess_idr_lock);


	if (ret < 0) {
	if (ret < 0) {
		pr_err("idr_get_new() for sess_idr failed\n");
		pr_err("idr_get_new() for sess_idr failed\n");