@@ -417,6 +417,30 @@ __stress_scrub_clean_scratch() {
return 0
}
+# Run fsx while we're testing online fsck.
+__stress_scrub_fsx_loop() {
+ local end="$1"
+ local runningfile="$2"
+ local focus=(-q -X) # quiet, validate file contents
+
+ # As of November 2022, 2 million fsx ops should be enough to keep
+ # any filesystem busy for a couple of hours.
+ focus+=(-N 2000000)
+ focus+=(-o $((128000 * LOAD_FACTOR)) )
+ focus+=(-l $((600000 * LOAD_FACTOR)) )
+
+ local args="$FSX_AVOID ${focus[@]} ${SCRATCH_MNT}/fsx.$seq"
+ echo "Running $here/ltp/fsx $args" >> $seqres.full
+
+ while __stress_scrub_running "$end" "$runningfile"; do
+ # Need to recheck running conditions if we cleared anything
+ __stress_scrub_clean_scratch && continue
+ $here/ltp/fsx $args >> $seqres.full
+ echo "fsx exits with $? at $(date)" >> $seqres.full
+ done
+ rm -f "$runningfile"
+}
+
# Run fsstress while we're testing online fsck.
__stress_scrub_fsstress_loop() {
local end="$1"
@@ -463,7 +487,7 @@ _scratch_xfs_stress_scrub_cleanup() {
# Send SIGINT so that bash won't print a 'Terminated' message that
# distorts the golden output.
echo "Killing stressor processes at $(date)" >> $seqres.full
- $KILLALL_PROG -INT xfs_io fsstress >> $seqres.full 2>&1
+ $KILLALL_PROG -INT xfs_io fsstress fsx >> $seqres.full 2>&1
# Tests are not allowed to exit with the scratch fs frozen. If we
# started a fs freeze/thaw background loop, wait for that loop to exit
@@ -531,30 +555,39 @@ __stress_scrub_check_commands() {
# -w Delay the start of the scrub/repair loop by this number of seconds.
# Defaults to no delay unless XFS_SCRUB_STRESS_DELAY is set. This value
# will be clamped to ten seconds before the end time.
+# -X Run this program to exercise the filesystem. Currently supported
+# options are 'fsx' and 'fsstress'. The default is 'fsstress'.
_scratch_xfs_stress_scrub() {
local one_scrub_args=()
local scrub_tgt="$SCRATCH_MNT"
local runningfile="$tmp.fsstress"
local freeze="${XFS_SCRUB_STRESS_FREEZE}"
local scrub_delay="${XFS_SCRUB_STRESS_DELAY:--1}"
+ local exerciser="fsstress"
__SCRUB_STRESS_FREEZE_PID=""
rm -f "$runningfile"
touch "$runningfile"
OPTIND=1
- while getopts "fs:t:w:" c; do
+ while getopts "fs:t:w:X:" c; do
case "$c" in
f) freeze=yes;;
s) one_scrub_args+=("$OPTARG");;
t) scrub_tgt="$OPTARG";;
w) scrub_delay="$OPTARG";;
+ X) exerciser="$OPTARG";;
*) return 1; ;;
esac
done
__stress_scrub_check_commands "$scrub_tgt" "${one_scrub_args[@]}"
+ if ! command -v "__stress_scrub_${exerciser}_loop" &>/dev/null; then
+ echo "${exerciser}: Unknown fs exercise program."
+ return 1
+ fi
+
local start="$(date +%s)"
local end="$((start + (30 * TIME_FACTOR) ))"
local scrub_startat="$((start + scrub_delay))"
@@ -564,7 +597,7 @@ _scratch_xfs_stress_scrub() {
echo "Loop started at $(date --date="@${start}")," \
"ending at $(date --date="@${end}")" >> $seqres.full
- __stress_scrub_fsstress_loop "$end" "$runningfile" &
+ "__stress_scrub_${exerciser}_loop" "$end" "$runningfile" &
if [ -n "$freeze" ]; then
__stress_scrub_freeze_loop "$end" "$runningfile" &
@@ -35,6 +35,7 @@ dangerous_fuzzers fuzzers that can crash your computer
dangerous_norepair fuzzers to evaluate kernel metadata verifiers
dangerous_online_repair fuzzers to evaluate xfs_scrub online repair
dangerous_fsstress_repair race fsstress and xfs_scrub online repair
+dangerous_fsstress_scrub race fsstress and xfs_scrub checking
dangerous_repair fuzzers to evaluate xfs_repair offline repair
dangerous_scrub fuzzers to evaluate xfs_scrub checking
data data loss checkers
new file mode 100755
@@ -0,0 +1,38 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 Oracle, Inc. All Rights Reserved.
+#
+# FS QA Test No. 847
+#
+# Race fsx and xfs_scrub in read-only mode for a while to see if we crash
+# or livelock.
+#
+. ./common/preamble
+_begin_fstest scrub dangerous_fsstress_scrub
+
+_cleanup() {
+ cd /
+ _scratch_xfs_stress_scrub_cleanup &> /dev/null
+ rm -r -f $tmp.*
+}
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/fuzzy
+. ./common/inject
+. ./common/xfs
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch
+_require_xfs_stress_scrub
+
+_scratch_mkfs > "$seqres.full" 2>&1
+_scratch_mount
+_scratch_xfs_stress_scrub -S '-n' -X 'fsx'
+
+# success, all done
+echo Silence is golden
+status=0
+exit
new file mode 100644
@@ -0,0 +1,2 @@
+QA output created by 847
+Silence is golden
new file mode 100755
@@ -0,0 +1,38 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 Oracle, Inc. All Rights Reserved.
+#
+# FS QA Test No. 848
+#
+# Race fsx and xfs_scrub in force-repair mode for a while to see if we
+# crash or livelock.
+#
+. ./common/preamble
+_begin_fstest online_repair dangerous_fsstress_repair
+
+_cleanup() {
+ cd /
+ _scratch_xfs_stress_scrub_cleanup &> /dev/null
+ rm -r -f $tmp.*
+}
+_register_cleanup "_cleanup" BUS
+
+# Import common functions.
+. ./common/filter
+. ./common/fuzzy
+. ./common/inject
+. ./common/xfs
+
+# real QA test starts here
+_supported_fs xfs
+_require_scratch
+_require_xfs_stress_online_repair
+
+_scratch_mkfs > "$seqres.full" 2>&1
+_scratch_mount
+_scratch_xfs_stress_online_repair -S '-k' -X 'fsx'
+
+# success, all done
+echo Silence is golden
+status=0
+exit
new file mode 100644
@@ -0,0 +1,2 @@
+QA output created by 848
+Silence is golden