aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/tree-log.c39
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 {