summaryrefslogtreecommitdiff
path: root/fs/btrfs/inode-item.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@toxicpanda.com>2021-12-04 01:18:11 +0300
committerDavid Sterba <dsterba@suse.com>2022-01-07 16:18:24 +0300
commit462b728ea83fa85f1c0d2b79efb6187745444ce5 (patch)
treee97daadf86d3bfc35957fa077c580470f6ebbce5 /fs/btrfs/inode-item.c
parentc2ddb612a8b320dde8641a74c35e107aa496d5f3 (diff)
downloadlinux-462b728ea83fa85f1c0d2b79efb6187745444ce5.tar.xz
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.c19
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:
/*