diff options
author | Pan Chuang <panchuang@vivo.com> | 2025-05-16 11:03:32 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2025-07-21 23:53:26 +0200 |
commit | c52ea14d0544cfcd3c76ac9e3ce8ca16832cc033 (patch) | |
tree | 49163b4ad604f670a966ed13bcd5d39027af6c82 | |
parent | fbec9a5d3e98513ce796194fe8604cade1aa3188 (diff) |
btrfs: pass struct rb_simple_node pointer directly in rb_simple_insert()
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>
-rw-r--r-- | fs/btrfs/backref.c | 5 | ||||
-rw-r--r-- | fs/btrfs/backref.h | 13 | ||||
-rw-r--r-- | fs/btrfs/misc.h | 12 | ||||
-rw-r--r-- | fs/btrfs/relocation.c | 34 |
4 files changed, 38 insertions, 26 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index d011c64243c0..a4e0e2c3ea7d 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c @@ -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; diff --git a/fs/btrfs/backref.h b/fs/btrfs/backref.h index 507cfb35a23c..61f53825226d 100644 --- a/fs/btrfs/backref.h +++ b/fs/btrfs/backref.h @@ -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 diff --git a/fs/btrfs/misc.h b/fs/btrfs/misc.h index 0d599fd847c9..e28bca1b3de5 100644 --- a/fs/btrfs/misc.h +++ b/fs/btrfs/misc.h @@ -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; } diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 02086191630d..0b73f58db33f 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -90,10 +90,15 @@ * 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); |