]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: bch2_btree_node_rewrite_pos()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 29 Dec 2024 02:00:34 +0000 (21:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:12 +0000 (21:02 -0400)
Add a new helper for rewriting a btree node given a just the key, not a
pointer to the node itself.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_interior.h

index 05aa9e32adf4b3bd43b73f90c7965c9768313539..d3e0cf01ba37ad1c564e6922d0b2faee05766d53 100644 (file)
@@ -2238,6 +2238,26 @@ out:
        return ret;
 }
 
+int bch2_btree_node_rewrite_pos(struct btree_trans *trans,
+                               enum btree_id btree, unsigned level,
+                               struct bpos pos, unsigned flags)
+{
+       BUG_ON(!level);
+
+       /* Traverse one depth lower to get a pointer to the node itself: */
+       struct btree_iter iter;
+       bch2_trans_node_iter_init(trans, &iter, btree, pos, 0, level - 1, 0);
+       struct btree *b = bch2_btree_iter_peek_node(&iter);
+       int ret = PTR_ERR_OR_ZERO(b);
+       if (ret)
+               goto err;
+
+       ret = bch2_btree_node_rewrite(trans, &iter, b, flags);
+err:
+       bch2_trans_iter_exit(trans, &iter);
+       return ret;
+}
+
 int bch2_btree_node_rewrite_key_get_iter(struct btree_trans *trans,
                                         struct btree *b, unsigned flags)
 {
index 9261a9a341fb3b9e328161e85f8c7024ff781b90..be71cd73b864d533a2ff56b1dc0255a161113324 100644 (file)
@@ -169,10 +169,14 @@ static inline int bch2_foreground_maybe_merge(struct btree_trans *trans,
 
 int bch2_btree_node_rewrite(struct btree_trans *, struct btree_iter *,
                            struct btree *, unsigned);
+int bch2_btree_node_rewrite_pos(struct btree_trans *,
+                               enum btree_id, unsigned,
+                               struct bpos, unsigned);
 int bch2_btree_node_rewrite_key_get_iter(struct btree_trans *,
                                         struct btree *, unsigned);
 
 void bch2_btree_node_rewrite_async(struct bch_fs *, struct btree *);
+
 int bch2_btree_node_update_key(struct btree_trans *, struct btree_iter *,
                               struct btree *, struct bkey_i *,
                               unsigned, bool);