diff mbox

[1/4] Btrfs-progs: chunk-recover: add new flag to prepare recovering for ordered data chunk

Message ID 1385616772-13222-1-git-send-email-guihc.fnst@cn.fujitsu.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Gui Hecheng Nov. 28, 2013, 5:32 a.m. UTC
From: Wang Shilong <wangsl.fnst@cn.fujitsu.com>

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>
---
 chunk-recover.c | 1 +
 ctree.h         | 1 +
 volumes.c       | 9 ++++++++-
 3 files changed, 10 insertions(+), 1 deletion(-)
diff mbox

Patch

diff --git a/chunk-recover.c b/chunk-recover.c
index e880bbc..ae0d318 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 92a396a..9f68862 100644
--- a/ctree.h
+++ b/ctree.h
@@ -977,6 +977,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 c38da6c..bd01270 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++) {