local seq_prefix="${REPORT_DIR}/${1}"
local cp_suffix="$2"
- for i in ".full" ".dmesg" ".out.bad" ".notrun" ".core" ".hints"; do
+ for i in ".full" ".dmesg" ".out.bad" ".notrun" ".core" ".hints" ".mountfail"; do
rm -f "${seq_prefix}${i}${cp_suffix}"
if [ -f "${seq_prefix}${i}" ]; then
cp "${seq_prefix}${i}" "${seq_prefix}${i}${cp_suffix}"
echo -n " $seqnum -- "
cat $seqres.notrun
tc_status="notrun"
+ rm -f "$seqres.mountfail?"
_stash_test_status "$seqnum" "$tc_status"
# Unmount the scratch fs so that we can wipe the scratch
if [ ! -f $seq.out ]; then
_dump_err "no qualified output"
tc_status="fail"
+ rm -f "$seqres.mountfail?"
_stash_test_status "$seqnum" "$tc_status"
continue;
fi
rm -f $seqres.hints
fi
fi
+
+ if [ -f "$seqres.mountfail?" ]; then
+ if [ "$tc_status" = "fail" ]; then
+ # Let the user know if there were mount
+ # failures on a test that failed because that
+ # could be interesting.
+ mv "$seqres.mountfail?" "$seqres.mountfail"
+ _dump_err "check: possible mount failures (see $seqres.mountfail)"
+ else
+ # Don't retain mount failure logs for tests
+ # that pass or were skipped because some tests
+ # intentionally drive mount failures.
+ rm -f "$seqres.mountfail?"
+ fi
+ fi
+
_stash_test_status "$seqnum" "$tc_status"
done
awk '/Hugepagesize/ {print $2 * 1024}' /proc/meminfo
}
+# Does dmesg have a --since flag?
+_has_dmesg_since_option()
+{
+ grep -q -- --since <(dmesg --help)
+}
+
_mount()
{
- $MOUNT_PROG $*
+ $MOUNT_PROG $*
+ ret=$?
+ if [ "$ret" -ne 0 ]; then
+ echo "\"$MOUNT_PROG $*\" failed at $(date)" >> "$seqres.mountfail?"
+ if _has_dmesg_since_option; then
+ dmesg --since '30s ago' >> "$seqres.mountfail?"
+ else
+ dmesg | tail -n 100 >> "$seqres.mountfail?"
+ fi
+ fi
+
+ return $ret
}
# Call _mount to do mount operation but also save mountpoint to
local out_src="${SRC_DIR}/${test_name}.out"
local full_file="${REPORT_DIR}/${test_name}.full"
local dmesg_file="${REPORT_DIR}/${test_name}.dmesg"
+ local mountfail_file="${REPORT_DIR}/${test_name}.mountfail"
local outbad_file="${REPORT_DIR}/${test_name}.out.bad"
if [ -z "$_err_msg" ]; then
_err_msg="Test $test_name failed, reason unknown"
printf ']]>\n' >>$report
echo -e "\t\t</system-err>" >> $report
fi
+ if [ -z "$quiet" -a -f "$mountfail_file" ]; then
+ echo -e "\t\t<mount-failure>" >> $report
+ printf '<![CDATA[\n' >>$report
+ cat "$mountfail_file" | tr -dc '[:print:][:space:]' | encode_cdata >>$report
+ printf ']]>\n' >>$report
+ echo -e "\t\t</mount-failure>" >> $report
+ fi
;;
*)
echo -e "\t\t<failure message=\"Unknown test_status=$test_status\" type=\"TestFail\"/>" >> $report
</xs:complexType>
</xs:element>
</xs:choice>
- <xs:choice minOccurs="0" maxOccurs="3">
+ <xs:choice minOccurs="0" maxOccurs="4">
<xs:element name="system-out" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation xml:lang="en">Data that was written to the .full log file while the test was executed.</xs:documentation>
</xs:restriction>
</xs:simpleType>
</xs:element>
+ <xs:element name="mount-failure" minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation xml:lang="en">Kernel log recorded when mount failed.</xs:documentation>
+ </xs:annotation>
+ <xs:simpleType>
+ <xs:restriction base="pre-string">
+ <xs:whiteSpace value="preserve"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
</xs:choice>
</xs:sequence>
<xs:attribute name="name" type="xs:token" use="required">
--- /dev/null
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2024-2026 Oracle. All Rights Reserved.
+#
+# FS QA Test 008
+#
+# Test mount failure capture. Test runners will have to look for the
+# 008.mountfail file in the results directory since ./check handles the
+# preservation.
+#
+. ./common/preamble
+_begin_fstest selftest
+
+_require_command "$WIPEFS_PROG" wipefs
+_require_scratch
+
+$WIPEFS_PROG -a $SCRATCH_DEV
+_scratch_mount &>> $seqres.full
+
+# success, all done
+status=0
+exit
--- /dev/null
+QA output created by 008