bcachefs: Always rebuild aux search trees when node boundaries change
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 17 Aug 2022 18:20:48 +0000 (14:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:38 +0000 (17:09 -0400)
Topology repair may change btree node min/max keys: when it does so, we
need to always rebuild eytzinger search trees because nodes directly
depend on those values.

This fixes a bug found by the 'kill_btree_node' test, where we'd pop an
assertion in bch2_bset_search_linear().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_io.c

index 6e39c16..bd74bd3 100644 (file)
@@ -611,7 +611,6 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
                                          (u64 *) vstruct_end(i) - (u64 *) k);
                        i->u64s = cpu_to_le16(le16_to_cpu(i->u64s) - shift);
                        set_btree_bset_end(b, t);
-                       bch2_bset_set_no_aux_tree(b, t);
                }
 
                for (k = i->start; k != vstruct_last(i); k = bkey_next(k))
@@ -621,10 +620,14 @@ void bch2_btree_node_drop_keys_outside_node(struct btree *b)
                if (k != vstruct_last(i)) {
                        i->u64s = cpu_to_le16((u64 *) k - (u64 *) i->start);
                        set_btree_bset_end(b, t);
-                       bch2_bset_set_no_aux_tree(b, t);
                }
        }
 
+       /*
+        * Always rebuild search trees: eytzinger search tree nodes directly
+        * depend on the values of min/max key:
+        */
+       bch2_bset_set_no_aux_tree(b, b->set);
        bch2_btree_build_aux_trees(b);
 
        for_each_btree_node_key_unpack(b, k, &iter, &unpacked) {