diff options
author | Qu Wenruo <quwenruo@cn.fujitsu.com> | 2015-06-17 15:49:01 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2015-06-17 16:09:33 +0200 |
commit | 02454f307b76f9ef64543ada5a5e420d4c3a6c50 (patch) | |
tree | 9c11551908373d8cf5516b9b4b7e002820190922 | |
parent | 0074cd315c9e82e4f0ff8348b77d785da7eb487b (diff) |
btrfs-progs: map-logical: introduce map_one_extent function
Introduce the function to get accurate extent length based on extent
tree search.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
-rw-r--r-- | btrfs-map-logical.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/btrfs-map-logical.c b/btrfs-map-logical.c index e5e2da5d..8442779b 100644 --- a/btrfs-map-logical.c +++ b/btrfs-map-logical.c @@ -35,6 +35,64 @@ * */ static FILE *info_file; +static int map_one_extent(struct btrfs_fs_info *fs_info, + u64 *logical_ret, u64 *len_ret, int search_foward) +{ + struct btrfs_path *path; + struct btrfs_key key; + u64 logical; + u64 len = 0; + int ret = 0; + + BUG_ON(!logical_ret); + logical = *logical_ret; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + key.objectid = logical; + key.type = 0; + key.offset = 0; + + ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, + 0, 0); + if (ret < 0) + goto out; + BUG_ON(ret == 0); + ret = 0; + +again: + btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); + if ((search_foward && key.objectid < logical) || + (!search_foward && key.objectid > logical) || + (key.type != BTRFS_EXTENT_ITEM_KEY && + key.type != BTRFS_METADATA_ITEM_KEY)) { + if (!search_foward) + ret = btrfs_previous_extent_item(fs_info->extent_root, + path, 0); + else + ret = btrfs_next_item(fs_info->extent_root, path); + if (ret) + goto out; + goto again; + } + logical = key.objectid; + if (key.type == BTRFS_METADATA_ITEM_KEY) + len = fs_info->tree_root->leafsize; + else + len = key.offset; + +out: + btrfs_free_path(path); + if (!ret) { + *logical_ret = logical; + if (len_ret) + *len_ret = len; + } + return ret; +} + static struct extent_buffer * debug_read_block(struct btrfs_root *root, u64 bytenr, u32 blocksize, u64 copy) { |