From: Josef Bacik Date: Fri, 3 Dec 2021 22:18:13 +0000 (-0500) Subject: btrfs: use a flag to control when to clear the file extent range X-Git-Tag: v5.17-rc1~133^2~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=655807b8957ba84a583104c422a8f53725997d55;p=thirdparty%2Fkernel%2Flinux.git btrfs: use a flag to control when to clear the file extent range We only care about updating the file extent range when we are doing a normal truncation. We skip this for tree logging currently, but we can also skip this for eviction as well. Using a flag makes it more explicit when we want to do this work. Reviewed-by: Filipe Manana Signed-off-by: Josef Bacik Reviewed-by: David Sterba Signed-off-by: David Sterba --- diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index d2f4716f8485e..3a6bf361409be 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -294,6 +294,7 @@ int btrfs_truncate_free_space_cache(struct btrfs_trans_handle *trans, struct btrfs_truncate_control control = { .new_size = 0, .min_type = BTRFS_EXTENT_DATA_KEY, + .clear_extent_range = true, }; struct btrfs_inode *inode = BTRFS_I(vfs_inode); struct btrfs_root *root = inode->root; diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c index 4c753415ab06e..5598090bd0aa7 100644 --- a/fs/btrfs/inode-item.c +++ b/fs/btrfs/inode-item.c @@ -624,11 +624,11 @@ search_again: } delete: /* - * We use btrfs_truncate_inode_items() to clean up log trees for - * multiple fsyncs, and in this case we don't want to clear the - * file extent range because it's just the log. + * We only want to clear the file extent range if we're + * modifying the actual inode's mapping, which is just the + * normal truncate path. */ - if (root == inode->root) { + if (control->clear_extent_range) { ret = btrfs_inode_clear_file_extent_range(inode, clear_start, clear_len); if (ret) { diff --git a/fs/btrfs/inode-item.h b/fs/btrfs/inode-item.h index 1f31bb407f4a6..5817ba4ddd239 100644 --- a/fs/btrfs/inode-item.h +++ b/fs/btrfs/inode-item.h @@ -43,6 +43,12 @@ struct btrfs_truncate_control { * extents we drop. */ bool skip_ref_updates; + + /* + * IN: true if we need to clear the file extent range for the inode as + * we drop the file extent items. + */ + bool clear_extent_range; }; int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 38f974b16fc08..1a3f40be4ed8c 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -8534,6 +8534,7 @@ static int btrfs_truncate(struct inode *inode, bool skip_writeback) { struct btrfs_truncate_control control = { .min_type = BTRFS_EXTENT_DATA_KEY, + .clear_extent_range = true, }; struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_root *root = BTRFS_I(inode)->root;