diff options
authorGui Hecheng <>2014-06-26 10:53:01 +0800
committerDavid Sterba <>2014-08-22 14:43:11 +0200
commit72ced9950a37f217a6f2377d7c557332185c413b (patch)
parent99ac0d5732668b95c3cab0ad20266562126d27f9 (diff)
btrfs-progs: fix btrfs-image old_restore fsck failure
Steps to reproduce: # mkfs.btrfs -f <dev1> # btrfs-image <dev1> <image_file> # btrfs-image -r -o <image_file> <dev2> # btrfs check <dev2> btrfs check output: : read block failed check_tree_block : Couldn't read tree root : Couldn't open file system The btrfs-image should not mess with the chunk tree under the old_restore way. The new restore way was introduced by: commit d6f7e3da0dae7b60cb7565f8a47c3b9045c52d1d Btrfs-progs: make btrfs-image restore with a valid chunk tree V2 ... And the following commit enhanced the new restore on the valid chunk tree building stuff: commit ef2a8889ef813ba77061f6a92f4954d047a78932 Btrfs-progs: make image restore with the original device offsets ... But the second commit should not effect the old_restore way since the old_restore way doesn't try to build a valid chunk tree at all. Signed-off-by: Gui Hecheng <> Signed-off-by: David Sterba <>
1 files changed, 2 insertions, 2 deletions
diff --git a/btrfs-image.c b/btrfs-image.c
index 2bf634bf..c1af019d 100644
--- a/btrfs-image.c
+++ b/btrfs-image.c
@@ -1686,7 +1686,7 @@ static void *restore_worker(void *data)
if (!mdres->fixup_offset) {
while (size) {
u64 chunk_size = size;
- if (!mdres->multi_devices)
+ if (!mdres->multi_devices && !mdres->old_restore)
bytenr = logical_to_physical(mdres,
async->start + offset,
@@ -2300,7 +2300,7 @@ static int __restore_metadump(const char *input, FILE *out, int old_restore,
goto failed_cluster;
- if (!multi_devices) {
+ if (!multi_devices && !old_restore) {
ret = build_chunk_tree(&mdrestore, cluster);
if (ret)
goto out;