Patch "Btrfs: fix lockdep warning about log_mutex" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Btrfs: fix lockdep warning about log_mutex
to the 4.9-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:
btrfs-fix-lockdep-warning-about-log_mutex.patch
and it can be found in the queue-4.9 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 foo@baz Fri Aug 4 15:15:01 PDT 2017
From: Liu Bo <[email protected]>
Date: Wed, 30 Nov 2016 16:20:25 -0800
Subject: Btrfs: fix lockdep warning about log_mutex
From: Liu Bo <[email protected]>
[ Upstream commit 781feef7e6befafd4d9787d1f7ada1f9ccd504e4 ]
While checking INODE_REF/INODE_EXTREF for a corner case, we may acquire a different inode's log_mutex with holding the current inode's log_mutex, and lockdep has complained this with a possilble deadlock warning.
Fix this by using mutex_lock_nested() when processing the other inode's log_mutex.
--- fs/btrfs/tree-log.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
fs/btrfs/tree-log.c +10 -3
@@ -37,6 +37,7 @@*/ #define LOG_INODE_ALL 0#define LOG_INODE_EXISTS 1 +#define LOG_OTHER_INODE 2/* * directory trouble cases
@@ -4623,7 +4624,7 @@ static int btrfs_log_inode(struct btrfs_if (S_ISDIR (inode->i_mode) || (!test_bit (BTRFS_INODE_NEEDS_FULL_SYNC , &BTRFS_I (inode)->runtime_flags) && - inode_only ==LOG_INODE_EXISTS )) + inode_only >=LOG_INODE_EXISTS )) max_key.type =BTRFS_XATTR_ITEM_KEY ;else max_key.type = (u8)-1 ;
@@ -4647,7 +4648,13 @@ static int btrfs_log_inode(struct btrfs_return ret; } -mutex_lock (&BTRFS_I (inode)->log_mutex); +if (inode_only ==LOG_OTHER_INODE ) { + inode_only =LOG_INODE_EXISTS ; +mutex_lock_nested (&BTRFS_I (inode)->log_mutex, +SINGLE_DEPTH_NESTING ); + }else { +mutex_lock (&BTRFS_I (inode)->log_mutex); + }/* * a brute force approach to making sure we get the most uptodate
@@ -4799,7 +4806,7 @@ again:* unpin it. */ err =btrfs_log_inode (trans, root, other_inode, -LOG_INODE_EXISTS , +LOG_OTHER_INODE ,0 ,LLONG_MAX , ctx);iput (other_inode);if (err)
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/btrfs-fix-lockdep-warning-about-log_mutex.patch queue-4.9/btrfs-adjust-outstanding_extents-counter-properly-when-dio-write-is-split.patch queue-4.9/btrfs-use-down_read_nested-to-make-lockdep-silent.patch