summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Iliopoulos <ailiop@suse.com>2022-02-16 20:03:34 +0100
committerEryu Guan <guaneryu@gmail.com>2022-02-21 01:18:47 +0800
commit2ea74ba4e70b546279896e2a733c8c7f4b206193 (patch)
treedb54facf340012ee4a8561396d766dd4ce477ecd
parent41e691e469f7db212f2fc8b800706e16117ae761 (diff)
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 <ailiop@suse.com> Reviewed-by: Eryu Guan <guaneryu@gmail.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
-rw-r--r--README4
-rw-r--r--common/btrfs15
-rw-r--r--common/config1
-rw-r--r--common/rc3
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
;;