From 52ddfa74fe191dd8ec23702be2aac3f76f86e4d3 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Thu, 28 Nov 2013 13:32:49 +0800 Subject: [PATCH] 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 Signed-off-by: David Sterba Signed-off-by: Chris Mason --- chunk-recover.c | 1 + ctree.h | 1 + volumes.c | 9 ++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/chunk-recover.c b/chunk-recover.c index e880bbc8..ae0d318c 100644 --- a/chunk-recover.c +++ b/chunk-recover.c @@ -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); diff --git a/ctree.h b/ctree.h index 187026cc..6d101848 100644 --- a/ctree.h +++ b/ctree.h @@ -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, diff --git a/volumes.c b/volumes.c index c38da6cc..bd012704 100644 --- a/volumes.c +++ b/volumes.c @@ -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++) {