summaryrefslogtreecommitdiff
path: root/tests/generic/402
blob: f742feddc85f13af8d620f32b67e28565518af10 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2016 Deepa Dinamani.  All Rights Reserved.
#
# FS QA Test 402
#
# Tests to verify policy for filesystem timestamps for
# supported ranges:
# 1. Verify filesystem rw mount according to sysctl
# timestamp_supported.
# 2. Verify timestamp clamping for timestamps beyond max
# timestamp supported.
#
# Exit status 1: either or both tests above fail.
# Exit status 0: both the above tests pass.
#
seq=`basename $0`
seqres=$RESULT_DIR/$seq
echo "QA output created by $seq"

here=`pwd`
tmp=/tmp/$$
status=1	# failure is the default!
trap "exit \$status" 0 1 2 3 15

# Get standard environment, filters and checks.
. ./common/rc
. ./common/filter
. ./common/attr

# remove previous $seqres.full before test
rm -f $seqres.full

# Prerequisites for the test run.
_supported_fs generic
_supported_os Linux
_require_scratch
_require_xfs_io_command utimes

# Compare file timestamps obtained from stat
# with a given timestamp.
check_stat()
{
	file=$1
	timestamp=$2

	stat_timestamp=`stat -c"%X;%Y" $file`

	prev_timestamp="$timestamp;$timestamp"
	if [ $prev_timestamp != $stat_timestamp ]; then
		echo "$prev_timestamp != $stat_timestamp" | tee -a $seqres.full
	fi
}

run_test_individual()
{
	file=$1
	timestamp=$2
	update_time=$3

	# check if the time needs update
	if [ $update_time -eq 1 ]; then
		echo "Updating file: $file to timestamp `date -d @$timestamp`"  >> $seqres.full
		$XFS_IO_PROG -f -c "utimes $timestamp 0 $timestamp 0" $file
		if [ $? -ne 0 ]; then
			echo "Failed to update times on $file" | tee -a $seqres.full
		fi
	fi

	tsclamp=$(($timestamp>$tsmax?$tsmax:$timestamp))
	echo "Checking file: $file Updated timestamp is `date -d @$tsclamp`"  >> $seqres.full
	check_stat $file $tsclamp
}

run_test()
{
	update_time=$1

	n=1

	for TIME in "${TIMESTAMPS[@]}"; do
		run_test_individual ${SCRATCH_MNT}/test_$n $TIME $update_time
		((n++))
	done
}

_scratch_mkfs &>> $seqres.full 2>&1 || _fail "mkfs failed"
_require_y2038 $SCRATCH_DEV

read tsmin tsmax <<<$(_filesystem_timestamp_range $SCRATCH_DEV)
echo min supported timestamp $tsmin $(date --date=@$tsmin) >> $seqres.full
echo max supported timestamp $tsmax $(date --date=@$tsmax) >> $seqres.full

# Test timestamps array

declare -a TIMESTAMPS=(
	$tsmin
	0
	$tsmax
	$((tsmax+1))
	4294967295
	8589934591
	34359738367
)

# Max timestamp is hardcoded to Mon Jan 18 19:14:07 PST 2038
sys_tsmax=2147483647
echo "max timestamp that needs to be supported by fs for rw mount is" \
	"$((sys_tsmax+1)) $(date --date=@$((sys_tsmax+1)))" >> $seqres.full

read ts_check <<<$(cat /proc/sys/fs/fs-timestamp-check-on)

_scratch_mount
result=$?

if [ $ts_check -ne 0 ]; then
	echo "sysctl filesystem timestamp check is on" >> $seqres.full
	# check for mount failure if the minimum requirement for max timestamp
	# supported is not met.
	if [ $sys_tsmax -ge $tsmax ]; then
		if [ $result -eq 0 ]; then
			echo "mount test failed"  | tee -a $seqres.full
			exit
		fi
	else
		if [ $result -ne 0 ]; then
			echo "failed to mount $SCRATCH_DEV"  | tee -a $seqres.full
			exit
		fi
	fi
else
	# if sysctl switch is off then mount should succeed always.
	echo "sysctl filesystem timestamp check is off" >> $seqres.full
	if [ $result -ne 0 ]; then
		echo "failed to mount $SCRATCH_DEV and timestamp check is off"  >> $seqres.full
		exit
	fi
fi

# Begin test case 1
echo "In memory timestamps update test start" >> $seqres.full

# update time on the file
update_time=1

run_test $update_time

echo "In memory timestamps update complete" >> $seqres.full

echo "Unmounting and mounting scratch $SCRATCH_MNT" >> $seqres.full

# unmount and remount $SCRATCH_DEV
_scratch_cycle_mount

# Begin test case 2

n=1

# Do not update time on the file this time, just read from disk
update_time=0

echo "On disk timestamps update test start" >> $seqres.full

# Re-run test
run_test $update_time

echo "On disk timestamps update test complete" >> $seqres.full

echo "y2038 inode timestamp tests completed successfully"

# success, all done
status=0
exit