[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 majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
Attachment:
signature.asc
Description: OpenPGP digital signature
