diff options
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) |