Patch "dm: fix AB-BA deadlock in __dm_destroy()" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm: fix AB-BA deadlock in __dm_destroy()
to the 4.1-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:
dm-fix-ab-ba-deadlock-in-__dm_destroy.patch
and it can be found in the queue-4.1 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
2a708cff93f1845b9239bc7d6310aef54e716c6aMon Sep 17 00:00:00 2001
From: Junichi Nomura <[email protected]>
Date: Thu, 1 Oct 2015 08:31:51 +0000
Subject: dm: fix AB-BA deadlock in __dm_destroy()
From: Junichi Nomura <[email protected]>
commit 2a708cff93f1845b9239bc7d6310aef54e716c6a upstream.
__dm_destroy() takes io_barrier SRCU lock (dm_get_live_table) and suspend_lock in reverse order. Doing so can cause AB-BA deadlock:
__dm_destroy dm_swap_table
---------------------------------------------------
mutex_lock(suspend_lock)
dm_get_live_table()
srcu_read_lock(io_barrier)
dm_sync_table()
synchronize_srcu(io_barrier)
.. waiting for dm_put_live_table()
mutex_lock(suspend_lock)
.. waiting for suspend_lock
Fix this by taking the locks in proper order.
--- drivers/md/dm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/md/dm.c +2 -4
@@ -2925,8 +2925,6 @@ static void __dm_destroy(struct mapped_dmight_sleep (); - map =dm_get_live_table (md, &srcu_idx); -spin_lock (&_minor_lock);idr_replace (&_minor_idr,MINOR_ALLOCED ,MINOR (disk_devt (dm_disk (md))));set_bit (DMF_FREEING , &md->flags);
@@ -2940,14 +2938,14 @@ static void __dm_destroy(struct mapped_d* do not race with internal suspend. */ mutex_lock (&md->suspend_lock); + map =dm_get_live_table (md, &srcu_idx);if (!dm_suspended_md (md)) {dm_table_presuspend_targets (map);dm_table_postsuspend_targets (map); } -mutex_unlock (&md->suspend_lock); -/* dm_put_live_table must be before msleep, otherwise deadlock is possible */ dm_put_live_table (md, srcu_idx); +mutex_unlock (&md->suspend_lock);/* * Rare, but there may be I/O requests still going to complete,
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/dm-fix-ab-ba-deadlock-in-__dm_destroy.patch