bcachefs: Don't build aux search tree when still repairing node
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 13 Jul 2025 17:31:33 +0000 (13:31 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 16 Jul 2025 21:32:33 +0000 (17:32 -0400)
bch2_btree_node_drop_keys_outside_node() will (re)build aux search
trees, because it's also called by topology repair.

bch2_btree_node_read_done() was calling it before validating individual
keys; invalid ones have to be dropped.

If we call drop_keys_outside_node() first, then
bch2_bset_build_aux_tree() doesn't run because the node already has an
aux search tree - which was invalidated by the repair.

Reported-by: syzbot+c5e7a66b3b23ae65d44f@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_io.c

index a4cc72986e3642a20cad3fc3edd00f05beda899e..590cd29f3e86cb6b3ef4a5b572b5e2152097bce7 100644 (file)
@@ -1295,9 +1295,6 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
 
        btree_bounce_free(c, btree_buf_bytes(b), used_mempool, sorted);
 
-       if (updated_range)
-               bch2_btree_node_drop_keys_outside_node(b);
-
        i = &b->data->keys;
        for (k = i->start; k != vstruct_last(i);) {
                struct bkey tmp;
@@ -1335,6 +1332,9 @@ int bch2_btree_node_read_done(struct bch_fs *c, struct bch_dev *ca,
 
        btree_node_reset_sib_u64s(b);
 
+       if (updated_range)
+               bch2_btree_node_drop_keys_outside_node(b);
+
        /*
         * XXX:
         *