summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolay Borisov <nborisov@suse.com>2017-12-05 10:39:48 +0200
committerDavid Sterba <dsterba@suse.com>2018-01-31 15:14:01 +0100
commite764625f90f947f927f78b4166a34d9d5755ef63 (patch)
tree410aedc2924b49661af04723861b878c27e8712d
parent4487aa64e73ab0f029290b67f3d619858ad516bb (diff)
btrfs-progs: tests: Add test for super block recovery
This functionality regressed some time ago and it was never caught. Seems no one complained of that, but to be sure add a regression test to prevent future regressions. Signed-off-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rwxr-xr-xtests/fsck-tests/029-superblock-recovery/test.sh64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/fsck-tests/029-superblock-recovery/test.sh b/tests/fsck-tests/029-superblock-recovery/test.sh
new file mode 100755
index 00000000..c1dfe7f5
--- /dev/null
+++ b/tests/fsck-tests/029-superblock-recovery/test.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+# Test that any superblock is correctly detected
+# and fixed by btrfs rescue
+
+source "$TOP/tests/common"
+
+check_prereq btrfs
+check_prereq mkfs.btrfs
+check_prereq btrfs-select-super
+
+setup_root_helper
+
+rm -f dev1
+run_check truncate -s 260G dev1
+loop=$(run_check_stdout $SUDO_HELPER losetup --find --show dev1)
+
+# Create the test file system.
+run_check $SUDO_HELPER "$TOP"/mkfs.btrfs -f "$loop"
+
+function check_corruption {
+ local sb_offset=$1
+ local source_sb=$2
+
+
+ # First we ensure we can mount it successfully
+ run_check $SUDO_HELPER mount $loop "$TEST_MNT"
+ run_check $SUDO_HELPER umount "$TEST_MNT"
+
+ # Now corrupt 1k of the superblock at sb_offset
+ run_check $SUDO_HELPER dd bs=1K count=1 seek=$(($sb_offset + 1)) if=/dev/zero of="$loop"
+
+ #if corrupting one of the sb copies, copy it over the initial superblock
+ if [ ! -z $source_sb ]; then
+ local shift_val=$((16 << $source_sb * 12 ))
+ run_check $SUDO_HELPER dd bs=1K count=4 seek=64 skip=$shift_val if="$loop" of="$loop"
+ fi
+
+ run_mustfail "Mounted fs with corrupted superblock" \
+ $SUDO_HELPER mount $loop "$TEST_MNT"
+
+ # Now run btrfs rescue which should fix the superblock. It uses 2
+ # to signal success of recovery use mayfail to ignore that retval
+ # but still log the output of the command
+ run_mayfail $SUDO_HELPER "$TOP"/btrfs rescue super-recover -yv "$loop"
+ if [ $? != 2 ]; then
+ _fail "couldn't rescue super"
+ fi
+
+ run_check $SUDO_HELPER mount $loop "$TEST_MNT"
+ run_check $SUDO_HELPER umount "$TEST_MNT"
+}
+
+_log "Corrupting first superblock"
+check_corruption 64
+
+_log "Corrupting second superblock"
+check_corruption 65536 1
+
+_log "Corrupting third superblock"
+check_corruption 268435456 2
+
+# Cleanup
+run_check $SUDO_HELPER losetup -d "$loop"
+rm -f dev1