diff options
-rw-r--r-- | fs/btrfs/tree-log.c | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 5f649bb32bec..f96996a1b70c 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -4069,8 +4069,10 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
4069 | if (S_ISDIR(inode->i_mode)) { | 4069 | if (S_ISDIR(inode->i_mode)) { |
4070 | int max_key_type = BTRFS_DIR_LOG_INDEX_KEY; | 4070 | int max_key_type = BTRFS_DIR_LOG_INDEX_KEY; |
4071 | 4071 | ||
4072 | if (inode_only == LOG_INODE_EXISTS) | 4072 | if (inode_only == LOG_INODE_EXISTS) { |
4073 | max_key_type = BTRFS_XATTR_ITEM_KEY; | 4073 | max_key_type = BTRFS_INODE_EXTREF_KEY; |
4074 | max_key.type = max_key_type; | ||
4075 | } | ||
4074 | ret = drop_objectid_items(trans, log, path, ino, max_key_type); | 4076 | ret = drop_objectid_items(trans, log, path, ino, max_key_type); |
4075 | } else { | 4077 | } else { |
4076 | if (inode_only == LOG_INODE_EXISTS) { | 4078 | if (inode_only == LOG_INODE_EXISTS) { |
@@ -4092,18 +4094,31 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, | |||
4092 | if (err) | 4094 | if (err) |
4093 | goto out_unlock; | 4095 | goto out_unlock; |
4094 | } | 4096 | } |
4095 | if (test_and_clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, | 4097 | if (test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, |
4096 | &BTRFS_I(inode)->runtime_flags)) { | 4098 | &BTRFS_I(inode)->runtime_flags)) { |
4097 | clear_bit(BTRFS_INODE_COPY_EVERYTHING, | 4099 | if (inode_only == LOG_INODE_EXISTS) { |
4098 | &BTRFS_I(inode)->runtime_flags); | 4100 | max_key.type = BTRFS_INODE_EXTREF_KEY; |
4099 | ret = btrfs_truncate_inode_items(trans, log, | 4101 | ret = drop_objectid_items(trans, log, path, ino, |
4100 | inode, 0, 0); | 4102 | max_key.type); |
4101 | } else if (test_and_clear_bit(BTRFS_INODE_COPY_EVERYTHING, | 4103 | } else { |
4102 | &BTRFS_I(inode)->runtime_flags) || | 4104 | clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, |
4105 | &BTRFS_I(inode)->runtime_flags); | ||
4106 | clear_bit(BTRFS_INODE_COPY_EVERYTHING, | ||
4107 | &BTRFS_I(inode)->runtime_flags); | ||
4108 | ret = btrfs_truncate_inode_items(trans, log, | ||
4109 | inode, 0, 0); | ||
4110 | } | ||
4111 | } else if (test_bit(BTRFS_INODE_COPY_EVERYTHING, | ||
4112 | &BTRFS_I(inode)->runtime_flags) || | ||
4103 | inode_only == LOG_INODE_EXISTS) { | 4113 | inode_only == LOG_INODE_EXISTS) { |
4104 | if (inode_only == LOG_INODE_ALL) | 4114 | if (inode_only == LOG_INODE_ALL) { |
4115 | clear_bit(BTRFS_INODE_COPY_EVERYTHING, | ||
4116 | &BTRFS_I(inode)->runtime_flags); | ||
4105 | fast_search = true; | 4117 | fast_search = true; |
4106 | max_key.type = BTRFS_XATTR_ITEM_KEY; | 4118 | max_key.type = BTRFS_XATTR_ITEM_KEY; |
4119 | } else { | ||
4120 | max_key.type = BTRFS_INODE_EXTREF_KEY; | ||
4121 | } | ||
4107 | ret = drop_objectid_items(trans, log, path, ino, | 4122 | ret = drop_objectid_items(trans, log, path, ino, |
4108 | max_key.type); | 4123 | max_key.type); |
4109 | } else { | 4124 | } else { |