X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Fdebug.c;h=47b8dd74dc62fd3b5fbce70ea299253a4cbd3fbc;hb=7e3538959966b80be3d4cfcb7076c8ab40a4be11;hp=d4c8ce55e752113ce1152a6841642be81bd0bae8;hpb=c35fbbc025c6099969befb4dfaf065215cf40cf3;p=bcachefs-tools-debian diff --git a/libbcachefs/debug.c b/libbcachefs/debug.c index d4c8ce5..47b8dd7 100644 --- a/libbcachefs/debug.c +++ b/libbcachefs/debug.c @@ -35,7 +35,8 @@ void __bch2_btree_verify(struct bch_fs *c, struct btree *b) struct btree *v = c->verify_data; struct btree_node *n_ondisk, *n_sorted, *n_inmemory; struct bset *sorted, *inmemory; - struct extent_pick_ptr pick; + struct extent_ptr_decoded pick; + struct bch_dev *ca; struct bio *bio; if (c->opts.nochanges) @@ -54,12 +55,18 @@ void __bch2_btree_verify(struct bch_fs *c, struct btree *b) v->btree_id = b->btree_id; bch2_btree_keys_init(v, &c->expensive_debug_checks); - pick = bch2_btree_pick_ptr(c, b); - if (IS_ERR_OR_NULL(pick.ca)) + if (bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key), + NULL, &pick) <= 0) return; - bio = bio_alloc_bioset(GFP_NOIO, btree_pages(c), &c->btree_read_bio); - bio->bi_bdev = pick.ca->disk_sb.bdev; + ca = bch_dev_bkey_exists(c, pick.ptr.dev); + if (!bch2_dev_get_ioref(ca, READ)) + return; + + bio = bio_alloc_bioset(GFP_NOIO, + buf_pages(n_sorted, btree_bytes(c)), + &c->btree_bio); + bio_set_dev(bio, ca->disk_sb.bdev); bio->bi_opf = REQ_OP_READ|REQ_META; bio->bi_iter.bi_sector = pick.ptr.offset; bio->bi_iter.bi_size = btree_bytes(c); @@ -68,14 +75,14 @@ void __bch2_btree_verify(struct bch_fs *c, struct btree *b) submit_bio_wait(bio); bio_put(bio); + percpu_ref_put(&ca->io_ref); memcpy(n_ondisk, n_sorted, btree_bytes(c)); - bch2_btree_node_read_done(c, v, pick.ca, &pick.ptr); - n_sorted = c->verify_data->data; - - percpu_ref_put(&pick.ca->io_ref); + if (bch2_btree_node_read_done(c, v, false)) + goto out; + n_sorted = c->verify_data->data; sorted = &n_sorted->keys; inmemory = &n_inmemory->keys; @@ -127,7 +134,7 @@ void __bch2_btree_verify(struct bch_fs *c, struct btree *b) console_unlock(); panic("verify failed at %u\n", j); } - +out: mutex_unlock(&c->verify_lock); btree_node_io_unlock(b); } @@ -197,7 +204,8 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf, size_t size, loff_t *ppos) { struct dump_iter *i = file->private_data; - struct btree_iter iter; + struct btree_trans trans; + struct btree_iter *iter; struct bkey_s_c k; int err; @@ -212,19 +220,20 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf, if (!i->size) return i->ret; - bch2_btree_iter_init(&iter, i->c, i->id, i->from, BTREE_ITER_PREFETCH); + bch2_trans_init(&trans, i->c, 0, 0); - while ((k = bch2_btree_iter_peek(&iter)).k && - !(err = btree_iter_err(k))) { - bch2_bkey_val_to_text(i->c, bkey_type(0, i->id), - i->buf, sizeof(i->buf), k); + iter = bch2_trans_get_iter(&trans, i->id, i->from, BTREE_ITER_PREFETCH); + k = bch2_btree_iter_peek(iter); + + while (k.k && !(err = bkey_err(k))) { + bch2_bkey_val_to_text(&PBUF(i->buf), i->c, k); i->bytes = strlen(i->buf); BUG_ON(i->bytes >= PAGE_SIZE); i->buf[i->bytes] = '\n'; i->bytes++; - bch2_btree_iter_advance_pos(&iter); - i->from = iter.pos; + k = bch2_btree_iter_next(iter); + i->from = iter->pos; err = flush_buf(i); if (err) @@ -233,7 +242,7 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf, if (!i->size) break; } - bch2_btree_iter_unlock(&iter); + bch2_trans_exit(&trans); return err < 0 ? err : i->ret; } @@ -249,7 +258,8 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf, size_t size, loff_t *ppos) { struct dump_iter *i = file->private_data; - struct btree_iter iter; + struct btree_trans trans; + struct btree_iter *iter; struct btree *b; int err; @@ -264,9 +274,11 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf, if (!i->size || !bkey_cmp(POS_MAX, i->from)) return i->ret; - for_each_btree_node(&iter, i->c, i->id, i->from, 0, b) { - i->bytes = bch2_print_btree_node(i->c, b, i->buf, - sizeof(i->buf)); + bch2_trans_init(&trans, i->c, 0, 0); + + for_each_btree_node(&trans, iter, i->id, i->from, 0, b) { + bch2_btree_node_to_text(&PBUF(i->buf), i->c, b); + i->bytes = strlen(i->buf); err = flush_buf(i); if (err) break; @@ -282,7 +294,7 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf, if (!i->size) break; } - bch2_btree_iter_unlock(&iter); + bch2_trans_exit(&trans); return err < 0 ? err : i->ret; } @@ -298,7 +310,8 @@ static ssize_t bch2_read_bfloat_failed(struct file *file, char __user *buf, size_t size, loff_t *ppos) { struct dump_iter *i = file->private_data; - struct btree_iter iter; + struct btree_trans trans; + struct btree_iter *iter; struct bkey_s_c k; struct btree *prev_node = NULL; int err; @@ -314,31 +327,33 @@ static ssize_t bch2_read_bfloat_failed(struct file *file, char __user *buf, if (!i->size) return i->ret; - bch2_btree_iter_init(&iter, i->c, i->id, i->from, BTREE_ITER_PREFETCH); + bch2_trans_init(&trans, i->c, 0, 0); - while ((k = bch2_btree_iter_peek(&iter)).k && - !(err = btree_iter_err(k))) { - struct btree *b = iter.nodes[0]; - struct btree_node_iter *node_iter = &iter.node_iters[0]; - struct bkey_packed *_k = bch2_btree_node_iter_peek(node_iter, b); + iter = bch2_trans_get_iter(&trans, i->id, i->from, BTREE_ITER_PREFETCH); - if (iter.nodes[0] != prev_node) { - i->bytes = bch2_print_btree_node(i->c, b, i->buf, - sizeof(i->buf)); + while ((k = bch2_btree_iter_peek(iter)).k && + !(err = bkey_err(k))) { + struct btree_iter_level *l = &iter->l[0]; + struct bkey_packed *_k = + bch2_btree_node_iter_peek(&l->iter, l->b); + + if (l->b != prev_node) { + bch2_btree_node_to_text(&PBUF(i->buf), i->c, l->b); + i->bytes = strlen(i->buf); err = flush_buf(i); if (err) break; } - prev_node = iter.nodes[0]; - - i->bytes = bch2_bkey_print_bfloat(b, _k, i->buf, sizeof(i->buf)); + prev_node = l->b; + bch2_bfloat_to_text(&PBUF(i->buf), l->b, _k); + i->bytes = strlen(i->buf); err = flush_buf(i); if (err) break; - bch2_btree_iter_advance_pos(&iter); - i->from = iter.pos; + bch2_btree_iter_next(iter); + i->from = iter->pos; err = flush_buf(i); if (err) @@ -347,7 +362,7 @@ static ssize_t bch2_read_bfloat_failed(struct file *file, char __user *buf, if (!i->size) break; } - bch2_btree_iter_unlock(&iter); + bch2_trans_exit(&trans); return err < 0 ? err : i->ret; }