btrfs: pass struct rb_simple_node pointer directly in rb_simple_insert()
authorPan Chuang <panchuang@vivo.com>
Fri, 16 May 2025 03:03:32 +0000 (11:03 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 21:53:26 +0000 (23:53 +0200)
Replace struct embedding with union to enable safe type conversion in
btrfs_backref_node, tree_block and mapping_node.

Adjust function calls to use the new unified API, eliminating redundant
parameters.

Signed-off-by: Pan Chuang <panchuang@vivo.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/backref.c
fs/btrfs/backref.h
fs/btrfs/misc.h
fs/btrfs/relocation.c

index d011c64243c0c47c56e00496957cd11a9bc071ba..a4e0e2c3ea7d136fa0a0fd1863f155a8aeee5553 100644 (file)
@@ -3566,7 +3566,7 @@ int btrfs_backref_finish_upper_links(struct btrfs_backref_cache *cache,
 
        ASSERT(start->checked);
 
-       rb_node = rb_simple_insert(&cache->rb_root, start->bytenr, &start->rb_node);
+       rb_node = rb_simple_insert(&cache->rb_root, &start->simple_node);
        if (rb_node)
                btrfs_backref_panic(cache->fs_info, start->bytenr, -EEXIST);
 
@@ -3617,8 +3617,7 @@ int btrfs_backref_finish_upper_links(struct btrfs_backref_cache *cache,
                        return -EUCLEAN;
                }
 
-               rb_node = rb_simple_insert(&cache->rb_root, upper->bytenr,
-                                          &upper->rb_node);
+               rb_node = rb_simple_insert(&cache->rb_root, &upper->simple_node);
                if (unlikely(rb_node)) {
                        btrfs_backref_panic(cache->fs_info, upper->bytenr, -EEXIST);
                        return -EUCLEAN;
index 507cfb35a23cd8882e5127846fa606285767d36f..61f53825226d546ab8fb1a34908bf04e43d3b74d 100644 (file)
@@ -313,10 +313,15 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter);
  * Represent a tree block in the backref cache
  */
 struct btrfs_backref_node {
-       struct {
-               struct rb_node rb_node;
-               u64 bytenr;
-       }; /* Use rb_simple_node for search/insert */
+       union{
+               /* Use rb_simple_node for search/insert */
+               struct {
+                       struct rb_node rb_node;
+                       u64 bytenr;
+               };
+
+               struct rb_simple_node simple_node;
+       };
 
        /*
         * This is a sanity check, whenever we COW a block we will update
index 0d599fd847c9bf3c3cd8faa9036b9e5db0a4bfdf..e28bca1b3de530fa6bbb0a492177665da6ebe08f 100644 (file)
@@ -119,8 +119,8 @@ static inline struct rb_node *rb_simple_search_first(const struct rb_root *root,
        return ret;
 }
 
-static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr,
-                                              struct rb_node *node)
+static inline struct rb_node *rb_simple_insert(struct rb_root *root,
+                                              struct rb_simple_node *simple_node)
 {
        struct rb_node **p = &root->rb_node;
        struct rb_node *parent = NULL;
@@ -130,16 +130,16 @@ static inline struct rb_node *rb_simple_insert(struct rb_root *root, u64 bytenr,
                parent = *p;
                entry = rb_entry(parent, struct rb_simple_node, rb_node);
 
-               if (bytenr < entry->bytenr)
+               if (simple_node->bytenr < entry->bytenr)
                        p = &(*p)->rb_left;
-               else if (bytenr > entry->bytenr)
+               else if (simple_node->bytenr > entry->bytenr)
                        p = &(*p)->rb_right;
                else
                        return parent;
        }
 
-       rb_link_node(node, parent, p);
-       rb_insert_color(node, root);
+       rb_link_node(&simple_node->rb_node, parent, p);
+       rb_insert_color(&simple_node->rb_node, root);
        return NULL;
 }
 
index 02086191630d01d75f10e4d10839997192e9e9b1..0b73f58db33f033e1fa7b6d4910a9818498563a4 100644 (file)
  * map address of tree root to tree
  */
 struct mapping_node {
-       struct {
-               struct rb_node rb_node;
-               u64 bytenr;
-       }; /* Use rb_simle_node for search/insert */
+       union {
+               /* Use rb_simple_node for search/insert */
+               struct {
+                       struct rb_node rb_node;
+                       u64 bytenr;
+               };
+
+               struct rb_simple_node simple_node;
+       };
        void *data;
 };
 
@@ -106,10 +111,15 @@ struct mapping_tree {
  * present a tree block to process
  */
 struct tree_block {
-       struct {
-               struct rb_node rb_node;
-               u64 bytenr;
-       }; /* Use rb_simple_node for search/insert */
+       union {
+               /* Use rb_simple_node for search/insert */
+               struct {
+                       struct rb_node rb_node;
+                       u64 bytenr;
+               };
+
+               struct rb_simple_node simple_node;
+       };
        u64 owner;
        struct btrfs_key key;
        u8 level;
@@ -480,8 +490,7 @@ static int __add_reloc_root(struct btrfs_root *root)
        node->data = root;
 
        spin_lock(&rc->reloc_root_tree.lock);
-       rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root,
-                                  node->bytenr, &node->rb_node);
+       rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node);
        spin_unlock(&rc->reloc_root_tree.lock);
        if (rb_node) {
                btrfs_err(fs_info,
@@ -564,8 +573,7 @@ static int __update_reloc_root(struct btrfs_root *root)
 
        spin_lock(&rc->reloc_root_tree.lock);
        node->bytenr = root->node->start;
-       rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root,
-                                  node->bytenr, &node->rb_node);
+       rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node);
        spin_unlock(&rc->reloc_root_tree.lock);
        if (rb_node)
                btrfs_backref_panic(fs_info, node->bytenr, -EEXIST);
@@ -3155,7 +3163,7 @@ static int add_tree_block(struct reloc_control *rc,
        block->key_ready = false;
        block->owner = owner;
 
-       rb_node = rb_simple_insert(blocks, block->bytenr, &block->rb_node);
+       rb_node = rb_simple_insert(blocks, &block->simple_node);
        if (rb_node)
                btrfs_backref_panic(rc->extent_root->fs_info, block->bytenr,
                                    -EEXIST);