]> git.proxmox.com Git - mirror_zfs.git/commitdiff
ZTS: Add tests for creation time
authorRyan Moeller <ryan@iXsystems.com>
Mon, 26 Jul 2021 20:08:52 +0000 (16:08 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 17 Aug 2021 17:25:58 +0000 (10:25 -0700)
Reviewed-by: Tony Nguyen <tony.nguyen@delphix.com>
Reviewed-by: Allan Jude <allan@klarasystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Ryan Moeller <ryan@iXsystems.com>
Closes #12432

configure.ac
tests/runfiles/common.run
tests/test-runner/bin/zts-report.py.in
tests/zfs-tests/include/libtest.shlib
tests/zfs-tests/tests/functional/Makefile.am
tests/zfs-tests/tests/functional/cli_root/zfs_diff/zfs_diff_timestamp.ksh
tests/zfs-tests/tests/functional/crtime/Makefile.am [new file with mode: 0644]
tests/zfs-tests/tests/functional/crtime/cleanup.ksh [new file with mode: 0755]
tests/zfs-tests/tests/functional/crtime/crtime_001_pos.ksh [new file with mode: 0755]
tests/zfs-tests/tests/functional/crtime/setup.ksh [new file with mode: 0755]

index 27409c82f396ad80d4b38037bafa05a5065b13f1..6f34b210d2b7edd204a80cdf698cd0f33b1a7ac7 100644 (file)
@@ -327,6 +327,7 @@ AC_CONFIG_FILES([
        tests/zfs-tests/tests/functional/cli_user/zpool_status/Makefile
        tests/zfs-tests/tests/functional/compression/Makefile
        tests/zfs-tests/tests/functional/cp_files/Makefile
+       tests/zfs-tests/tests/functional/crtime/Makefile
        tests/zfs-tests/tests/functional/ctime/Makefile
        tests/zfs-tests/tests/functional/deadman/Makefile
        tests/zfs-tests/tests/functional/delegate/Makefile
index 536788f2eeed14100be29792041840f08972886e..895e705525fa1b2e8d4d50734d1a80c462355531 100644 (file)
@@ -575,6 +575,10 @@ tags = ['functional', 'compression']
 tests = ['cp_files_001_pos']
 tags = ['functional', 'cp_files']
 
+[tests/functional/crtime]
+tests = ['crtime_001_pos' ]
+tags = ['functional', 'crtime']
+
 [tests/functional/ctime]
 tests = ['ctime_001_pos' ]
 tags = ['functional', 'ctime']
index 4661a47f55a9bafe8516847223114fad879b6a3a..f5a43c66fe83927cd43f251ad0532f53fd6dab35 100755 (executable)
@@ -75,6 +75,12 @@ python_deps_reason = 'Python modules missing: python-cffi'
 #
 tmpfile_reason = 'Kernel O_TMPFILE support required'
 
+#
+# Some tests require the statx(2) system call on Linux which was first
+# introduced in the 4.11 kernel.
+#
+statx_reason = 'Kernel statx(2) system call required on Linux'
+
 #
 # Some tests require that the NFS client and server utilities be installed.
 #
@@ -193,6 +199,7 @@ elif sys.platform.startswith('linux'):
 #
 maybe = {
     'chattr/setup': ['SKIP', exec_reason],
+    'crtime/crtime_001_pos': ['SKIP', statx_reason],
     'cli_root/zdb/zdb_006_pos': ['FAIL', known_reason],
     'cli_root/zfs_destroy/zfs_destroy_dev_removal_condense':
         ['FAIL', known_reason],
index 5a360bd5e705dcc81d06dce4205ef3c14e9dcc65..1dc6881b6d1aa0a3e1d02dfa0947fb8543c28f28 100644 (file)
@@ -4024,6 +4024,34 @@ function stat_size #<path>
        esac
 }
 
+function stat_ctime #<path>
+{
+       typeset path=$1
+
+       case $(uname) in
+       FreeBSD)
+               stat -f %c "$path"
+               ;;
+       *)
+               stat -c %Z "$path"
+               ;;
+       esac
+}
+
+function stat_crtime #<path>
+{
+       typeset path=$1
+
+       case $(uname) in
+       FreeBSD)
+               stat -f %B "$path"
+               ;;
+       *)
+               stat -c %W "$path"
+               ;;
+       esac
+}
+
 # Run a command as if it was being run in a TTY.
 #
 # Usage:
index 3a5b7b0b974720a56c1c04b51706ba8553fe2292..137cddd5f7842687e1e707ec36813db6927b0343 100644 (file)
@@ -16,6 +16,7 @@ SUBDIRS = \
        cli_user \
        compression \
        cp_files \
+       crtime \
        ctime \
        deadman \
        delegate \
index a4cedca49ce8311bd427bd69563b5aacd14bf955..62c4e768c0a17602d615266d399e9c6d274c4607 100755 (executable)
@@ -84,11 +84,7 @@ do
                continue;
        fi
 
-       if is_freebsd; then
-               filetime="$(stat -f "%c" $file)"
-       else
-               filetime="$(stat -c '%Z' $file)"
-       fi
+       filetime=$(stat_ctime $file)
        if [[ "$filetime" != "$ctime" ]]; then
                log_fail "Unexpected ctime for file $file ($filetime != $ctime)"
        else
diff --git a/tests/zfs-tests/tests/functional/crtime/Makefile.am b/tests/zfs-tests/tests/functional/crtime/Makefile.am
new file mode 100644 (file)
index 0000000..13e1c2d
--- /dev/null
@@ -0,0 +1,5 @@
+pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/crtime
+dist_pkgdata_SCRIPTS = \
+       cleanup.ksh \
+       setup.ksh \
+       crtime_001_pos.ksh
diff --git a/tests/zfs-tests/tests/functional/crtime/cleanup.ksh b/tests/zfs-tests/tests/functional/crtime/cleanup.ksh
new file mode 100755 (executable)
index 0000000..3166bd6
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+default_cleanup
diff --git a/tests/zfs-tests/tests/functional/crtime/crtime_001_pos.ksh b/tests/zfs-tests/tests/functional/crtime/crtime_001_pos.ksh
new file mode 100755 (executable)
index 0000000..4f98105
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Portions Copyright 2021 iXsystems, Inc.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# Verify crtime is functional with xattr=on|sa
+
+verify_runnable "both"
+
+#
+# The statx system call was first added in the 4.11 Linux kernel.  Prior to this
+# change there was no mechanism to obtain birth time on Linux.  Therefore, this
+# test is expected to fail on older kernels and is skipped.
+#
+if is_linux; then
+       if [[ $(linux_version) -lt $(linux_version "4.11") ]]; then
+               log_unsupported "Requires statx(2) system call on Linux"
+       fi
+       typeset stat_version=$(stat --version | awk '{ print $NF; exit }')
+       if compare_version_gte "8.30" "${stat_version}"; then
+               log_unsupported "Requires coreutils stat(1) > 8.30 on Linux"
+       fi
+fi
+
+log_assert "Verify crtime is functional."
+
+set -A args "sa" "on"
+typeset TESTFILE=$TESTDIR/testfile
+
+for arg in ${args[*]}; do
+       log_note "Testing with xattr set to $arg"
+       log_must zfs set xattr=$arg $TESTPOOL
+       rm -f $TESTFILE
+       log_must touch $TESTFILE
+       typeset -i crtime=$(stat_crtime $TESTFILE)
+       typeset -i ctime=$(stat_ctime $TESTFILE)
+       if (( crtime != ctime )); then
+               log_fail "Incorrect crtime ($crtime != $ctime)"
+       fi
+       log_must touch $TESTFILE
+       typeset -i crtime1=$(stat_crtime $TESTFILE)
+       if (( crtime1 != crtime )); then
+               log_fail "touch modified crtime ($crtime1 != $crtime)"
+       fi
+done
+
+log_pass "Verified crtime is functional."
diff --git a/tests/zfs-tests/tests/functional/crtime/setup.ksh b/tests/zfs-tests/tests/functional/crtime/setup.ksh
new file mode 100755 (executable)
index 0000000..fc5cec3
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/ksh -p
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+# Use is subject to license terms.
+#
+
+#
+# Copyright (c) 2013 by Delphix. All rights reserved.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+DISK=${DISKS%% *}
+default_setup $DISK