summaryrefslogtreecommitdiff
path: root/tests/generic/457
blob: 03977eeaa43dd33acbb6cd285951d52f84c9caa8 (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
134
135
136
137
138
139
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2017 CTERA Networks. All Rights Reserved.
#
# FS QA Test No. 457
#
# Run fsx with log writes on cloned files to verify power fail safeness.
#
. ./common/preamble
_begin_fstest auto log replay clone recoveryloop

# Override the default cleanup function.
_cleanup()
{
	_log_writes_cleanup
	_dmthin_cleanup
}

# Import common functions.
. ./common/filter
. ./common/reflink
. ./common/dmthin
. ./common/dmlogwrites

# real QA test starts here
_supported_fs generic
_require_test
_require_scratch_reflink
_require_no_logdev
_require_cp_reflink
_require_log_writes
_require_dm_target thin-pool
# $SCRATCH_DEV won't be directly created filesystem on, so fsck isn't required
rm -f "${RESULT_DIR}/require_scratch"

_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

# write testfile index -1 to be cloned to testfile0
$XFS_IO_PROG -f -c "pwrite -S 0xff 0 256k" -c "fsync" \
	$SCRATCH_MNT/testfile-1 > /dev/null 2>&1

NUM_FILES=10
NUM_OPS=10
FSX_OPTS="-N $NUM_OPS -d -k -P $SANITY_DIR -i $LOGWRITES_DMDEV"
# Run fsx for a while
# Set random seeds for fsx runs (0 for timestamp + pid)
for j in `seq 0 $((NUM_FILES-1))`; do
	# clone the clone from prev iteration which may have already mutated
	_cp_reflink $SCRATCH_MNT/testfile$((j-1)) $SCRATCH_MNT/testfile$j
	run_check $here/ltp/fsx $FSX_OPTS $FSX_AVOID -S 0 -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