diff options
-rw-r--r-- | find-root.c | 18 | ||||
-rw-r--r-- | volumes.c | 6 | ||||
-rw-r--r-- | volumes.h | 16 |
3 files changed, 29 insertions, 11 deletions
diff --git a/find-root.c b/find-root.c index 55e7942..f0204c8 100644 --- a/find-root.c +++ b/find-root.c @@ -108,8 +108,8 @@ int btrfs_find_root_search(struct btrfs_root *chunk_root, { struct btrfs_fs_info *fs_info = chunk_root->fs_info; struct extent_buffer *eb; - u64 metadata_offset = 0; - u64 metadata_size = 0; + u64 chunk_offset = 0; + u64 chunk_size = 0; u64 offset = 0; u32 leafsize = chunk_root->leafsize; int suppress_errors = 0; @@ -118,15 +118,21 @@ int btrfs_find_root_search(struct btrfs_root *chunk_root, suppress_errors = fs_info->suppress_check_block_errors; fs_info->suppress_check_block_errors = 1; while (1) { - ret = btrfs_next_metadata(&fs_info->mapping_tree, - &metadata_offset, &metadata_size); + if (filter->objectid != BTRFS_CHUNK_TREE_OBJECTID) + ret = btrfs_next_bg_metadata(&fs_info->mapping_tree, + &chunk_offset, + &chunk_size); + else + ret = btrfs_next_bg_system(&fs_info->mapping_tree, + &chunk_offset, + &chunk_size); if (ret) { if (ret == -ENOENT) ret = 0; break; } - for (offset = metadata_offset; - offset < metadata_offset + metadata_size; + for (offset = chunk_offset; + offset < chunk_offset + chunk_size; offset += chunk_root->leafsize) { eb = read_tree_block(chunk_root, offset, leafsize, 0); if (!eb || IS_ERR(eb)) @@ -1165,8 +1165,8 @@ int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len) return ret; } -int btrfs_next_metadata(struct btrfs_mapping_tree *map_tree, u64 *logical, - u64 *size) +int btrfs_next_bg(struct btrfs_mapping_tree *map_tree, u64 *logical, + u64 *size, u64 type) { struct cache_extent *ce; struct map_lookup *map; @@ -1179,7 +1179,7 @@ int btrfs_next_metadata(struct btrfs_mapping_tree *map_tree, u64 *logical, return -ENOENT; map = container_of(ce, struct map_lookup, ce); - if (map->type & BTRFS_BLOCK_GROUP_METADATA) { + if (map->type & type) { *logical = ce->start; *size = ce->size; return 0; @@ -167,8 +167,20 @@ int btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw, u64 logical, u64 *length, struct btrfs_multi_bio **multi_ret, int mirror_num, u64 **raid_map_ret); -int btrfs_next_metadata(struct btrfs_mapping_tree *map_tree, u64 *logical, - u64 *size); +int btrfs_next_bg(struct btrfs_mapping_tree *map_tree, u64 *logical, + u64 *size, u64 type); +static inline int btrfs_next_bg_metadata(struct btrfs_mapping_tree *map_tree, + u64 *logical, u64 *size) +{ + return btrfs_next_bg(map_tree, logical, size, + BTRFS_BLOCK_GROUP_METADATA); +} +static inline int btrfs_next_bg_system(struct btrfs_mapping_tree *map_tree, + u64 *logical, u64 *size) +{ + return btrfs_next_bg(map_tree, logical, size, + BTRFS_BLOCK_GROUP_SYSTEM); +} int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree, u64 chunk_start, u64 physical, u64 devid, u64 **logical, int *naddrs, int *stripe_len); |