[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
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to