[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. > >> + 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? 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 >
signature.asc
Description: OpenPGP digital signature