X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=btrfs-map-logical.c;h=7a8bcff92415f6984856095916fbf9219a2e31eb;hb=14bf2b546d1cdc4ea20304d2fb7d67d75f8a2c55;hp=fd0286d5e054e194743be45ecbbb6a715e700990;hpb=2a796d84af42403ea149d35ee5578741c5470474;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c index fd0286d..7a8bcff 100644 --- a/btrfs-map-logical.c +++ b/btrfs-map-logical.c @@ -29,8 +29,9 @@ #include "transaction.h" #include "list.h" #include "utils.h" +#include "help.h" -#define BUFFER_SIZE (64 * 1024) +#define BUFFER_SIZE SZ_64K /* we write the mirror info to stdout unless they are dumping the data * to stdout @@ -81,7 +82,7 @@ again: } logical = key.objectid; if (key.type == BTRFS_METADATA_ITEM_KEY) - len = fs_info->tree_root->nodesize; + len = fs_info->nodesize; else len = key.offset; @@ -108,9 +109,8 @@ static int __print_mapping_info(struct btrfs_fs_info *fs_info, u64 logical, int i; cur_len = len - cur_offset; - ret = btrfs_map_block(&fs_info->mapping_tree, READ, - logical + cur_offset, &cur_len, - &multi, mirror_num, NULL); + ret = btrfs_map_block(fs_info, READ, logical + cur_offset, + &cur_len, &multi, mirror_num, NULL); if (ret) { fprintf(info_file, "Error: fails to map mirror%d logical %llu: %s\n", @@ -125,7 +125,7 @@ static int __print_mapping_info(struct btrfs_fs_info *fs_info, u64 logical, multi->stripes[0].physical, device->name); } - kfree(multi); + free(multi); multi = NULL; cur_offset += cur_len; } @@ -149,7 +149,7 @@ static int print_mapping_info(struct btrfs_fs_info *fs_info, u64 logical, int mirror_num; int ret = 0; - num_copies = btrfs_num_copies(&fs_info->mapping_tree, logical, len); + num_copies = btrfs_num_copies(fs_info, logical, len); for (mirror_num = 1; mirror_num <= num_copies; mirror_num++) { ret = __print_mapping_info(fs_info, logical, len, mirror_num); if (ret < 0) @@ -169,7 +169,7 @@ static int write_extent_content(struct btrfs_fs_info *fs_info, int out_fd, while (cur_offset < length) { cur_len = min_t(u64, length - cur_offset, BUFFER_SIZE); - ret = read_extent_data(fs_info->tree_root, buffer, + ret = read_extent_data(fs_info, buffer, logical + cur_offset, &cur_len, mirror); if (ret < 0) { fprintf(stderr, @@ -190,14 +190,14 @@ static int write_extent_content(struct btrfs_fs_info *fs_info, int out_fd, return ret; } -static void print_usage(void) __attribute__((noreturn)); +__attribute__((noreturn)) static void print_usage(void) { - fprintf(stderr, "usage: btrfs-map-logical [options] device\n"); - fprintf(stderr, "\t-l Logical extent to map\n"); - fprintf(stderr, "\t-c Copy of the extent to read (usually 1 or 2)\n"); - fprintf(stderr, "\t-o Output file to hold the extent\n"); - fprintf(stderr, "\t-b Number of bytes to read\n"); + printf("usage: btrfs-map-logical [options] device\n"); + printf("\t-l Logical extent to map\n"); + printf("\t-c Copy of the extent to read (usually 1 or 2)\n"); + printf("\t-o Output file to hold the extent\n"); + printf("\t-b Number of bytes to read\n"); exit(1); } @@ -285,7 +285,7 @@ int main(int argc, char **argv) } if (bytes == 0) - bytes = root->nodesize; + bytes = root->fs_info->nodesize; cur_logical = logical; cur_len = bytes; @@ -329,6 +329,11 @@ int main(int argc, char **argv) goto out_close_fd; if (ret > 0) break; + /* check again if there is overlap. */ + if (cur_logical + cur_len < logical || + cur_logical >= logical + bytes) + break; + real_logical = max(logical, cur_logical); real_len = min(logical + bytes, cur_logical + cur_len) - real_logical;