mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
afeb3b711c
So it turns out that overlayfs can't pass FS_IOC_SHUTDOWN to the lower
filesystems and so xfstests works around this by creating shutdown
helpers for the scratch fs to direct the shutdown ioctl to wherever it
needs to go to shut down the filesystem -- SCRATCH_MNT on normal
filesystems and OVL_BASE_SCRATCH_MNT when -overlay is enabled. This
means that t_open_tmpfiles cannot simply use one of the open tempfiles
to shut down the filesystem.
Commit f8f5774722 tried to "fix" this by ripping the shutdown code out,
but this made the tests useless. Fix this instead by creating a
xfstests helper to return a path that can be used to shut down the
filesystem and then pass that path to t_open_tmpfiles so that we can
shut down the filesystem when overlayfs is enabled.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
92 lines
2.4 KiB
Bash
Executable File
92 lines
2.4 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright (c) 2019 Oracle, Inc. All Rights Reserved.
|
|
#
|
|
# FS QA Test No. 501
|
|
#
|
|
# Stress test creating a lot of unlinked O_TMPFILE files and recovering them
|
|
# after a crash, checking that we don't blow up the filesystem. This is sort
|
|
# of a performance test for the xfs unlinked inode backref patchset.
|
|
#
|
|
# Here we force the use of the slow iunlink bucket walk code in a single
|
|
# threaded situation.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
testfile=$TEST_DIR/$seq.txt
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
delay_knob="/sys/fs/xfs/debug/log_recovery_delay"
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
test -e "$delay_knob" && echo 0 > "$delay_knob"
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/inject
|
|
|
|
# real QA test starts here
|
|
_supported_fs xfs
|
|
_supported_os Linux
|
|
_require_xfs_io_error_injection "iunlink_fallback"
|
|
_require_xfs_sysfs debug/log_recovery_delay
|
|
_require_scratch
|
|
_require_test_program "t_open_tmpfiles"
|
|
|
|
rm -f $seqres.full
|
|
_scratch_mkfs >> $seqres.full 2>&1
|
|
_scratch_mount
|
|
|
|
# Set ULIMIT_NOFILE to min(file-max / 2, 30000 files per LOAD_FACTOR)
|
|
# so that this test doesn't take forever or OOM the box
|
|
max_files=$((30000 * LOAD_FACTOR))
|
|
max_allowable_files=$(( $(cat /proc/sys/fs/file-max) / 2 ))
|
|
test $max_allowable_files -gt 0 && test $max_files -gt $max_allowable_files && \
|
|
max_files=$max_allowable_files
|
|
ulimit -n $max_files
|
|
|
|
# Open a lot of unlinked files
|
|
echo create >> $seqres.full
|
|
$here/src/t_open_tmpfiles $SCRATCH_MNT $(_scratch_shutdown_handle) >> $seqres.full
|
|
|
|
# Unmount to prove that we can clean it all
|
|
echo umount >> $seqres.full
|
|
before=$(date +%s)
|
|
_scratch_unmount
|
|
after=$(date +%s)
|
|
echo "Unmount took $((after - before))s." >> $seqres.full
|
|
|
|
# Force xfs to use the iunlinked fallback 50% of the time
|
|
injector() {
|
|
# Slow down log recovery by 5s to give us enough time to set up
|
|
# error injection.
|
|
echo 5 > "$delay_knob"
|
|
|
|
# Try for 10s to set our knob.
|
|
knob="$(_find_xfs_mountdev_errortag_knob "${SCRATCH_DEV}" iunlink_fallback)"
|
|
nr=0
|
|
while [ ! -e "$knob" ] && [ "$nr" -lt 20 ]; do
|
|
sleep 0.5
|
|
nr=$((nr+1))
|
|
done
|
|
if [ -e "$knob" ]; then
|
|
echo 2 > "$knob"
|
|
else
|
|
echo "unable to set iunlink_fallback?"
|
|
fi
|
|
}
|
|
|
|
# Mount so that we can run the usual checks
|
|
echo silence is golden
|
|
injector &
|
|
_scratch_mount
|
|
status=0
|
|
exit
|