diff mbox series

btrfs: add support for capturing metadumps of corrupted fses

Message ID 20220216190334.25213-1-ailiop@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: add support for capturing metadumps of corrupted fses | expand

Commit Message

Anthony Iliopoulos Feb. 16, 2022, 7:03 p.m. UTC
Add the capability to capture btrfs metadumps when filesystem checks
fail, so that they can be used for further debugging. This is useful for
tests that _require_test and/or _require_scratch for which filesystem
checkers will run after a test completes and may occasionally pick up
inconsistencies.

Signed-off-by: Anthony Iliopoulos <ailiop@suse.com>
---
 README        |  4 ++--
 common/btrfs  | 15 +++++++++++++++
 common/config |  1 +
 common/rc     |  3 +++
 4 files changed, 21 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/README b/README
index e9284b229eca..9f01aa10d61a 100644
--- a/README
+++ b/README
@@ -110,8 +110,8 @@  Preparing system for tests:
              - Set TEST_FS_MODULE_RELOAD=1 to unload the module and reload
                it between test invocations.  This assumes that the name of
                the module is the same as FSTYP.
-             - Set DUMP_CORRUPT_FS=1 to record metadata dumps of XFS or ext*
-               filesystems if a filesystem check fails.
+             - Set DUMP_CORRUPT_FS=1 to record metadata dumps of XFS, ext* or
+               btrfs filesystems if a filesystem check fails.
              - Set DUMP_COMPRESSOR to a compression program to compress
                metadumps of filesystems.  This program must accept '-f' and the
                name of a file to compress; and it must accept '-d -f -k' and
diff --git a/common/btrfs b/common/btrfs
index 5de926dd9bfa..32d02bf2b3ce 100644
--- a/common/btrfs
+++ b/common/btrfs
@@ -155,6 +155,11 @@  _check_btrfs_filesystem()
 	fi
 	rm -f $tmp.fsck
 
+	if [ $ok -eq 0 ] && [ "$DUMP_CORRUPT_FS" = "1" ]; then
+		local flatdev="$(basename "$device")"
+		_btrfs_metadump "$device" "$seqres.$flatdev.check.md" >>$seqres.full
+	fi
+
 	if [ $ok -eq 0 ]; then
 		echo "*** mount output ***"		>>$seqres.full
 		_mount					>>$seqres.full
@@ -496,3 +501,13 @@  _require_btrfs_support_sectorsize()
 	grep -wq $sectorsize /sys/fs/btrfs/features/supported_sectorsizes || \
 		_notrun "sectorsize $sectorsize is not supported"
 }
+
+_btrfs_metadump()
+{
+	local device="$1"
+	local dumpfile="$2"
+
+	test -n "$BTRFS_IMAGE_PROG" || _fail "btrfs-image not installed"
+	$BTRFS_IMAGE_PROG "$device" "$dumpfile"
+	[ -n "$DUMP_COMPRESSOR" ] && $DUMP_COMPRESSOR -f "$dumpfile" &> /dev/null
+}
diff --git a/common/config b/common/config
index 0566ab4a963e..121ba000279f 100644
--- a/common/config
+++ b/common/config
@@ -227,6 +227,7 @@  export ACCTON_PROG="$(type -P accton)"
 export E2IMAGE_PROG="$(type -P e2image)"
 export BLKZONE_PROG="$(type -P blkzone)"
 export GZIP_PROG="$(type -P gzip)"
+export BTRFS_IMAGE_PROG="$(type -P btrfs-image)"
 
 # use 'udevadm settle' or 'udevsettle' to wait for lv to be settled.
 # newer systems have udevadm command but older systems like RHEL5 don't.
diff --git a/common/rc b/common/rc
index de60fb7b0677..e2d3d72a00f6 100644
--- a/common/rc
+++ b/common/rc
@@ -642,6 +642,9 @@  _metadump_dev() {
 	test "$DUMP_CORRUPT_FS" = 1 || return 0
 
 	case "$FSTYP" in
+	btrfs)
+		_btrfs_metadump $device $dumpfile
+		;;
 	ext*)
 		_ext4_metadump $device $dumpfile $compressopt
 		;;