-static struct extent_buffer * debug_read_block(struct btrfs_root *root,
- u64 bytenr, u32 blocksize, u64 copy)
-{
- int ret;
- struct extent_buffer *eb;
- u64 length;
- struct btrfs_multi_bio *multi = NULL;
- struct btrfs_device *device;
- int num_copies;
- int mirror_num = 1;
-
- eb = btrfs_find_create_tree_block(root, bytenr, blocksize);
- if (!eb)
- return NULL;
-
- length = blocksize;
- while (1) {
- ret = btrfs_map_block(&root->fs_info->mapping_tree, READ,
- eb->start, &length, &multi,
- mirror_num, NULL);
- if (ret) {
- fprintf(info_file,
- "Error: fails to map mirror%d logical %llu: %s\n",
- mirror_num, (unsigned long long)eb->start,
- strerror(-ret));
- free_extent_buffer(eb);
- return NULL;
- }
- device = multi->stripes[0].dev;
- eb->fd = device->fd;
- device->total_ios++;
- eb->dev_bytenr = multi->stripes[0].physical;
-
- fprintf(info_file, "mirror %d logical %Lu physical %Lu "
- "device %s\n", mirror_num, (unsigned long long)bytenr,
- (unsigned long long)eb->dev_bytenr, device->name);
- kfree(multi);
-
- if (!copy || mirror_num == copy) {
- ret = read_extent_from_disk(eb, 0, eb->len);
- if (ret) {
- fprintf(info_file,
- "Error: failed to read extent: mirror %d logical %llu: %s\n",
- mirror_num, (unsigned long long)eb->start,
- strerror(-ret));
- free_extent_buffer(eb);
- eb = NULL;
- break;
- }
- }
-
- num_copies = btrfs_num_copies(&root->fs_info->mapping_tree,
- eb->start, eb->len);
- if (num_copies == 1)
- break;
-
- mirror_num++;
- if (mirror_num > num_copies)
- break;
- }
- return eb;
-}
-
-static void print_usage(void) __attribute__((noreturn));