On 22.02.2018 11:23, Qu Wenruo wrote: > > > [snip] >>> -} >>> - >>> void btrfs_put_block_group_cache(struct btrfs_fs_info *info) >>> { >>> struct btrfs_block_group_cache *block_group; >>> @@ -9988,12 +9934,15 @@ int btrfs_read_block_groups(struct btrfs_fs_info >>> *info) >>> { >>> struct btrfs_path *path; >>> int ret; >>> + struct btrfs_mapping_tree *map_tree = &info->mapping_tree; >>> + struct btrfs_root *extent_root = info->extent_root; >>> struct btrfs_block_group_cache *cache; >>> struct btrfs_space_info *space_info; >>> struct btrfs_key key; >>> struct btrfs_key found_key; >>> struct extent_buffer *leaf; >>> int need_clear = 0; >>> + u64 cur = 0; >>> u64 cache_gen; >>> u64 feature; >>> int mixed; >>> @@ -10001,13 +9950,9 @@ int btrfs_read_block_groups(struct btrfs_fs_info >>> *info) >>> feature = btrfs_super_incompat_flags(info->super_copy); >>> mixed = !!(feature & BTRFS_FEATURE_INCOMPAT_MIXED_GROUPS); >>> >>> - key.objectid = 0; >>> - key.offset = 0; >>> - key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; >>> path = btrfs_alloc_path(); >>> if (!path) >>> return -ENOMEM; >>> - path->reada = READA_FORWARD; >>> >>> cache_gen = btrfs_super_cache_generation(info->super_copy); >>> if (btrfs_test_opt(info, SPACE_CACHE) && >>> @@ -10017,10 +9962,30 @@ int btrfs_read_block_groups(struct btrfs_fs_info >>> *info) >>> need_clear = 1; >>> >>> while (1) { >>> - ret = find_first_block_group(info, path, &key); >>> - if (ret > 0) >>> + struct extent_map *em; >>> + >>> + read_lock(&map_tree->map_tree.lock); >>> + em = lookup_extent_mapping(&map_tree->map_tree, cur, >>> + ((u64)-1) - cur); >>> + read_unlock(&map_tree->map_tree.lock); >>> + if (!em) >>> break; >>> - if (ret != 0) >>> + >>> + key.objectid = em->start; >>> + key.offset = em->len; >>> + key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; >>> + cur = em->start + em->len; >>> + free_extent_map(em); >>> + >>> + ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); >>> + if (ret > 0) { >>> + WARN(1, KERN_ERR >>> + "chunk [%llu %llu) doesn't has its block group item\n", >> >> I'd rephrase this to "chunk [%llu %llu) doesn't have matching block >> group item" > > Sounds good. > > Sorry for my poor English.
No need to apologise neither of us is a native speaker :) > >> >>> + key.objectid, key.objectid + key.offset); >>> + ret = -ENOENT; >>> + goto error; >>> + } >> >> Looks good, howevr when the time for merging comes I'd rather have this >> code be part of a function named find_block_group or some such. Let's >> see if this code brings any improvements and then bikeshed on the details. > > Isn't that the original find_first_block_group() function? Yes but since you have removed it and you are not really looking for the "first" block group but just looking for a block group then the new name makes more sense and collects the code in one place. > > Thanks, > Qu > >> >>> + if (ret < 0) >>> goto error; >>> >>> leaf = path->nodes[0]; >>> @@ -10062,7 +10027,6 @@ int btrfs_read_block_groups(struct btrfs_fs_info >>> *info) >>> goto error; >>> } >>> >>> - key.objectid = found_key.objectid + found_key.offset; >>> btrfs_release_path(path); >>> >>> /* >>> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in >> the body of a message to majord...@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> > -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html