Commit 462b728e authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

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: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent c2ddb612
...@@ -339,6 +339,7 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, ...@@ -339,6 +339,7 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans,
*/ */
ret = btrfs_truncate_inode_items(trans, root, inode, &control); ret = btrfs_truncate_inode_items(trans, root, inode, &control);
inode_sub_bytes(&inode->vfs_inode, control.sub_bytes);
btrfs_inode_safe_disk_i_size_write(inode, control.last_size); btrfs_inode_safe_disk_i_size_write(inode, control.last_size);
unlock_extent_cached(&inode->io_tree, 0, (u64)-1, &cached_state); unlock_extent_cached(&inode->io_tree, 0, (u64)-1, &cached_state);
......
...@@ -466,6 +466,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, ...@@ -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); BUG_ON(new_size > 0 && control->min_type != BTRFS_EXTENT_DATA_KEY);
control->last_size = new_size; control->last_size = new_size;
control->sub_bytes = 0;
/* /*
* For shareable roots we want to back off from time to time, this turns * For shareable roots we want to back off from time to time, this turns
...@@ -574,10 +575,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, ...@@ -574,10 +575,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
btrfs_set_file_extent_num_bytes(leaf, fi, btrfs_set_file_extent_num_bytes(leaf, fi,
extent_num_bytes); extent_num_bytes);
num_dec = (orig_num_bytes - extent_num_bytes); num_dec = (orig_num_bytes - extent_num_bytes);
if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && if (extent_start != 0)
extent_start != 0) control->sub_bytes += num_dec;
inode_sub_bytes(&inode->vfs_inode,
num_dec);
btrfs_mark_buffer_dirty(leaf); btrfs_mark_buffer_dirty(leaf);
} else { } else {
extent_num_bytes = extent_num_bytes =
...@@ -587,12 +586,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, ...@@ -587,12 +586,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
/* FIXME blocksize != 4096 */ /* FIXME blocksize != 4096 */
num_dec = btrfs_file_extent_num_bytes(leaf, fi); num_dec = btrfs_file_extent_num_bytes(leaf, fi);
if (extent_start != 0) { if (extent_start != 0)
if (test_bit(BTRFS_ROOT_SHAREABLE, control->sub_bytes += num_dec;
&root->state))
inode_sub_bytes(&inode->vfs_inode,
num_dec);
}
} }
clear_len = num_dec; clear_len = num_dec;
} else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
...@@ -625,9 +620,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, ...@@ -625,9 +620,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
clear_len = fs_info->sectorsize; clear_len = fs_info->sectorsize;
} }
if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) control->sub_bytes += item_end + 1 - new_size;
inode_sub_bytes(&inode->vfs_inode,
item_end + 1 - new_size);
} }
delete: delete:
/* /*
......
...@@ -29,6 +29,9 @@ struct btrfs_truncate_control { ...@@ -29,6 +29,9 @@ struct btrfs_truncate_control {
/* OUT: the last size we truncated this inode to. */ /* OUT: the last size we truncated this inode to. */
u64 last_size; u64 last_size;
/* OUT: the number of bytes to sub from this inode. */
u64 sub_bytes;
/* /*
* IN: minimum key type to remove. All key types with this type are * IN: minimum key type to remove. All key types with this type are
* removed only if their offset >= new_size. * removed only if their offset >= new_size.
......
...@@ -8621,6 +8621,7 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback) ...@@ -8621,6 +8621,7 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback)
ret = btrfs_truncate_inode_items(trans, root, BTRFS_I(inode), ret = btrfs_truncate_inode_items(trans, root, BTRFS_I(inode),
&control); &control);
inode_sub_bytes(inode, control.sub_bytes);
btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), control.last_size); btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), control.last_size);
unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment