]> Pileus Git - ~andy/linux/commitdiff
iscsi-target: Fix potential deadlock on lock taken in timer
authorRoland Dreier <roland@purestorage.com>
Tue, 6 Nov 2012 02:02:40 +0000 (18:02 -0800)
committerNicholas Bellinger <nab@linux-iscsi.org>
Thu, 8 Nov 2012 04:12:07 +0000 (20:12 -0800)
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>
drivers/target/iscsi/iscsi_target_login.c

index f8dbec05d5e56736fdc9238f997fcc8b18209021..3f34ecf87b1ec5d0ec15cdf7560f153290c8e5a6 100644 (file)
@@ -254,9 +254,9 @@ static int iscsi_login_zero_tsih_s1(
                kfree(sess);
                return -ENOMEM;
        }
-       spin_lock(&sess_idr_lock);
+       spin_lock_bh(&sess_idr_lock);
        ret = idr_get_new(&sess_idr, NULL, &sess->session_index);
-       spin_unlock(&sess_idr_lock);
+       spin_unlock_bh(&sess_idr_lock);
 
        if (ret < 0) {
                pr_err("idr_get_new() for sess_idr failed\n");