[3/2] generic: check storing and re-reading timestamps
diff mbox series

Message ID 20191024003356.GE6706@magnolia
State New
Headers show
Series
  • fstests: random fixes
Related show

Commit Message

Darrick J. Wong Oct. 24, 2019, 12:33 a.m. UTC
From: Darrick J. Wong <darrick.wong@oracle.com>

Add a test to make sure that we can store and retrieve timestamps
without corrupting them.  Note that this is likely to fail on older
kernels that do not clamp timestamps properly, though at least in my
book that counts as corruption.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 tests/generic/721     |  102 +++++++++++++++++++++++++++++++++++++++++++++++++
 tests/generic/721.out |    1 
 tests/generic/group   |    1 
 3 files changed, 104 insertions(+)
 create mode 100755 tests/generic/721
 create mode 100644 tests/generic/721.out

Patch
diff mbox series

diff --git a/tests/generic/721 b/tests/generic/721
new file mode 100755
index 00000000..711d3c5f
--- /dev/null
+++ b/tests/generic/721
@@ -0,0 +1,102 @@ 
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2019, Oracle and/or its affiliates.  All Rights Reserved.
+#
+# FS QA Test No. 721
+#
+# Make sure we can store and retrieve timestamps on the extremes of the
+# supported date ranges.
+
+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 /
+	rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+
+# real QA test starts here
+_supported_os Linux
+_supported_fs generic
+_require_scratch
+
+rm -f $seqres.full
+
+_scratch_mkfs > $seqres.full
+_scratch_mount
+
+# Does our userspace even support large dates?
+test_bigdates=1
+touch -d 'May 30 01:53:03 UTC 2514' $SCRATCH_MNT 2>/dev/null || test_bigdates=0
+
+# And can we do statx?
+test_statx=1
+($XFS_IO_PROG -c 'help statx' | grep -q 'Print raw statx' && \
+ $XFS_IO_PROG -c 'statx -r' $SCRATCH_MNT 2>/dev/null | grep -q 'stat.mtime') || \
+	test_statx=0
+
+echo "Userspace support of large timestamps: $test_bigdates" >> $seqres.full
+echo "xfs_io support of statx: $test_statx" >> $seqres.full
+
+touchme() {
+	local arg="$1"
+	local name="$2"
+
+	touch -d "$arg" $SCRATCH_MNT/t_$name
+}
+
+report() {
+	local files=($SCRATCH_MNT $SCRATCH_MNT/t_*)
+	TZ=UTC stat -c '%y %Y %n' "${files[@]}"
+	test $test_statx -gt 0 && \
+		$XFS_IO_PROG -c 'statx -r' "${files[@]}" | grep 'stat.mtime'
+}
+
+# -2147483648 (S32_MIN, or classic unix min)
+touchme 'Dec 13 20:45:52 UTC 1901' s32_min
+
+# 2147483647 (S32_MAX, or classic unix max)
+touchme 'Jan 19 03:14:07 UTC 2038' s32_max
+
+if [ $test_bigdates -gt 0 ]; then
+	# 15032385535 (u34 time if you start from s32_min, like ext4 does)
+	touchme 'May 10 22:38:55 UTC 2446' u34_from_s32_min
+
+	# 17179869183 (u34 time if you start from the unix epoch)
+	touchme 'May 30 01:53:03 UTC 2514' u34_max
+
+	# Latest date we can synthesize(?)
+	touchme 'Dec 31 23:59:59 UTC 2147483647' abs_max_time
+
+	# Earliest date we can synthesize(?)
+	touchme 'Jan 1 00:00:00 UTC 0' abs_min_time
+fi
+
+# Query timestamps from incore
+echo before >> $seqres.full
+report > $tmp.times0
+cat $tmp.times0 >> $seqres.full
+
+_scratch_cycle_mount
+
+# Query timestamps from disk
+echo after >> $seqres.full
+report > $tmp.times1
+cat $tmp.times1 >> $seqres.full
+
+# Did they match?
+cmp -s $tmp.times0 $tmp.times1
+
+# success, all done
+status=0
+exit
diff --git a/tests/generic/721.out b/tests/generic/721.out
new file mode 100644
index 00000000..087decb5
--- /dev/null
+++ b/tests/generic/721.out
@@ -0,0 +1 @@ 
+QA output created by 721
diff --git a/tests/generic/group b/tests/generic/group
index 6f9c4e12..a49d4b11 100644
--- a/tests/generic/group
+++ b/tests/generic/group
@@ -581,3 +581,4 @@ 
 576 auto quick verity encrypt
 577 auto quick verity
 578 auto quick rw clone
+721 auto quick atime