diff options
Diffstat (limited to 'fs/bcachefs')
-rw-r--r-- | fs/bcachefs/bcachefs.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/bset.c | 13 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 8 |
4 files changed, 21 insertions, 8 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index a815d7a488a6..a2d8e37e7eb6 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -257,6 +257,8 @@ do { \ BCH_DEBUG_PARAM(expensive_debug_checks, \ "Enables various runtime debugging checks that " \ "significantly affect performance") \ + BCH_DEBUG_PARAM(debug_check_iterators, \ + "Enables extra verification for btree iterators") \ BCH_DEBUG_PARAM(debug_check_bkeys, \ "Run bkey_debugcheck (primarily checking GC/allocation "\ "information) when iterating over keys") \ diff --git a/fs/bcachefs/bset.c b/fs/bcachefs/bset.c index ac84aac4a263..68442a26756f 100644 --- a/fs/bcachefs/bset.c +++ b/fs/bcachefs/bset.c @@ -1023,7 +1023,7 @@ struct bkey_packed *bch2_bkey_prev_filter(struct btree *b, k = p; } - if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG)) { + if (btree_keys_expensive_checks(b)) { BUG_ON(ret >= orig_k); for (i = ret ? bkey_next(ret) : btree_bkey_first(b, t); @@ -1644,10 +1644,11 @@ static inline void __bch2_btree_node_iter_advance(struct btree_node_iter *iter, void bch2_btree_node_iter_advance(struct btree_node_iter *iter, struct btree *b) { -#ifdef CONFIG_BCACHEFS_DEBUG - bch2_btree_node_iter_verify(iter, b); - bch2_btree_node_iter_next_check(iter, b); -#endif + if (btree_keys_expensive_checks(b)) { + bch2_btree_node_iter_verify(iter, b); + bch2_btree_node_iter_next_check(iter, b); + } + __bch2_btree_node_iter_advance(iter, b); } @@ -1710,7 +1711,7 @@ found: iter->data[0].k = __btree_node_key_to_offset(b, prev); iter->data[0].end = end; out: - if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG)) { + if (btree_keys_expensive_checks(b)) { struct btree_node_iter iter2 = *iter; if (prev) diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index ad7858d77a58..bc9d8444e220 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -429,6 +429,9 @@ static void __bch2_btree_iter_verify(struct btree_iter *iter, struct btree_node_iter tmp = l->iter; struct bkey_packed *k; + if (!debug_check_iterators(iter->trans->c)) + return; + if (iter->uptodate > BTREE_ITER_NEED_PEEK) return; @@ -475,6 +478,9 @@ void bch2_btree_iter_verify(struct btree_iter *iter, struct btree *b) { struct btree_iter *linked; + if (!debug_check_iterators(iter->trans->c)) + return; + trans_for_each_iter_with_node(iter->trans, b, linked) __bch2_btree_iter_verify(linked, b); } diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index ce46417b07a0..2e7c3e82f03b 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -788,7 +788,8 @@ static bool bch2_extent_merge_inline(struct bch_fs *, struct bkey_packed *, bool); -static void verify_extent_nonoverlapping(struct btree *b, +static void verify_extent_nonoverlapping(struct bch_fs *c, + struct btree *b, struct btree_node_iter *_iter, struct bkey_i *insert) { @@ -797,6 +798,9 @@ static void verify_extent_nonoverlapping(struct btree *b, struct bkey_packed *k; struct bkey uk; + if (!expensive_debug_checks(c)) + return; + iter = *_iter; k = bch2_btree_node_iter_prev_filter(&iter, b, KEY_TYPE_discard); BUG_ON(k && @@ -847,7 +851,7 @@ static void extent_bset_insert(struct bch_fs *c, struct btree_iter *iter, BUG_ON(insert->k.u64s > bch_btree_keys_u64s_remaining(c, l->b)); EBUG_ON(bkey_deleted(&insert->k) || !insert->k.size); - verify_extent_nonoverlapping(l->b, &l->iter, insert); + verify_extent_nonoverlapping(c, l->b, &l->iter, insert); node_iter = l->iter; k = bch2_btree_node_iter_prev_filter(&node_iter, l->b, KEY_TYPE_discard); |