aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRyan Moeller <[email protected]>2021-12-17 19:18:37 -0500
committerGitHub <[email protected]>2021-12-17 16:18:37 -0800
commit3fa5266d727a0e9506dfeed0118cbe7dd3c2a18d (patch)
tree311331500e79bfbdb0d79c5a5ae6bb831bc85273 /tests
parent82e414f1b2e4d3c45d107b79da4a750485038c83 (diff)
Linux: Implement FS_IOC_GETVERSION
Provide access to file generation number on Linux. Add test coverage. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Ahelenia ZiemiaƄska <[email protected]> Signed-off-by: Ryan Moeller <[email protected]> Closes #12856
Diffstat (limited to 'tests')
-rw-r--r--tests/runfiles/common.run4
-rw-r--r--tests/zfs-tests/cmd/Makefile.am1
-rw-r--r--tests/zfs-tests/cmd/getversion/.gitignore1
-rw-r--r--tests/zfs-tests/cmd/getversion/Makefile.am6
-rw-r--r--tests/zfs-tests/cmd/getversion/getversion.c48
-rw-r--r--tests/zfs-tests/include/commands.cfg1
-rw-r--r--tests/zfs-tests/include/libtest.shlib14
-rw-r--r--tests/zfs-tests/tests/functional/Makefile.am1
-rw-r--r--tests/zfs-tests/tests/functional/stat/Makefile.am8
-rwxr-xr-xtests/zfs-tests/tests/functional/stat/cleanup.ksh34
-rwxr-xr-xtests/zfs-tests/tests/functional/stat/setup.ksh36
-rwxr-xr-xtests/zfs-tests/tests/functional/stat/stat_001_pos.ksh57
12 files changed, 211 insertions, 0 deletions
diff --git a/tests/runfiles/common.run b/tests/runfiles/common.run
index d5052172d..0f0eab050 100644
--- a/tests/runfiles/common.run
+++ b/tests/runfiles/common.run
@@ -874,6 +874,10 @@ tags = ['functional', 'snapused']
tests = ['sparse_001_pos']
tags = ['functional', 'sparse']
+[tests/functional/stat]
+tests = ['stat_001_pos']
+tags = ['functional', 'stat']
+
[tests/functional/suid]
tests = ['suid_write_to_suid', 'suid_write_to_sgid', 'suid_write_to_suid_sgid',
'suid_write_to_none']
diff --git a/tests/zfs-tests/cmd/Makefile.am b/tests/zfs-tests/cmd/Makefile.am
index d1c29fcd1..2470397a9 100644
--- a/tests/zfs-tests/cmd/Makefile.am
+++ b/tests/zfs-tests/cmd/Makefile.am
@@ -32,6 +32,7 @@ SUBDIRS = \
if BUILD_LINUX
SUBDIRS += \
+ getversion \
randfree_file \
user_ns_exec \
xattrtest
diff --git a/tests/zfs-tests/cmd/getversion/.gitignore b/tests/zfs-tests/cmd/getversion/.gitignore
new file mode 100644
index 000000000..b347c417a
--- /dev/null
+++ b/tests/zfs-tests/cmd/getversion/.gitignore
@@ -0,0 +1 @@
+/getversion
diff --git a/tests/zfs-tests/cmd/getversion/Makefile.am b/tests/zfs-tests/cmd/getversion/Makefile.am
new file mode 100644
index 000000000..d6b5e8408
--- /dev/null
+++ b/tests/zfs-tests/cmd/getversion/Makefile.am
@@ -0,0 +1,6 @@
+include $(top_srcdir)/config/Rules.am
+
+pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/bin
+
+pkgexec_PROGRAMS = getversion
+getversion_SOURCES = getversion.c
diff --git a/tests/zfs-tests/cmd/getversion/getversion.c b/tests/zfs-tests/cmd/getversion/getversion.c
new file mode 100644
index 000000000..62c1c5b6a
--- /dev/null
+++ b/tests/zfs-tests/cmd/getversion/getversion.c
@@ -0,0 +1,48 @@
+/*
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ */
+
+/*
+ * Copyright 2021 iXsystems, Inc.
+ */
+
+/*
+ * FreeBSD and macOS expose file generation number through stat(2) and stat(1).
+ * Linux exposes it instead through an ioctl.
+ */
+
+#include <sys/ioctl.h>
+#include <sys/fcntl.h>
+#include <linux/fs.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+int
+main(int argc, const char * const argv[])
+{
+ if (argc != 2)
+ errx(EXIT_FAILURE, "usage: %s filename", argv[0]);
+
+ int fd = open(argv[1], O_RDONLY);
+ if (fd == -1)
+ err(EXIT_FAILURE, "failed to open %s", argv[1]);
+
+ int gen = 0;
+ if (ioctl(fd, FS_IOC_GETVERSION, &gen) == -1)
+ err(EXIT_FAILURE, "FS_IOC_GETVERSION failed");
+
+ (void) close(fd);
+
+ (void) printf("%d\n", gen);
+
+ return (EXIT_SUCCESS);
+}
diff --git a/tests/zfs-tests/include/commands.cfg b/tests/zfs-tests/include/commands.cfg
index 4497a6248..e479f2c01 100644
--- a/tests/zfs-tests/include/commands.cfg
+++ b/tests/zfs-tests/include/commands.cfg
@@ -201,6 +201,7 @@ export ZFSTEST_FILES='badsend
file_trunc
file_write
get_diff
+ getversion
largest_file
libzfs_input_check
mkbusy
diff --git a/tests/zfs-tests/include/libtest.shlib b/tests/zfs-tests/include/libtest.shlib
index 2e6ec7601..66aec104c 100644
--- a/tests/zfs-tests/include/libtest.shlib
+++ b/tests/zfs-tests/include/libtest.shlib
@@ -4051,6 +4051,20 @@ function stat_crtime #<path>
esac
}
+function stat_generation #<path>
+{
+ typeset path=$1
+
+ case $(uname) in
+ Linux)
+ getversion "${path}"
+ ;;
+ *)
+ stat -f %v "${path}"
+ ;;
+ esac
+}
+
# Run a command as if it was being run in a TTY.
#
# Usage:
diff --git a/tests/zfs-tests/tests/functional/Makefile.am b/tests/zfs-tests/tests/functional/Makefile.am
index 137cddd5f..1412e3d81 100644
--- a/tests/zfs-tests/tests/functional/Makefile.am
+++ b/tests/zfs-tests/tests/functional/Makefile.am
@@ -73,6 +73,7 @@ SUBDIRS = \
snapshot \
snapused \
sparse \
+ stat \
suid \
threadsappend \
trim \
diff --git a/tests/zfs-tests/tests/functional/stat/Makefile.am b/tests/zfs-tests/tests/functional/stat/Makefile.am
new file mode 100644
index 000000000..1a861a655
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/stat/Makefile.am
@@ -0,0 +1,8 @@
+include $(top_srcdir)/config/Rules.am
+
+pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/stat
+
+dist_pkgdata_SCRIPTS = \
+ cleanup.ksh \
+ setup.ksh \
+ stat_001_pos.ksh
diff --git a/tests/zfs-tests/tests/functional/stat/cleanup.ksh b/tests/zfs-tests/tests/functional/stat/cleanup.ksh
new file mode 100755
index 000000000..3166bd6ec
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/stat/cleanup.ksh
@@ -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/stat/setup.ksh b/tests/zfs-tests/tests/functional/stat/setup.ksh
new file mode 100755
index 000000000..4fc55cd47
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/stat/setup.ksh
@@ -0,0 +1,36 @@
+#!/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}
diff --git a/tests/zfs-tests/tests/functional/stat/stat_001_pos.ksh b/tests/zfs-tests/tests/functional/stat/stat_001_pos.ksh
new file mode 100755
index 000000000..e6f9775f4
--- /dev/null
+++ b/tests/zfs-tests/tests/functional/stat/stat_001_pos.ksh
@@ -0,0 +1,57 @@
+#! /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 2021 iXsystems, Inc.
+#
+
+. $STF_SUITE/include/libtest.shlib
+
+#
+# DESCRIPTION:
+#
+# Ensure znode generation number is accessible.
+#
+# STRATEGY:
+# 1) Create a file
+# 2) Verify that the znode generation number can be obtained
+# 3) Verify that the znode generation number is not empty
+#
+
+verify_runnable "both"
+
+function cleanup
+{
+ rm -f ${TESTFILE}
+}
+
+log_onexit cleanup
+
+log_assert "Ensure znode generation number is accessible."
+
+TESTFILE=${TESTDIR}/${TESTFILE0}
+
+log_must touch ${TESTFILE}
+log_must stat_generation ${TESTFILE}
+log_must test $(stat_generation ${TESTFILE}) -ne 0
+
+log_pass "Successfully obtained file znode generation number."