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"
# 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
# -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))"
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" &
--- /dev/null
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 Oracle, Inc. All Rights Reserved.
+#
+# FS QA Test No. 565
+#
+# 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
--- /dev/null
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2022 Oracle, Inc. All Rights Reserved.
+#
+# FS QA Test No. 566
+#
+# 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