Recent kernel will refuse to mount restored image, even the source fs is
empty:
# mkfs.btrfs -f /dev/test/test
# btrfs-image /dev/test/test /tmp/dump
# btrfs-image -r /tmp/dump ~/test.img
# mount ~/test.img /mnt/btrfs
mount: /mnt/btrfs: wrong fs type, bad option, bad superblock on /dev/loop0,
missing codepage or helper program, or other error.
# dmesg -t | tail -n 7
loop0: detected capacity change from 10592 to 0
BTRFS info (device loop0): disk space caching is enabled
BTRFS info (device loop0): has skinny extents
BTRFS info (device loop0): flagging fs with big metadata feature
BTRFS error (device loop0): device total_bytes should be at most 5423104 but
found 10737418240
BTRFS error (device loop0): failed to read chunk tree: -22
BTRFS error (device loop0): open_ctree failed
This is triggered by a recent kernel commit 3a160a933111 ("btrfs: drop never
met disk total
bytes check in verify_one_dev_extent").
But the root cause is, we didn't enlarge the output file if the source
image only contains single device.
This bug won't affect restore to block device, or the destination file
is already large enough.
This patchset will fix the problem, and with new test case to detect
such problem.
Also remove one dead code exposed during the development.
Qu Wenruo (3):
btrfs: image: remove the dead stat() call
btrfs-progs: image: enlarge the output file if no tree modification is
needed for restore
btrfs-progs: misc-tests: add test to ensure the restored image can be
mounted
image/main.c | 51 ++++++++++++++++---
.../047-image-restore-mount/test.sh | 19 +++++++
2 files changed, 62 insertions(+), 8 deletions(-)
create mode 100755 tests/misc-tests/047-image-restore-mount/test.sh
--
2.30.1