diff --git a/c_src/cmd_dump.c b/c_src/cmd_dump.c index 6e1b9df2..b3edf26e 100644 --- a/c_src/cmd_dump.c +++ b/c_src/cmd_dump.c @@ -30,6 +30,16 @@ static void dump_usage(void) "Report bugs to "); } +static void dump_node(struct bch_fs *c, struct bch_dev *ca, struct bkey_s_c k, ranges *data) +{ + struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k); + + bkey_for_each_ptr(ptrs, ptr) + if (ptr->dev == ca->dev_idx) + range_add(data, ptr->offset << 9, + (btree_ptr_sectors_written(k) << 9) ?: c->opts.btree_node_size); +} + static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd, bool entire_journal) { @@ -60,7 +70,6 @@ static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd, /* Btree: */ for (i = 0; i < BTREE_ID_NR; i++) { - struct bkey_ptrs_c ptrs; struct btree_trans *trans = bch2_trans_get(c); struct btree_iter iter; struct btree *b; @@ -70,37 +79,22 @@ static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd, struct bkey u; struct bkey_s_c k; - for_each_btree_node_key_unpack(b, k, &iter, &u) { - ptrs = bch2_bkey_ptrs_c(k); - - bkey_for_each_ptr(ptrs, ptr) - if (ptr->dev == ca->dev_idx) - range_add(&data, - ptr->offset << 9, - btree_ptr_sectors_written(&b->key) << 9); - } + for_each_btree_node_key_unpack(b, k, &iter, &u) + dump_node(c, ca, k, &data); } if (ret) die("error %s walking btree nodes", bch2_err_str(ret)); b = bch2_btree_id_root(c, i)->b; - if (!btree_node_fake(b)) { - ptrs = bch2_bkey_ptrs_c(bkey_i_to_s_c(&b->key)); - - bkey_for_each_ptr(ptrs, ptr) - if (ptr->dev == ca->dev_idx) - range_add(&data, - ptr->offset << 9, - btree_ptr_sectors_written(&b->key) << 9); - } + if (!btree_node_fake(b)) + dump_node(c, ca, bkey_i_to_s_c(&b->key), &data); bch2_trans_iter_exit(trans, &iter); bch2_trans_put(trans); } - qcow2_write_image(ca->disk_sb.bdev->bd_fd, fd, &data, - max_t(unsigned, c->opts.btree_node_size / 8, block_bytes(c))); + qcow2_write_image(ca->disk_sb.bdev->bd_fd, fd, &data, block_bytes(c)); darray_exit(&data); } diff --git a/c_src/tools-util.c b/c_src/tools-util.c index 7da1d689..43c9b789 100644 --- a/c_src/tools-util.c +++ b/c_src/tools-util.c @@ -271,7 +271,7 @@ void ranges_sort_merge(ranges *r) /* Merge contiguous ranges: */ darray_for_each(*r, i) { - struct range *t = tmp.nr ? &tmp.data[tmp.nr - 1] : NULL; + struct range *t = tmp.nr ? &tmp.data[tmp.nr - 1] : NULL; if (t && t->end >= i->start) t->end = max(t->end, i->end);