diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-05-26 20:18:45 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:39:34 -0900 |
commit | 8c10a31bca3aa6d3a4db3fd6a431aca61dee9198 (patch) | |
tree | 3ba0495418fe25c6b3917af75c42804d478f0c68 | |
parent | 7728fc43f0622a2df1b3d86b3db858f8cff99c12 (diff) |
bcache: move debug checks to bch_btree_node_iter_advance()
-rw-r--r-- | drivers/md/bcache/bset.c | 81 | ||||
-rw-r--r-- | drivers/md/bcache/bset.h | 35 | ||||
-rw-r--r-- | drivers/md/bcache/btree_iter.c | 10 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/extents.c | 2 |
5 files changed, 54 insertions, 76 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c index c590320facaa..608644b9593f 100644 --- a/drivers/md/bcache/bset.c +++ b/drivers/md/bcache/bset.c @@ -129,6 +129,34 @@ void __bch_verify_btree_nr_keys(struct btree_keys *b) BUG_ON(b->nr.unpacked_keys != unpacked); } +static void bch_btree_node_iter_next_check(struct btree_node_iter *iter, + struct btree_keys *b, + struct bkey_packed *k) +{ + const struct bkey_format *f = &b->format; + const struct bkey_packed *n = bch_btree_node_iter_peek_all(iter, b); + + bkey_unpack_key(f, k); + + if (n && + keys_out_of_order(f, k, n, iter->is_extents)) { + struct bkey ku = bkey_unpack_key(f, k); + struct bkey nu = bkey_unpack_key(f, n); + char buf1[80], buf2[80]; + + bch_dump_bucket(b); + bch_bkey_to_text(buf1, sizeof(buf1), &ku); + bch_bkey_to_text(buf2, sizeof(buf2), &nu); + panic("out of order/overlapping:\n%s\n%s\n", buf1, buf2); + } +} + +#else + +static void bch_btree_node_iter_next_check(struct btree_node_iter *iter, + struct btree_keys *b, + struct bkey_packed *k) {} + #endif /* Auxiliary search trees */ @@ -1387,6 +1415,8 @@ EXPORT_SYMBOL(bch_btree_node_iter_sort); void bch_btree_node_iter_advance(struct btree_node_iter *iter, struct btree_keys *b) { + struct bkey_packed *k = bch_btree_node_iter_peek_all(iter, b); + iter->data->k += __bch_btree_node_iter_peek_all(iter, b)->u64s; BUG_ON(iter->data->k > iter->data->end); @@ -1397,8 +1427,9 @@ void bch_btree_node_iter_advance(struct btree_node_iter *iter, } btree_node_iter_sift(iter, b, 0); + + bch_btree_node_iter_next_check(iter, b, k); } -EXPORT_SYMBOL(bch_btree_node_iter_advance); #ifdef CONFIG_BCACHE_DEBUG void bch_btree_node_iter_verify(struct btree_node_iter *iter, @@ -1426,42 +1457,6 @@ next: ; } } - -static void bch_btree_node_iter_next_check(struct btree_node_iter *iter, - struct btree_keys *b, - struct bkey_packed *k) -{ - const struct bkey_format *f = &b->format; - const struct bkey_packed *n = bch_btree_node_iter_peek_all(iter, b); - - bkey_unpack_key(f, k); - - if (n && - keys_out_of_order(f, k, n, iter->is_extents)) { - struct bkey ku = bkey_unpack_key(f, k); - struct bkey nu = bkey_unpack_key(f, n); - char buf1[80], buf2[80]; - - bch_dump_bucket(b); - bch_bkey_to_text(buf1, sizeof(buf1), &ku); - bch_bkey_to_text(buf2, sizeof(buf2), &nu); - panic("out of order/overlapping:\n%s\n%s\n", buf1, buf2); - } -} - -struct bkey_packed *bch_btree_node_iter_next_all(struct btree_node_iter *iter, - struct btree_keys *b) -{ - struct bkey_packed *ret = bch_btree_node_iter_peek_all(iter, b); - - if (ret) { - bch_btree_node_iter_advance(iter, b); - bch_btree_node_iter_next_check(iter, b, ret); - } - - return ret; -} -EXPORT_SYMBOL(bch_btree_node_iter_next_all); #endif /* @@ -1549,9 +1544,7 @@ static struct btree_nr_keys btree_mergesort_simple(struct btree_keys *b, { struct bkey_packed *in, *out = bset->start; - while (!bch_btree_node_iter_end(iter)) { - in = bch_btree_node_iter_next_all(iter, b); - + while ((in = bch_btree_node_iter_next_all(iter, b))) { if (!bkey_deleted(in)) { /* XXX: need better bkey_copy */ memcpy(out, in, bkey_bytes(in)); @@ -1580,9 +1573,7 @@ static struct btree_nr_keys btree_mergesort(struct btree_keys *dst, memset(&nr, 0, sizeof(nr)); - while (!bch_btree_node_iter_end(iter)) { - in = bch_btree_node_iter_next_all(iter, src); - + while ((in = bch_btree_node_iter_next_all(iter, src))) { if (bkey_deleted(in)) continue; @@ -1620,9 +1611,7 @@ static struct btree_nr_keys btree_mergesort_extents(struct btree_keys *dst, memset(&nr, 0, sizeof(nr)); - while (!bch_btree_node_iter_end(iter)) { - k = bch_btree_node_iter_next_all(iter, src); - + while ((k = bch_btree_node_iter_next_all(iter, src))) { if (bkey_deleted(k)) continue; diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h index a38f20df2d10..ac1ba48e46df 100644 --- a/drivers/md/bcache/bset.h +++ b/drivers/md/bcache/bset.h @@ -486,12 +486,18 @@ bch_btree_node_iter_peek_all(struct btree_node_iter *iter, : __bch_btree_node_iter_peek_all(iter, b); } -/* In debug mode, bch_btree_node_iter_next_all() does debug checks */ +static inline struct bkey_packed * +bch_btree_node_iter_peek(struct btree_node_iter *iter, struct btree_keys *b) +{ + struct bkey_packed *ret; + + while ((ret = bch_btree_node_iter_peek_all(iter, b)) && + bkey_deleted(ret)) + bch_btree_node_iter_advance(iter, b); + + return ret; +} -#ifdef CONFIG_BCACHE_DEBUG -struct bkey_packed *bch_btree_node_iter_next_all(struct btree_node_iter *, - struct btree_keys *); -#else static inline struct bkey_packed * bch_btree_node_iter_next_all(struct btree_node_iter *iter, struct btree_keys *b) { @@ -502,7 +508,6 @@ bch_btree_node_iter_next_all(struct btree_node_iter *iter, struct btree_keys *b) return ret; } -#endif static inline struct bkey_packed * bch_btree_node_iter_next(struct btree_node_iter *iter, struct btree_keys *b) @@ -517,18 +522,6 @@ bch_btree_node_iter_next(struct btree_node_iter *iter, struct btree_keys *b) } static inline struct bkey_packed * -bch_btree_node_iter_peek(struct btree_node_iter *iter, struct btree_keys *b) -{ - struct bkey_packed *ret; - - while ((ret = bch_btree_node_iter_peek_all(iter, b)) && - bkey_deleted(ret)) - bch_btree_node_iter_next_all(iter, b); - - return ret; -} - -static inline struct bkey_packed * bch_btree_node_iter_peek_overlapping(struct btree_node_iter *iter, struct btree_keys *b, struct bkey *end) @@ -539,7 +532,7 @@ bch_btree_node_iter_peek_overlapping(struct btree_node_iter *iter, while ((ret = bch_btree_node_iter_peek_all(iter, b)) && (bkey_cmp_left_packed(f, ret, bkey_start_pos(end)) <= 0)) - bch_btree_node_iter_next_all(iter, b); + bch_btree_node_iter_advance(iter, b); if (!ret) return NULL; @@ -560,10 +553,6 @@ struct bkey_packed *bch_btree_node_iter_prev_all(struct btree_node_iter *, for (bch_btree_node_iter_init_from_start((iter), (b)); \ ((k) = bch_btree_node_iter_next(iter, b));) -#define for_each_btree_node_key_all(b, k, iter) \ - for (bch_btree_node_iter_init_from_start((iter), (b)); \ - ((k) = bch_btree_node_iter_next_all(iter, b));) - struct bkey_s_c bch_btree_node_iter_next_unpack(struct btree_node_iter *, struct btree_keys *, struct bkey *); diff --git a/drivers/md/bcache/btree_iter.c b/drivers/md/bcache/btree_iter.c index 0481ffaebc95..44a93d824d22 100644 --- a/drivers/md/bcache/btree_iter.c +++ b/drivers/md/bcache/btree_iter.c @@ -240,10 +240,10 @@ static inline struct bkey_s_c __btree_iter_peek(struct btree_iter *iter) return ret; } -static inline void __btree_iter_next_all(struct btree_iter *iter) +static inline void __btree_iter_advance(struct btree_iter *iter) { - bch_btree_node_iter_next_all(&iter->node_iters[iter->level], - &iter->nodes[iter->level]->keys); + bch_btree_node_iter_advance(&iter->node_iters[iter->level], + &iter->nodes[iter->level]->keys); } static inline void btree_iter_node_set(struct btree_iter *iter, @@ -466,7 +466,7 @@ retry: while ((k = __btree_iter_peek_all(iter)).k && !btree_iter_pos_cmp(iter, pos, k.k->p)) - __btree_iter_next_all(iter); + __btree_iter_advance(iter); } if (iter->locks_want >= 0) @@ -668,7 +668,7 @@ recheck: } else if (!bkey_deleted(k.k)) { return k; } else { - __btree_iter_next_all(iter); + __btree_iter_advance(iter); } } diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c index 4d44ecb3fd87..3d12a642f1be 100644 --- a/drivers/md/bcache/btree_update.c +++ b/drivers/md/bcache/btree_update.c @@ -656,7 +656,7 @@ static bool bch_insert_fixup_btree_ptr(struct btree_iter *iter, btree_keys_account_key_drop(&b->keys.nr, k); } - bch_btree_node_iter_next_all(node_iter, &b->keys); + bch_btree_node_iter_advance(node_iter, &b->keys); } bch_btree_bset_insert(iter, b, node_iter, insert); diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index 54fed4ae1491..39060d2e03ca 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -131,7 +131,7 @@ bch_insert_fixup_key(struct btree_insert_trans *trans, btree_keys_account_key_drop(&b->keys.nr, k); } - bch_btree_node_iter_next_all(node_iter, &b->keys); + bch_btree_node_iter_advance(node_iter, &b->keys); } bch_btree_insert_and_journal(insert->iter, insert->k, res); |