summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2023-04-21 10:51:31 -0700
committerZorro Lang <zlang@kernel.org>2023-04-24 02:48:02 +0800
commitc7d81cdecbefd5768163a195e8d5257279216a34 (patch)
treeaad92e203c7c6f8d9be5db7f350c22ebee5c6851
parentc63ce4a5eac8a4e1f0785e7eae45b16a3ad16b87 (diff)
check: try to fix the test device if it gets corrupted
If the test device gets corrupted all subsequent tests will fail. To prevent this from causing all subsequent tests to be useless, try repair the file system on TEST_DEV if possible. We don't need to do this with the scratch device since that file system gets recreated each time anyway. Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Leah Rumancik <leah.rumancik@gmail.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Zorro Lang <zlang@kernel.org>
-rwxr-xr-xcheck7
-rw-r--r--common/rc41
-rw-r--r--common/xfs12
3 files changed, 59 insertions, 1 deletions
diff --git a/check b/check
index 1a58a2b2..befbf465 100755
--- a/check
+++ b/check
@@ -536,7 +536,12 @@ _check_filesystems()
local ret=0
if [ -f ${RESULT_DIR}/require_test ]; then
- _check_test_fs || ret=1
+ if ! _check_test_fs ; then
+ ret=1
+ echo "Trying to repair broken TEST_DEV file system"
+ _repair_test_fs
+ _test_mount
+ fi
rm -f ${RESULT_DIR}/require_test*
else
_test_unmount 2> /dev/null
diff --git a/common/rc b/common/rc
index e89b0a37..8a67952e 100644
--- a/common/rc
+++ b/common/rc
@@ -1199,6 +1199,47 @@ _repair_scratch_fs()
esac
}
+_repair_test_fs()
+{
+ case $FSTYP in
+ xfs)
+ _test_xfs_repair "$@" >$tmp.repair 2>&1
+ res=$?
+ if [ "$res" -ne 0 ]; then
+ echo "xfs_repair returns $res; replay log?" >>$tmp.repair
+ _test_mount
+ res=$?
+ if [ $res -gt 0 ]; then
+ echo "mount returns $res; zap log?" >>$tmp.repair
+ _xfs_repair_test_fs -L >>$tmp.repair 2>&1
+ echo "log zap returns $?" >> $tmp.repair
+ else
+ umount "$TEST_DEV"
+ fi
+ _xfs_repair_test_fs "$@" >>$tmp.repair 2>&1
+ res=$?
+ fi
+ ;;
+ *)
+ # Let's hope fsck -y suffices...
+ fsck -t $FSTYP -fy $TEST_DEV >$tmp.repair 2>&1
+ res=$?
+ if test "$res" -lt 4 ; then
+ res=0
+ fi
+ ;;
+ esac
+ if [ $res -ne 0 ]; then
+ _log_err "_repair_test_fs: failed, err=$res"
+ echo "*** fsck.$FSTYP output ***" >>$seqres.full
+ cat $tmp.repair >>$seqres.full
+ echo "*** end fsck.$FSTYP output" >>$seqres.full
+
+ fi
+ rm -f $tmp.repair
+ return $res
+}
+
_get_pids_by_name()
{
if [ $# -ne 1 ]
diff --git a/common/xfs b/common/xfs
index c558e940..137ac9db 100644
--- a/common/xfs
+++ b/common/xfs
@@ -988,6 +988,18 @@ _check_xfs_test_fs()
return $?
}
+# modeled after _scratch_xfs_repair
+_test_xfs_repair()
+{
+ TEST_OPTIONS=""
+ [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \
+ TEST_OPTIONS="-l$TEST_LOGDEV"
+ [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_RTDEV" ] && \
+ TEST_OPTIONS=$TEST_OPTIONS" -r$TEST_RTDEV"
+ [ "$LARGE_TEST_DEV" = yes ] && TEST_OPTIONS=$TEST_OPTIONS" -t"
+ $XFS_REPAIR_PROG $TEST_OPTIONS $* $TEST_DEV
+}
+
_require_xfs_test_rmapbt()
{
_require_test