]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Improved check_topology() assert
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 31 Oct 2024 04:25:36 +0000 (00:25 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:16 +0000 (01:36 -0500)
On interior btree node updates, we always verify that we're not
introducing topology errors: child nodes should exactly span the range
of the parent node.

single_device.ktest small_nodes has been popping this assert: change it
to give us more information.

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

index d62de3f79b298c5533404cbccaba6b3c3d275999..865c4724d550b29fd488cfd3e5c3a2a6cb5d62f7 100644 (file)
@@ -1418,15 +1418,26 @@ bch2_btree_insert_keys_interior(struct btree_update *as,
               (bkey_cmp_left_packed(b, k, &insert->k.p) >= 0))
                ;
 
-       while (!bch2_keylist_empty(keys)) {
-               insert = bch2_keylist_front(keys);
+       for (;
+            insert != keys->top && bpos_le(insert->k.p, b->key.k.p);
+            insert = bkey_next(insert))
+               bch2_insert_fixup_btree_ptr(as, trans, path, b, &node_iter, insert);
 
-               if (bpos_gt(insert->k.p, b->key.k.p))
-                       break;
+       if (bch2_btree_node_check_topology(trans, b)) {
+               struct printbuf buf = PRINTBUF;
 
-               bch2_insert_fixup_btree_ptr(as, trans, path, b, &node_iter, insert);
-               bch2_keylist_pop_front(keys);
+               for (struct bkey_i *k = keys->keys;
+                    k != insert;
+                    k = bkey_next(k)) {
+                       bch2_bkey_val_to_text(&buf, trans->c, bkey_i_to_s_c(k));
+                       prt_newline(&buf);
+               }
+
+               panic("%s(): check_topology error: inserted keys\n%s", __func__, buf.buf);
        }
+
+       memmove_u64s_down(keys->keys, insert, keys->top_p - insert->_data);
+       keys->top_p -= insert->_data - keys->keys_p;
 }
 
 static bool key_deleted_in_insert(struct keylist *insert_keys, struct bpos pos)
@@ -1575,8 +1586,6 @@ static void btree_split_insert_keys(struct btree_update *as,
                bch2_btree_node_iter_init(&node_iter, b, &bch2_keylist_front(keys)->k.p);
 
                bch2_btree_insert_keys_interior(as, trans, path, b, node_iter, keys);
-
-               BUG_ON(bch2_btree_node_check_topology(trans, b));
        }
 }
 
@@ -1827,8 +1836,6 @@ static int bch2_btree_insert_node(struct btree_update *as, struct btree_trans *t
 
        btree_update_updated_node(as, b);
        bch2_btree_node_unlock_write(trans, path, b);
-
-       BUG_ON(bch2_btree_node_check_topology(trans, b));
        return 0;
 split:
        /*