mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
65cc9a2359
The dm-log-writes replay mechanism issues discards to provide zeroing functionality to prevent out-of-order replay issues. These discards don't always result in zeroing bevavior, however, depending on the underlying physical device. In turn, this causes test failures on XFS v5 filesystems that enforce metadata log recovery ordering if the filesystem ends up with stale data from the future with respect to the active log at a particular recovery point. To ensure reliable discard zeroing behavior, use a thinly provisioned volume as the data device instead of using the scratch device directly. This slows the test down slightly, but provides reliable functional behavior at a reduced cost from active snapshot management or forced zeroing. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
102 lines
2.6 KiB
Bash
Executable File
102 lines
2.6 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2018 SUSE Linux Products GmbH. All Rights Reserved.
|
|
#
|
|
# FS QA Test 482
|
|
#
|
|
# Test filesystem consistency after each FUA operation
|
|
#
|
|
# Will do log replay and check the filesystem.
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
$KILLALL_PROG -KILL -q $FSSTRESS_PROG &> /dev/null
|
|
_log_writes_cleanup &> /dev/null
|
|
_dmthin_cleanup
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
. ./common/dmthin
|
|
. ./common/dmlogwrites
|
|
|
|
# remove previous $seqres.full before test
|
|
rm -f $seqres.full
|
|
|
|
# real QA test starts here
|
|
|
|
# Modify as appropriate.
|
|
_supported_fs generic
|
|
_supported_os Linux
|
|
|
|
_require_command "$KILLALL_PROG" killall
|
|
# Use thin device as replay device, which requires $SCRATCH_DEV
|
|
_require_scratch_nocheck
|
|
# and we need extra device as log device
|
|
_require_log_writes
|
|
_require_dm_target thin-pool
|
|
|
|
|
|
nr_cpus=$("$here/src/feature" -o)
|
|
# cap nr_cpus to 8 to avoid spending too much time on hosts with many cpus
|
|
if [ $nr_cpus -gt 8 ]; then
|
|
nr_cpus=8
|
|
fi
|
|
fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus \
|
|
$FSSTRESS_AVOID)
|
|
devsize=$((1024*1024*200 / 512)) # 200m phys/virt size
|
|
csize=$((1024*64 / 512)) # 64k cluster size
|
|
lowspace=$((1024*1024 / 512)) # 1m low space threshold
|
|
|
|
# Use a thin device to provide deterministic discard behavior. Discards are used
|
|
# by the log replay tool for fast zeroing to prevent out-of-order replay issues.
|
|
_test_unmount
|
|
_dmthin_init $devsize $devsize $csize $lowspace
|
|
_log_writes_init $DMTHIN_VOL_DEV
|
|
_log_writes_mkfs >> $seqres.full 2>&1
|
|
_log_writes_mark mkfs
|
|
|
|
_log_writes_mount
|
|
run_check $FSSTRESS_PROG $fsstress_args > /dev/null 2>&1
|
|
_log_writes_unmount
|
|
|
|
_log_writes_remove
|
|
prev=$(_log_writes_mark_to_entry_number mkfs)
|
|
[ -z "$prev" ] && _fail "failed to locate entry mark 'mkfs'"
|
|
cur=$(_log_writes_find_next_fua $prev)
|
|
[ -z "$cur" ] && _fail "failed to locate next FUA write"
|
|
|
|
while [ ! -z "$cur" ]; do
|
|
_log_writes_replay_log_range $cur $DMTHIN_VOL_DEV >> $seqres.full
|
|
|
|
# Here we need extra mount to replay the log, mainly for journal based
|
|
# fs, as their fsck will report dirty log as error.
|
|
# We don't care to preserve any data on the replay dev, as we can replay
|
|
# back to the point we need, and in fact sometimes creating/deleting
|
|
# snapshots repeatedly can be slower than replaying the log.
|
|
_dmthin_mount
|
|
_dmthin_check_fs
|
|
|
|
prev=$cur
|
|
cur=$(_log_writes_find_next_fua $(($cur + 1)))
|
|
[ -z "$cur" ] && break
|
|
done
|
|
|
|
echo "Silence is golden"
|
|
|
|
# success, all done
|
|
status=0
|
|
exit
|