diff options
author | Josef Bacik <josef@toxicpanda.com> | 2021-12-03 17:18:11 -0500 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2022-01-07 14:18:24 +0100 |
commit | 462b728ea83fa85f1c0d2b79efb6187745444ce5 (patch) | |
tree | e97daadf86d3bfc35957fa077c580470f6ebbce5 /fs/btrfs/inode-item.c | |
parent | c2ddb612a8b320dde8641a74c35e107aa496d5f3 (diff) |
btrfs: only call inode_sub_bytes in truncate paths that care
We currently have a bunch of awkward checks to make sure we only update
the inode i_bytes if we're truncating the real inode. Instead keep
track of the number of bytes we need to sub in the
btrfs_truncate_control, and then do the appropriate adjustment in the
truncate paths that care.
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/inode-item.c')
-rw-r--r-- | fs/btrfs/inode-item.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c index 7bb9f557ee3d..278d579f50bd 100644 --- a/fs/btrfs/inode-item.c +++ b/fs/btrfs/inode-item.c @@ -466,6 +466,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, BUG_ON(new_size > 0 && control->min_type != BTRFS_EXTENT_DATA_KEY); control->last_size = new_size; + control->sub_bytes = 0; /* * For shareable roots we want to back off from time to time, this turns @@ -574,10 +575,8 @@ search_again: btrfs_set_file_extent_num_bytes(leaf, fi, extent_num_bytes); num_dec = (orig_num_bytes - extent_num_bytes); - if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && - extent_start != 0) - inode_sub_bytes(&inode->vfs_inode, - num_dec); + if (extent_start != 0) + control->sub_bytes += num_dec; btrfs_mark_buffer_dirty(leaf); } else { extent_num_bytes = @@ -587,12 +586,8 @@ search_again: /* FIXME blocksize != 4096 */ num_dec = btrfs_file_extent_num_bytes(leaf, fi); - if (extent_start != 0) { - if (test_bit(BTRFS_ROOT_SHAREABLE, - &root->state)) - inode_sub_bytes(&inode->vfs_inode, - num_dec); - } + if (extent_start != 0) + control->sub_bytes += num_dec; } clear_len = num_dec; } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { @@ -625,9 +620,7 @@ search_again: clear_len = fs_info->sectorsize; } - if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) - inode_sub_bytes(&inode->vfs_inode, - item_end + 1 - new_size); + control->sub_bytes += item_end + 1 - new_size; } delete: /* |