Btrfs-progs: chunk-recover: add new flag to prepare recovering for ordered data chunk

When reading block groups we will searching it's corresponding chunk, however, at this
time, some chunks has not been built(data chunks raid0/raid10/raid56), don't bug_on here,
we will try to rebuild these chunks later.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
master
Wang Shilong 2013-11-28 13:32:49 +08:00 committed by Chris Mason
parent 387d5f3234
commit 52ddfa74fe
3 changed files with 10 additions and 1 deletions

View File

@ -1197,6 +1197,7 @@ open_ctree_with_broken_chunk(struct recover_control *rc)
fprintf(stderr, "Failed to allocate memory for fs_info\n");
return ERR_PTR(-ENOMEM);
}
fs_info->is_chunk_recover = 1;
fs_info->fs_devices = rc->fs_devices;
ret = btrfs_open_devices(fs_info->fs_devices, O_RDWR);

View File

@ -973,6 +973,7 @@ struct btrfs_fs_info {
int system_allocs;
int readonly;
int on_restoring;
int is_chunk_recover;
int (*free_extent_hook)(struct btrfs_trans_handle *trans,
struct btrfs_root *root,
u64 bytenr, u64 num_bytes, u64 parent,

View File

@ -1496,8 +1496,15 @@ int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset)
int readonly = 0;
int i;
/*
* During chunk recovering, we may fail to find block group's
* corresponding chunk, we will rebuild it later
*/
ce = search_cache_extent(&map_tree->cache_tree, chunk_offset);
BUG_ON(!ce);
if (!root->fs_info->is_chunk_recover)
BUG_ON(!ce);
else
return 0;
map = container_of(ce, struct map_lookup, ce);
for (i = 0; i < map->num_stripes; i++) {