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 <[email protected]>
---
 fs/bcachefs/btree_update_interior.c | 20 ++++++++++++++++++++
 fs/bcachefs/btree_update_interior.h |  4 ++++
 2 files changed, 24 insertions(+)

diff --git a/fs/bcachefs/btree_update_interior.c 
b/fs/bcachefs/btree_update_interior.c
index f4aeadbe53c1..ab111fec1701 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -2189,6 +2189,26 @@ int bch2_btree_node_rewrite(struct btree_trans *trans,
        goto out;
 }
 
+int bch2_btree_node_rewrite_key(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;
+}
+
 struct async_btree_rewrite {
        struct bch_fs           *c;
        struct work_struct      work;
diff --git a/fs/bcachefs/btree_update_interior.h 
b/fs/bcachefs/btree_update_interior.h
index 7930ffea3075..fa5a88f95d89 100644
--- a/fs/bcachefs/btree_update_interior.h
+++ b/fs/bcachefs/btree_update_interior.h
@@ -169,7 +169,11 @@ 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_key(struct btree_trans *,
+                               enum btree_id, unsigned,
+                               struct bpos, 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);
-- 
2.45.2


Reply via email to