btrfs: use a flag to control when to clear the file extent range
authorJosef Bacik <josef@toxicpanda.com>
Fri, 3 Dec 2021 22:18:13 +0000 (17:18 -0500)
committerDavid Sterba <dsterba@suse.com>
Fri, 7 Jan 2022 13:18:24 +0000 (14:18 +0100)
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 <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>
fs/btrfs/free-space-cache.c
fs/btrfs/inode-item.c
fs/btrfs/inode-item.h
fs/btrfs/inode.c

index d2f4716f8485e314d5ffc3dcc981a0831ebc492e..3a6bf361409be9790f4b0bbf2a06370c6bd63a2a 100644 (file)
@@ -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;
index 4c753415ab06eb6ff9598aab0a8d7b488c646609..5598090bd0aa7af590634e1a9aca19eba69bd500 100644 (file)
@@ -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) {
index 1f31bb407f4a601e222e5cc8cae4fe12e4f36580..5817ba4ddd239ca20b89ff774afc26cb91d46384 100644 (file)
@@ -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,
index 38f974b16fc0803659c0373d1adef06e6895417e..1a3f40be4ed8c2d3d07c4ed7a96a4fb3ca503075 100644 (file)
@@ -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;