bcachefs: Debug assertion improvements
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 19 Sep 2019 20:07:41 +0000 (16:07 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:27 +0000 (17:08 -0400)
Call bch2_btree_iter_verify from bch2_btree_node_iter_fix(); also verify
in btree_iter_peek_uptodate() that iter->k matches what's in the btree.

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

index b5dace40534c040449034901817c84543cd660f7..f64cf78d68fa736fb85679c9d67e8cdec89a2d07 100644 (file)
@@ -542,14 +542,14 @@ static void __bch2_btree_node_iter_fix(struct btree_iter *iter,
                goto fixup_done;
        } else {
                /* Iterator is after key that changed */
-               goto out_verify;
+               return;
        }
 found:
        set->end = t->end_offset;
 
        /* Iterator hasn't gotten to the key that changed yet: */
        if (set->k < offset)
-               goto out_verify;
+               return;
 
        if (new_u64s &&
            btree_iter_pos_cmp(iter, b, where) > 0) {
@@ -561,7 +561,7 @@ found:
        } else {
                /* Iterator is after key that changed */
                set->k = (int) set->k + shift;
-               goto out_verify;
+               return;
        }
 
        bch2_btree_node_iter_sort(node_iter, b);
@@ -620,8 +620,6 @@ fixup_done:
 
                btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
        }
-out_verify:
-       bch2_btree_node_iter_verify(node_iter, b);
 }
 
 void bch2_btree_node_iter_fix(struct btree_iter *iter,
@@ -634,14 +632,18 @@ void bch2_btree_node_iter_fix(struct btree_iter *iter,
        struct bset_tree *t = bch2_bkey_to_bset_inlined(b, where);
        struct btree_iter *linked;
 
-       if (node_iter != &iter->l[b->c.level].iter)
+       if (node_iter != &iter->l[b->c.level].iter) {
                __bch2_btree_node_iter_fix(iter, b, node_iter, t,
-                                         where, clobber_u64s, new_u64s);
+                                          where, clobber_u64s, new_u64s);
+               bch2_btree_node_iter_verify(node_iter, b);
+       }
 
-       trans_for_each_iter_with_node(iter->trans, b, linked)
+       trans_for_each_iter_with_node(iter->trans, b, linked) {
                __bch2_btree_node_iter_fix(linked, b,
-                                         &linked->l[b->c.level].iter, t,
-                                         where, clobber_u64s, new_u64s);
+                                          &linked->l[b->c.level].iter, t,
+                                          where, clobber_u64s, new_u64s);
+               __bch2_btree_iter_verify(linked, b);
+       }
 }
 
 static inline struct bkey_s_c __btree_iter_unpack(struct btree_iter *iter,
@@ -1341,14 +1343,20 @@ static inline struct bkey_s_c btree_iter_peek_uptodate(struct btree_iter *iter)
        struct bkey_s_c ret = { .k = &iter->k };
 
        if (!bkey_deleted(&iter->k)) {
-               EBUG_ON(bch2_btree_node_iter_end(&l->iter));
-               ret.v = bkeyp_val(&l->b->format,
-                       __bch2_btree_node_iter_peek_all(&l->iter, l->b));
+               struct bkey_packed *_k =
+                       __bch2_btree_node_iter_peek_all(&l->iter, l->b);
+
+               ret.v = bkeyp_val(&l->b->format, _k);
+
+               if (debug_check_iterators(iter->trans->c)) {
+                       struct bkey k = bkey_unpack_key(l->b, _k);
+                       BUG_ON(memcmp(&k, &iter->k, sizeof(k)));
+               }
+
+               if (debug_check_bkeys(iter->trans->c))
+                       bch2_bkey_debugcheck(iter->trans->c, l->b, ret);
        }
 
-       if (debug_check_bkeys(iter->trans->c) &&
-           !bkey_deleted(ret.k))
-               bch2_bkey_debugcheck(iter->trans->c, l->b, ret);
        return ret;
 }
 
index d97d80859d1b12fd8e18b8c0cf6de8c3e1302590..0b3eed506c2c8ede0d11f5d04330ecd7fba911c0 100644 (file)
@@ -151,7 +151,6 @@ bool bch2_btree_bset_insert_key(struct btree_iter *iter,
                                bch2_bset_delete(b, k, clobber_u64s);
                                bch2_btree_node_iter_fix(iter, b, node_iter,
                                                         k, clobber_u64s, 0);
-                               bch2_btree_iter_verify(iter, b);
                                return true;
                        }
 
@@ -161,7 +160,6 @@ bool bch2_btree_bset_insert_key(struct btree_iter *iter,
                k->type = KEY_TYPE_deleted;
                bch2_btree_node_iter_fix(iter, b, node_iter, k,
                                         k->u64s, k->u64s);
-               bch2_btree_iter_verify(iter, b);
 
                if (bkey_whiteout(&insert->k)) {
                        reserve_whiteout(b, k);
@@ -185,7 +183,6 @@ overwrite:
        bch2_bset_insert(b, node_iter, k, insert, clobber_u64s);
        bch2_btree_node_iter_fix(iter, b, node_iter, k,
                                 clobber_u64s, k->u64s);
-       bch2_btree_iter_verify(iter, b);
        return true;
 }
 
index 00d77ed01234d23300f5c016d676a627803b6404..859b1e8206bdbd8fc95f054c4a25fe0d62e1a256 100644 (file)
@@ -875,13 +875,6 @@ static void verify_extent_nonoverlapping(struct bch_fs *c,
 #endif
 }
 
-static void verify_modified_extent(struct btree_iter *iter,
-                                  struct bkey_packed *k)
-{
-       bch2_btree_iter_verify(iter, iter->l[0].b);
-       bch2_verify_insert_pos(iter->l[0].b, k, k, k->u64s);
-}
-
 static void extent_bset_insert(struct bch_fs *c, struct btree_iter *iter,
                               struct bkey_i *insert)
 {
@@ -923,7 +916,6 @@ static void extent_bset_insert(struct bch_fs *c, struct btree_iter *iter,
 
        bch2_bset_insert(l->b, &l->iter, k, insert, 0);
        bch2_btree_node_iter_fix(iter, l->b, &l->iter, k, 0, k->u64s);
-       bch2_btree_iter_verify(iter, l->b);
 }
 
 static unsigned bch2_bkey_nr_alloc_ptrs(struct bkey_s_c k)
@@ -1138,17 +1130,16 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
        case BCH_EXTENT_OVERLAP_FRONT:
                /* insert overlaps with start of k: */
                __bch2_cut_front(insert->k.p, k);
-               BUG_ON(bkey_deleted(k.k));
+               EBUG_ON(bkey_deleted(k.k));
                extent_save(l->b, _k, k.k);
                bch2_btree_node_iter_fix(iter, l->b, &l->iter,
                                         _k, _k->u64s, _k->u64s);
-               verify_modified_extent(iter, _k);
                break;
 
        case BCH_EXTENT_OVERLAP_BACK:
                /* insert overlaps with end of k: */
                bch2_cut_back(bkey_start_pos(&insert->k), k.k);
-               BUG_ON(bkey_deleted(k.k));
+               EBUG_ON(bkey_deleted(k.k));
                extent_save(l->b, _k, k.k);
 
                /*
@@ -1159,7 +1150,6 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                bch2_bset_fix_invalidated_key(l->b, _k);
                bch2_btree_node_iter_fix(iter, l->b, &l->iter,
                                         _k, _k->u64s, _k->u64s);
-               verify_modified_extent(iter, _k);
                break;
 
        case BCH_EXTENT_OVERLAP_ALL: {
@@ -1176,12 +1166,10 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                        bch2_bset_delete(l->b, _k, _k->u64s);
                        bch2_btree_node_iter_fix(iter, l->b, &l->iter,
                                                 _k, u64s, 0);
-                       bch2_btree_iter_verify(iter, l->b);
                } else {
                        extent_save(l->b, _k, k.k);
                        bch2_btree_node_iter_fix(iter, l->b, &l->iter,
                                                 _k, _k->u64s, _k->u64s);
-                       verify_modified_extent(iter, _k);
                }
 
                break;
@@ -1213,7 +1201,6 @@ extent_squash(struct bch_fs *c, struct btree_iter *iter,
                extent_save(l->b, _k, k.k);
                bch2_btree_node_iter_fix(iter, l->b, &l->iter,
                                         _k, _k->u64s, _k->u64s);
-               verify_modified_extent(iter, _k);
 
                extent_bset_insert(c, iter, &split.k);
                break;
@@ -1806,7 +1793,6 @@ static bool bch2_extent_merge_inline(struct bch_fs *c,
        bch2_bset_fix_invalidated_key(b, m);
        bch2_btree_node_iter_fix(iter, b, node_iter,
                                 m, m->u64s, m->u64s);
-       verify_modified_extent(iter, m);
 
        return ret == BCH_MERGE_MERGE;
 }