aboutsummaryrefslogtreecommitdiffstats
path: root/volumes.c
diff options
context:
space:
mode:
authorGui Hecheng <guihc.fnst@cn.fujitsu.com>2014-11-26 10:43:41 +0800
committerDavid Sterba <dsterba@suse.cz>2014-12-09 14:32:38 +0100
commit662d1dddcad79839f1cbc13cb0be3ec326af2933 (patch)
treebec570ce3392c8ff4467a235128556662e846be7 /volumes.c
parentf0b1ff4481798c877bdf8869b8f69f36124466a8 (diff)
downloadbtrfs-progs-662d1dddcad79839f1cbc13cb0be3ec326af2933.tar.gz
btrfs-progs-662d1dddcad79839f1cbc13cb0be3ec326af2933.tar.xz
btrfs-progs-662d1dddcad79839f1cbc13cb0be3ec326af2933.zip
btrfs-progs: convert: fix unable to rollback case with removed empty block groups
Run fstests: btrfs/012 will fail with message: unable to do rollback It is because the rollback function checks sequentially each piece of space to map to a certain block group. If some piece doesn't, rollback refuses to continue. After kernel commit: commit 47ab2a6c689913db23ccae38349714edf8365e0a Btrfs: remove empty block groups automatically Empty block groups are removed, so there are possible gaps: |--block group 1--| |--block group 2--| ^ | gap So the piece of space of the gap belongs to a removed empty block group, and rollback should detect this case, and feel free to continue. Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'volumes.c')
-rw-r--r--volumes.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/volumes.c b/volumes.c
index a1fd162..a988cdb 100644
--- a/volumes.c
+++ b/volumes.c
@@ -1318,10 +1318,12 @@ again:
ce = search_cache_extent(&map_tree->cache_tree, logical);
if (!ce) {
kfree(multi);
+ *length = (u64)-1;
return -ENOENT;
}
if (ce->start > logical) {
kfree(multi);
+ *length = ce->start - logical;
return -ENOENT;
}