]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/debug.c
Update bcachefs sources to f38382c574 bcachefs: Improve key marking interface
[bcachefs-tools-debian] / libbcachefs / debug.c
index d4c8ce55e752113ce1152a6841642be81bd0bae8..47b8dd74dc62fd3b5fbce70ea299253a4cbd3fbc 100644 (file)
@@ -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;
 }