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 { |
