bcachefs: Add more debug checks
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 16 Nov 2020 19:16:42 +0000 (14:16 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:47 +0000 (17:08 -0400)
tracking down a bug where we see a btree node pointer in the wrong node

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

index 302ee3851b0da0895dd92feedf3fd5e6afec8c3a..af3b39b70957d82b441f286674b3a3745b9ca258 100644 (file)
@@ -1442,8 +1442,10 @@ static int validate_bset_for_write(struct bch_fs *c, struct btree *b,
 
        ret = validate_bset(c, b, i, sectors, WRITE, false) ?:
                validate_bset_keys(c, b, i, &whiteout_u64s, WRITE, false);
-       if (ret)
+       if (ret) {
                bch2_inconsistent_error(c);
+               dump_stack();
+       }
 
        return ret;
 }
index 0a83d9fdecd157bb678e07230d07156d0bb6ea6a..96fa2b5a1d1edcc21784b75854e71fa4b66b1a35 100644 (file)
@@ -11,6 +11,7 @@
 #include "btree_iter.h"
 #include "btree_locking.h"
 #include "buckets.h"
+#include "error.h"
 #include "extents.h"
 #include "journal.h"
 #include "journal_reclaim.h"
@@ -1021,7 +1022,19 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as, struct btree *b
                                        struct bkey_i *insert,
                                        struct btree_node_iter *node_iter)
 {
+       struct bch_fs *c = as->c;
        struct bkey_packed *k;
+       const char *invalid;
+
+       invalid = bch2_bkey_invalid(c, bkey_i_to_s_c(insert), btree_node_type(b)) ?:
+               bch2_bkey_in_btree_node(b, bkey_i_to_s_c(insert));
+       if (invalid) {
+               char buf[160];
+
+               bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(insert));
+               bch2_fs_inconsistent(c, "inserting invalid bkey %s: %s", buf, invalid);
+               dump_stack();
+       }
 
        BUG_ON(as->journal_u64s + jset_u64s(insert->k.u64s) >
               ARRAY_SIZE(as->journal_entries));
@@ -1037,7 +1050,7 @@ static void bch2_insert_fixup_btree_ptr(struct btree_update *as, struct btree *b
                bch2_btree_node_iter_advance(node_iter, b);
 
        bch2_btree_bset_insert_key(iter, b, node_iter, insert);
-       set_btree_node_dirty(as->c, b);
+       set_btree_node_dirty(c, b);
        set_btree_node_need_write(b);
 }
 
@@ -1366,6 +1379,8 @@ void bch2_btree_insert_node(struct btree_update *as, struct btree *b,
                goto split;
        }
 
+       btree_node_interior_verify(c, b);
+
        bch2_btree_insert_keys_interior(as, b, iter, keys);
 
        live_u64s_added = (int) b->nr.live_u64s - old_live_u64s;