@@ -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
@@ -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 ]
@@ -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