diff options
| author | Ingo Molnar <mingo@kernel.org> | 2017-01-25 15:52:46 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2017-01-25 15:52:46 +0100 | 
| commit | 47cd95a6326888a46e7ce8389cd394a3e1c647e7 (patch) | |
| tree | dfbb526bcca1a4f627294f19983e1f0b43af9204 /fs/btrfs/tree-log.c | |
| parent | 9f6f941e25bad8fcffc24d10762962d62edba767 (diff) | |
| parent | 883af14e67e8b8702b5560aa64c888c0cd0bd66c (diff) | |
Merge branch 'linus' into perf/core, to pick up fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'fs/btrfs/tree-log.c')
| -rw-r--r-- | fs/btrfs/tree-log.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f10bf5213ed8..eeffff84f280 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -37,6 +37,7 @@   */  #define LOG_INODE_ALL 0  #define LOG_INODE_EXISTS 1 +#define LOG_OTHER_INODE 2  /*   * directory trouble cases @@ -4641,7 +4642,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  	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; @@ -4665,7 +4666,13 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,  		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 @@ -4817,7 +4824,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)  | 
