aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/tree-log.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/tree-log.c')
-rw-r--r--fs/btrfs/tree-log.c13
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 @@
37 */ 37 */
38#define LOG_INODE_ALL 0 38#define LOG_INODE_ALL 0
39#define LOG_INODE_EXISTS 1 39#define LOG_INODE_EXISTS 1
40#define LOG_OTHER_INODE 2
40 41
41/* 42/*
42 * directory trouble cases 43 * directory trouble cases
@@ -4641,7 +4642,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
4641 if (S_ISDIR(inode->i_mode) || 4642 if (S_ISDIR(inode->i_mode) ||
4642 (!test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, 4643 (!test_bit(BTRFS_INODE_NEEDS_FULL_SYNC,
4643 &BTRFS_I(inode)->runtime_flags) && 4644 &BTRFS_I(inode)->runtime_flags) &&
4644 inode_only == LOG_INODE_EXISTS)) 4645 inode_only >= LOG_INODE_EXISTS))
4645 max_key.type = BTRFS_XATTR_ITEM_KEY; 4646 max_key.type = BTRFS_XATTR_ITEM_KEY;
4646 else 4647 else
4647 max_key.type = (u8)-1; 4648 max_key.type = (u8)-1;
@@ -4665,7 +4666,13 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
4665 return ret; 4666 return ret;
4666 } 4667 }
4667 4668
4668 mutex_lock(&BTRFS_I(inode)->log_mutex); 4669 if (inode_only == LOG_OTHER_INODE) {
4670 inode_only = LOG_INODE_EXISTS;
4671 mutex_lock_nested(&BTRFS_I(inode)->log_mutex,
4672 SINGLE_DEPTH_NESTING);
4673 } else {
4674 mutex_lock(&BTRFS_I(inode)->log_mutex);
4675 }
4669 4676
4670 /* 4677 /*
4671 * a brute force approach to making sure we get the most uptodate 4678 * a brute force approach to making sure we get the most uptodate
@@ -4817,7 +4824,7 @@ again:
4817 * unpin it. 4824 * unpin it.
4818 */ 4825 */
4819 err = btrfs_log_inode(trans, root, other_inode, 4826 err = btrfs_log_inode(trans, root, other_inode,
4820 LOG_INODE_EXISTS, 4827 LOG_OTHER_INODE,
4821 0, LLONG_MAX, ctx); 4828 0, LLONG_MAX, ctx);
4822 iput(other_inode); 4829 iput(other_inode);
4823 if (err) 4830 if (err)