]> www.infradead.org Git - users/hch/xfstests-dev.git/commitdiff
btrfs: add support for capturing metadumps of corrupted fses
authorAnthony Iliopoulos <ailiop@suse.com>
Wed, 16 Feb 2022 19:03:34 +0000 (20:03 +0100)
committerEryu Guan <guaneryu@gmail.com>
Sun, 20 Feb 2022 17:18:47 +0000 (01:18 +0800)
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>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
README
common/btrfs
common/config
common/rc

diff --git a/README b/README
index e9284b229eca3eb5e9bcebccfbf1f7ebe743548e..9f01aa10d61aae5975446ec52fd1952d3ea5de60 100644 (file)
--- 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
index 2fdefb18b27843811c883abf18cc74e3c92183dc..670d9d1f2b093d719f5594a645ecea7af234257c 100644 (file)
@@ -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
+}
index a9b393f7f0c7e655e7033602bda35577a0788e59..479e50d1ad56a759ebf75283d569894453f1f76f 100644 (file)
@@ -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.
index de60fb7b0677126c39e9abefdfcf173e93d4e566..e2d3d72a00f6535ee4a5cb9ba2978e6db6b55e2b 100644 (file)
--- 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
                ;;