From 2ea74ba4e70b546279896e2a733c8c7f4b206193 Mon Sep 17 00:00:00 2001 From: Anthony Iliopoulos Date: Wed, 16 Feb 2022 20:03:34 +0100 Subject: [PATCH] btrfs: add support for capturing metadumps of corrupted fses 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 Reviewed-by: Eryu Guan Signed-off-by: Eryu Guan --- README | 4 ++-- common/btrfs | 15 +++++++++++++++ common/config | 1 + common/rc | 3 +++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/README b/README index e9284b22..9f01aa10 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 2fdefb18..670d9d1f 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 a9b393f7..479e50d1 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 de60fb7b..e2d3d72a 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 ;; -- 2.39.5