mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Linux: Implement FS_IOC_GETVERSION
Provide access to file generation number on Linux. Add test coverage. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Signed-off-by: Ryan Moeller <freqlabs@FreeBSD.org> Closes #12856
This commit is contained in:
		
							parent
							
								
									82e414f1b2
								
							
						
					
					
						commit
						3fa5266d72
					
				| @ -213,6 +213,7 @@ AC_CONFIG_FILES([ | ||||
| 	tests/zfs-tests/cmd/file_trunc/Makefile | ||||
| 	tests/zfs-tests/cmd/file_write/Makefile | ||||
| 	tests/zfs-tests/cmd/get_diff/Makefile | ||||
| 	tests/zfs-tests/cmd/getversion/Makefile | ||||
| 	tests/zfs-tests/cmd/largest_file/Makefile | ||||
| 	tests/zfs-tests/cmd/libzfs_input_check/Makefile | ||||
| 	tests/zfs-tests/cmd/mkbusy/Makefile | ||||
| @ -388,6 +389,7 @@ AC_CONFIG_FILES([ | ||||
| 	tests/zfs-tests/tests/functional/snapshot/Makefile | ||||
| 	tests/zfs-tests/tests/functional/snapused/Makefile | ||||
| 	tests/zfs-tests/tests/functional/sparse/Makefile | ||||
| 	tests/zfs-tests/tests/functional/stat/Makefile | ||||
| 	tests/zfs-tests/tests/functional/suid/Makefile | ||||
| 	tests/zfs-tests/tests/functional/threadsappend/Makefile | ||||
| 	tests/zfs-tests/tests/functional/tmpfile/Makefile | ||||
|  | ||||
| @ -817,6 +817,14 @@ zpl_fallocate(struct file *filp, int mode, loff_t offset, loff_t len) | ||||
| 	    mode, offset, len); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| zpl_ioctl_getversion(struct file *filp, void __user *arg) | ||||
| { | ||||
| 	uint32_t generation = file_inode(filp)->i_generation; | ||||
| 
 | ||||
| 	return (copy_to_user(arg, &generation, sizeof (generation))); | ||||
| } | ||||
| 
 | ||||
| #define	ZFS_FL_USER_VISIBLE	(FS_FL_USER_VISIBLE | ZFS_PROJINHERIT_FL) | ||||
| #define	ZFS_FL_USER_MODIFIABLE	(FS_FL_USER_MODIFIABLE | ZFS_PROJINHERIT_FL) | ||||
| 
 | ||||
| @ -989,6 +997,8 @@ static long | ||||
| zpl_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	switch (cmd) { | ||||
| 	case FS_IOC_GETVERSION: | ||||
| 		return (zpl_ioctl_getversion(filp, (void *)arg)); | ||||
| 	case FS_IOC_GETFLAGS: | ||||
| 		return (zpl_ioctl_getflags(filp, (void *)arg)); | ||||
| 	case FS_IOC_SETFLAGS: | ||||
| @ -1007,6 +1017,9 @@ static long | ||||
| zpl_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	switch (cmd) { | ||||
| 	case FS_IOC32_GETVERSION: | ||||
| 		cmd = FS_IOC_GETVERSION; | ||||
| 		break; | ||||
| 	case FS_IOC32_GETFLAGS: | ||||
| 		cmd = FS_IOC_GETFLAGS; | ||||
| 		break; | ||||
|  | ||||
| @ -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'] | ||||
|  | ||||
| @ -32,6 +32,7 @@ SUBDIRS = \ | ||||
| 
 | ||||
| if BUILD_LINUX | ||||
| SUBDIRS += \
 | ||||
| 	getversion \
 | ||||
| 	randfree_file \
 | ||||
| 	user_ns_exec \
 | ||||
| 	xattrtest | ||||
|  | ||||
							
								
								
									
										1
									
								
								tests/zfs-tests/cmd/getversion/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/zfs-tests/cmd/getversion/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| /getversion | ||||
							
								
								
									
										6
									
								
								tests/zfs-tests/cmd/getversion/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/zfs-tests/cmd/getversion/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | ||||
| include $(top_srcdir)/config/Rules.am | ||||
| 
 | ||||
| pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/bin | ||||
| 
 | ||||
| pkgexec_PROGRAMS = getversion | ||||
| getversion_SOURCES = getversion.c | ||||
							
								
								
									
										48
									
								
								tests/zfs-tests/cmd/getversion/getversion.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								tests/zfs-tests/cmd/getversion/getversion.c
									
									
									
									
									
										Normal file
									
								
							| @ -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); | ||||
| } | ||||
| @ -201,6 +201,7 @@ export ZFSTEST_FILES='badsend | ||||
|     file_trunc | ||||
|     file_write | ||||
|     get_diff | ||||
|     getversion | ||||
|     largest_file | ||||
|     libzfs_input_check | ||||
|     mkbusy | ||||
|  | ||||
| @ -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: | ||||
|  | ||||
| @ -73,6 +73,7 @@ SUBDIRS = \ | ||||
| 	snapshot \
 | ||||
| 	snapused \
 | ||||
| 	sparse \
 | ||||
| 	stat \
 | ||||
| 	suid \
 | ||||
| 	threadsappend \
 | ||||
| 	trim \
 | ||||
|  | ||||
							
								
								
									
										8
									
								
								tests/zfs-tests/tests/functional/stat/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								tests/zfs-tests/tests/functional/stat/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
							
								
								
									
										34
									
								
								tests/zfs-tests/tests/functional/stat/cleanup.ksh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								tests/zfs-tests/tests/functional/stat/cleanup.ksh
									
									
									
									
									
										Executable file
									
								
							| @ -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 | ||||
							
								
								
									
										36
									
								
								tests/zfs-tests/tests/functional/stat/setup.ksh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										36
									
								
								tests/zfs-tests/tests/functional/stat/setup.ksh
									
									
									
									
									
										Executable file
									
								
							| @ -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} | ||||
							
								
								
									
										57
									
								
								tests/zfs-tests/tests/functional/stat/stat_001_pos.ksh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								tests/zfs-tests/tests/functional/stat/stat_001_pos.ksh
									
									
									
									
									
										Executable file
									
								
							| @ -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." | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Ryan Moeller
						Ryan Moeller