blob: a9020c638e7962441553c06a9a3cc20686c9dc98 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2015 Facebook. All Rights Reserved.
#
# FS QA Test No. 455
#
# Run fsx with log writes to verify power fail safeness.
#
. ./common/preamble
_begin_fstest auto log replay recoveryloop
# Override the default cleanup function.
_cleanup()
{
_log_writes_cleanup
_dmthin_cleanup
}
# Import common functions.
. ./common/filter
. ./common/dmthin
. ./common/dmlogwrites
# real QA test starts here
_supported_fs generic
_require_test
_require_scratch_nocheck
_require_no_logdev
_require_log_writes
_require_dm_target thin-pool
_reset_dmthin()
{
# With bcachefs, we need to wipe and start fresh every time we replay to a
# different point in time - if we see metadata from a future point in time,
# or an unrelated mount, bcachefs will get confused:
if [ "$FSTYP" = "bcachefs" ]; then
_dmthin_cleanup
_dmthin_init $devsize $devsize $csize $lowspace
fi
}
check_files()
{
local name=$1
# Now look for our files
for i in $(find $SANITY_DIR -type f | grep $name | grep mark); do
local filename=$(basename $i)
local mark="${filename##*.}"
echo "checking $filename" >> $seqres.full
_reset_dmthin
_log_writes_replay_log $filename $DMTHIN_VOL_DEV
_dmthin_mount
local expected_md5=$(_md5_checksum $i)
local md5=$(_md5_checksum $SCRATCH_MNT/$name)
[ "${md5}" != "${expected_md5}" ] && _fail "$filename md5sum mismatched"
_dmthin_check_fs
done
}
SANITY_DIR=$TEST_DIR/fsxtests
rm -rf $SANITY_DIR
mkdir $SANITY_DIR
size=$(_small_fs_size_mb 200) # 200m phys/virt size
devsize=$((1024*1024*size / 512))
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.
_dmthin_init $devsize $devsize $csize $lowspace
# Create the log
_log_writes_init $DMTHIN_VOL_DEV
_log_writes_mkfs >> $seqres.full 2>&1
# Log writes emulates discard support, turn it on for maximum crying.
_log_writes_mount -o discard
NUM_FILES=4
NUM_OPS=200
FSX_OPTS="-N $NUM_OPS -d -P $SANITY_DIR -i $LOGWRITES_DMDEV"
# Set random seeds for fsx runs (0 for timestamp + pid)
# When test failure is detected, check the seed values printed
# by fsx processes to $seqres.full and set them in this array
# to repeat the same fsx runs
seeds=(0 0 0 0)
# Run fsx for a while
for j in `seq 0 $((NUM_FILES-1))`; do
run_check $here/ltp/fsx $FSX_OPTS $FSX_AVOID -S ${seeds[$j]} -j $j $SCRATCH_MNT/testfile$j &
done
wait
test_md5=()
for j in `seq 0 $((NUM_FILES-1))`; do
test_md5[$j]=$(_md5_checksum $SCRATCH_MNT/testfile$j)
done
# Unmount the scratch dir and tear down the log writes target
_log_writes_mark last
_log_writes_unmount
_log_writes_mark end
_log_writes_remove
_dmthin_check_fs
# check pre umount
echo "checking pre umount" >> $seqres.full
_reset_dmthin
_log_writes_replay_log last $DMTHIN_VOL_DEV
_dmthin_mount
_dmthin_check_fs
for j in `seq 0 $((NUM_FILES-1))`; do
check_files testfile$j
done
# Check the end
echo "checking post umount" >> $seqres.full
_reset_dmthin
_log_writes_replay_log end $DMTHIN_VOL_DEV
_dmthin_mount
for j in `seq 0 $((NUM_FILES-1))`; do
md5=$(_md5_checksum $SCRATCH_MNT/testfile$j)
[ "${md5}" != "${test_md5[$j]}" ] && _fail "testfile$j end md5sum mismatched"
done
_dmthin_check_fs
echo "Silence is golden"
status=0
exit
|