]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: pass the extent map tree's inode to remove_extent_mapping()
authorFilipe Manana <fdmanana@suse.com>
Thu, 21 Mar 2024 15:08:38 +0000 (15:08 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 May 2024 19:31:06 +0000 (21:31 +0200)
Extent maps are always associated to an inode's extent map tree, so
there's no need to pass the extent map tree explicitly to
remove_extent_mapping().

In order to facilitate an upcoming change that adds a shrinker for extent
maps, change remove_extent_mapping() to receive the inode instead of its
extent map tree.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c
fs/btrfs/extent_map.c
fs/btrfs/extent_map.h
fs/btrfs/tests/extent-map-tests.c

index 91122817f137d0d9d5baf4fc686757caad05496a..7b10f47d8f83cc8cdcc3f0b2691922d0a6a95b8a 100644 (file)
@@ -2457,7 +2457,7 @@ remove_em:
                         * hurts the fsync performance for workloads with a data
                         * size that exceeds or is close to the system's memory).
                         */
-                       remove_extent_mapping(map, em);
+                       remove_extent_mapping(btrfs_inode, em);
                        /* once for the rb tree */
                        free_extent_map(em);
 next:
index 40f5a99ab3821f12ebc81b500b8e11ffe57445cd..2b7e3666ebd39a3b9c753e7fe6bca8184c1466fa 100644 (file)
@@ -449,16 +449,18 @@ struct extent_map *search_extent_mapping(struct extent_map_tree *tree,
 }
 
 /*
- * Remove an extent_map from the extent tree.
+ * Remove an extent_map from its inode's extent tree.
  *
- * @tree:      extent tree to remove from
+ * @inode:     the inode the extent map belongs to
  * @em:                extent map being removed
  *
- * Remove @em from @tree.  No reference counts are dropped, and no checks
- * are done to see if the range is in use.
+ * Remove @em from the extent tree of @inode.  No reference counts are dropped,
+ * and no checks are done to see if the range is in use.
  */
-void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em)
+void remove_extent_mapping(struct btrfs_inode *inode, struct extent_map *em)
 {
+       struct extent_map_tree *tree = &inode->extent_tree;
+
        lockdep_assert_held_write(&tree->lock);
 
        WARN_ON(em->flags & EXTENT_FLAG_PINNED);
@@ -633,8 +635,10 @@ int btrfs_add_extent_mapping(struct btrfs_inode *inode,
  * if needed. This avoids searching the tree, from the root down to the first
  * extent map, before each deletion.
  */
-static void drop_all_extent_maps_fast(struct extent_map_tree *tree)
+static void drop_all_extent_maps_fast(struct btrfs_inode *inode)
 {
+       struct extent_map_tree *tree = &inode->extent_tree;
+
        write_lock(&tree->lock);
        while (!RB_EMPTY_ROOT(&tree->map.rb_root)) {
                struct extent_map *em;
@@ -643,7 +647,7 @@ static void drop_all_extent_maps_fast(struct extent_map_tree *tree)
                node = rb_first_cached(&tree->map);
                em = rb_entry(node, struct extent_map, rb_node);
                em->flags &= ~(EXTENT_FLAG_PINNED | EXTENT_FLAG_LOGGING);
-               remove_extent_mapping(tree, em);
+               remove_extent_mapping(inode, em);
                free_extent_map(em);
                cond_resched_rwlock_write(&tree->lock);
        }
@@ -676,7 +680,7 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
        WARN_ON(end < start);
        if (end == (u64)-1) {
                if (start == 0 && !skip_pinned) {
-                       drop_all_extent_maps_fast(em_tree);
+                       drop_all_extent_maps_fast(inode);
                        return;
                }
                len = (u64)-1;
@@ -854,7 +858,7 @@ remove_em:
                                ASSERT(!split);
                                btrfs_set_inode_full_sync(inode);
                        }
-                       remove_extent_mapping(em_tree, em);
+                       remove_extent_mapping(inode, em);
                }
 
                /*
index 732fc8d7e53424686a00f69cb1eecd338d4d2958..c3707461ff62d3e5c4ebb0cbebed970c8023eef1 100644 (file)
@@ -120,7 +120,7 @@ static inline u64 extent_map_end(const struct extent_map *em)
 void extent_map_tree_init(struct extent_map_tree *tree);
 struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
                                         u64 start, u64 len);
-void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
+void remove_extent_mapping(struct btrfs_inode *inode, struct extent_map *em);
 int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
                     u64 new_logical);
 
index 0f5c9c9304d9be1bc775eeeba5f79677a9c9ddd4..ba36794ba2d51a1c1dbbaf970eda879e503775bf 100644 (file)
@@ -11,8 +11,9 @@
 #include "../disk-io.h"
 #include "../block-group.h"
 
-static int free_extent_map_tree(struct extent_map_tree *em_tree)
+static int free_extent_map_tree(struct btrfs_inode *inode)
 {
+       struct extent_map_tree *em_tree = &inode->extent_tree;
        struct extent_map *em;
        struct rb_node *node;
        int ret = 0;
@@ -21,7 +22,7 @@ static int free_extent_map_tree(struct extent_map_tree *em_tree)
        while (!RB_EMPTY_ROOT(&em_tree->map.rb_root)) {
                node = rb_first_cached(&em_tree->map);
                em = rb_entry(node, struct extent_map, rb_node);
-               remove_extent_mapping(em_tree, em);
+               remove_extent_mapping(inode, em);
 
 #ifdef CONFIG_BTRFS_DEBUG
                if (refcount_read(&em->refs) != 1) {
@@ -142,7 +143,7 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        }
        free_extent_map(em);
 out:
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -237,7 +238,7 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        }
        free_extent_map(em);
 out:
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -313,7 +314,7 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
        }
        free_extent_map(em);
 out:
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -435,7 +436,7 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
        }
        free_extent_map(em);
 out:
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -679,7 +680,7 @@ static int test_case_5(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        if (ret)
                goto out;
 out:
-       ret2 = free_extent_map_tree(&inode->extent_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -738,7 +739,7 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
        ret = 0;
 out:
        free_extent_map(em);
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;
 
@@ -876,7 +877,7 @@ out:
        ret2 = unpin_extent_cache(inode, 0, SZ_16K, 0);
        if (ret == 0)
                ret = ret2;
-       ret2 = free_extent_map_tree(em_tree);
+       ret2 = free_extent_map_tree(inode);
        if (ret == 0)
                ret = ret2;