Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/fs/statmount: build with tools include dir

Copy the required headers files (mount.h, nsfs.h) to the tools
include dir and define the statmount/listmount syscall numbers
to decouple dependency with headers_install for the common cases.

Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Link: https://lore.kernel.org/20250509133240.529330-3-amir73il@gmail.com
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Amir Goldstein and committed by
Christian Brauner
b13fb4ee 0bd92b9f

+318 -1
+235
tools/include/uapi/linux/mount.h
··· 1 + #ifndef _UAPI_LINUX_MOUNT_H 2 + #define _UAPI_LINUX_MOUNT_H 3 + 4 + #include <linux/types.h> 5 + 6 + /* 7 + * These are the fs-independent mount-flags: up to 32 flags are supported 8 + * 9 + * Usage of these is restricted within the kernel to core mount(2) code and 10 + * callers of sys_mount() only. Filesystems should be using the SB_* 11 + * equivalent instead. 12 + */ 13 + #define MS_RDONLY 1 /* Mount read-only */ 14 + #define MS_NOSUID 2 /* Ignore suid and sgid bits */ 15 + #define MS_NODEV 4 /* Disallow access to device special files */ 16 + #define MS_NOEXEC 8 /* Disallow program execution */ 17 + #define MS_SYNCHRONOUS 16 /* Writes are synced at once */ 18 + #define MS_REMOUNT 32 /* Alter flags of a mounted FS */ 19 + #define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */ 20 + #define MS_DIRSYNC 128 /* Directory modifications are synchronous */ 21 + #define MS_NOSYMFOLLOW 256 /* Do not follow symlinks */ 22 + #define MS_NOATIME 1024 /* Do not update access times. */ 23 + #define MS_NODIRATIME 2048 /* Do not update directory access times */ 24 + #define MS_BIND 4096 25 + #define MS_MOVE 8192 26 + #define MS_REC 16384 27 + #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. 28 + MS_VERBOSE is deprecated. */ 29 + #define MS_SILENT 32768 30 + #define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ 31 + #define MS_UNBINDABLE (1<<17) /* change to unbindable */ 32 + #define MS_PRIVATE (1<<18) /* change to private */ 33 + #define MS_SLAVE (1<<19) /* change to slave */ 34 + #define MS_SHARED (1<<20) /* change to shared */ 35 + #define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */ 36 + #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ 37 + #define MS_I_VERSION (1<<23) /* Update inode I_version field */ 38 + #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ 39 + #define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ 40 + 41 + /* These sb flags are internal to the kernel */ 42 + #define MS_SUBMOUNT (1<<26) 43 + #define MS_NOREMOTELOCK (1<<27) 44 + #define MS_NOSEC (1<<28) 45 + #define MS_BORN (1<<29) 46 + #define MS_ACTIVE (1<<30) 47 + #define MS_NOUSER (1<<31) 48 + 49 + /* 50 + * Superblock flags that can be altered by MS_REMOUNT 51 + */ 52 + #define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION|\ 53 + MS_LAZYTIME) 54 + 55 + /* 56 + * Old magic mount flag and mask 57 + */ 58 + #define MS_MGC_VAL 0xC0ED0000 59 + #define MS_MGC_MSK 0xffff0000 60 + 61 + /* 62 + * open_tree() flags. 63 + */ 64 + #define OPEN_TREE_CLONE 1 /* Clone the target tree and attach the clone */ 65 + #define OPEN_TREE_CLOEXEC O_CLOEXEC /* Close the file on execve() */ 66 + 67 + /* 68 + * move_mount() flags. 69 + */ 70 + #define MOVE_MOUNT_F_SYMLINKS 0x00000001 /* Follow symlinks on from path */ 71 + #define MOVE_MOUNT_F_AUTOMOUNTS 0x00000002 /* Follow automounts on from path */ 72 + #define MOVE_MOUNT_F_EMPTY_PATH 0x00000004 /* Empty from path permitted */ 73 + #define MOVE_MOUNT_T_SYMLINKS 0x00000010 /* Follow symlinks on to path */ 74 + #define MOVE_MOUNT_T_AUTOMOUNTS 0x00000020 /* Follow automounts on to path */ 75 + #define MOVE_MOUNT_T_EMPTY_PATH 0x00000040 /* Empty to path permitted */ 76 + #define MOVE_MOUNT_SET_GROUP 0x00000100 /* Set sharing group instead */ 77 + #define MOVE_MOUNT_BENEATH 0x00000200 /* Mount beneath top mount */ 78 + #define MOVE_MOUNT__MASK 0x00000377 79 + 80 + /* 81 + * fsopen() flags. 82 + */ 83 + #define FSOPEN_CLOEXEC 0x00000001 84 + 85 + /* 86 + * fspick() flags. 87 + */ 88 + #define FSPICK_CLOEXEC 0x00000001 89 + #define FSPICK_SYMLINK_NOFOLLOW 0x00000002 90 + #define FSPICK_NO_AUTOMOUNT 0x00000004 91 + #define FSPICK_EMPTY_PATH 0x00000008 92 + 93 + /* 94 + * The type of fsconfig() call made. 95 + */ 96 + enum fsconfig_command { 97 + FSCONFIG_SET_FLAG = 0, /* Set parameter, supplying no value */ 98 + FSCONFIG_SET_STRING = 1, /* Set parameter, supplying a string value */ 99 + FSCONFIG_SET_BINARY = 2, /* Set parameter, supplying a binary blob value */ 100 + FSCONFIG_SET_PATH = 3, /* Set parameter, supplying an object by path */ 101 + FSCONFIG_SET_PATH_EMPTY = 4, /* Set parameter, supplying an object by (empty) path */ 102 + FSCONFIG_SET_FD = 5, /* Set parameter, supplying an object by fd */ 103 + FSCONFIG_CMD_CREATE = 6, /* Create new or reuse existing superblock */ 104 + FSCONFIG_CMD_RECONFIGURE = 7, /* Invoke superblock reconfiguration */ 105 + FSCONFIG_CMD_CREATE_EXCL = 8, /* Create new superblock, fail if reusing existing superblock */ 106 + }; 107 + 108 + /* 109 + * fsmount() flags. 110 + */ 111 + #define FSMOUNT_CLOEXEC 0x00000001 112 + 113 + /* 114 + * Mount attributes. 115 + */ 116 + #define MOUNT_ATTR_RDONLY 0x00000001 /* Mount read-only */ 117 + #define MOUNT_ATTR_NOSUID 0x00000002 /* Ignore suid and sgid bits */ 118 + #define MOUNT_ATTR_NODEV 0x00000004 /* Disallow access to device special files */ 119 + #define MOUNT_ATTR_NOEXEC 0x00000008 /* Disallow program execution */ 120 + #define MOUNT_ATTR__ATIME 0x00000070 /* Setting on how atime should be updated */ 121 + #define MOUNT_ATTR_RELATIME 0x00000000 /* - Update atime relative to mtime/ctime. */ 122 + #define MOUNT_ATTR_NOATIME 0x00000010 /* - Do not update access times. */ 123 + #define MOUNT_ATTR_STRICTATIME 0x00000020 /* - Always perform atime updates */ 124 + #define MOUNT_ATTR_NODIRATIME 0x00000080 /* Do not update directory access times */ 125 + #define MOUNT_ATTR_IDMAP 0x00100000 /* Idmap mount to @userns_fd in struct mount_attr. */ 126 + #define MOUNT_ATTR_NOSYMFOLLOW 0x00200000 /* Do not follow symlinks */ 127 + 128 + /* 129 + * mount_setattr() 130 + */ 131 + struct mount_attr { 132 + __u64 attr_set; 133 + __u64 attr_clr; 134 + __u64 propagation; 135 + __u64 userns_fd; 136 + }; 137 + 138 + /* List of all mount_attr versions. */ 139 + #define MOUNT_ATTR_SIZE_VER0 32 /* sizeof first published struct */ 140 + 141 + 142 + /* 143 + * Structure for getting mount/superblock/filesystem info with statmount(2). 144 + * 145 + * The interface is similar to statx(2): individual fields or groups can be 146 + * selected with the @mask argument of statmount(). Kernel will set the @mask 147 + * field according to the supported fields. 148 + * 149 + * If string fields are selected, then the caller needs to pass a buffer that 150 + * has space after the fixed part of the structure. Nul terminated strings are 151 + * copied there and offsets relative to @str are stored in the relevant fields. 152 + * If the buffer is too small, then EOVERFLOW is returned. The actually used 153 + * size is returned in @size. 154 + */ 155 + struct statmount { 156 + __u32 size; /* Total size, including strings */ 157 + __u32 mnt_opts; /* [str] Options (comma separated, escaped) */ 158 + __u64 mask; /* What results were written */ 159 + __u32 sb_dev_major; /* Device ID */ 160 + __u32 sb_dev_minor; 161 + __u64 sb_magic; /* ..._SUPER_MAGIC */ 162 + __u32 sb_flags; /* SB_{RDONLY,SYNCHRONOUS,DIRSYNC,LAZYTIME} */ 163 + __u32 fs_type; /* [str] Filesystem type */ 164 + __u64 mnt_id; /* Unique ID of mount */ 165 + __u64 mnt_parent_id; /* Unique ID of parent (for root == mnt_id) */ 166 + __u32 mnt_id_old; /* Reused IDs used in proc/.../mountinfo */ 167 + __u32 mnt_parent_id_old; 168 + __u64 mnt_attr; /* MOUNT_ATTR_... */ 169 + __u64 mnt_propagation; /* MS_{SHARED,SLAVE,PRIVATE,UNBINDABLE} */ 170 + __u64 mnt_peer_group; /* ID of shared peer group */ 171 + __u64 mnt_master; /* Mount receives propagation from this ID */ 172 + __u64 propagate_from; /* Propagation from in current namespace */ 173 + __u32 mnt_root; /* [str] Root of mount relative to root of fs */ 174 + __u32 mnt_point; /* [str] Mountpoint relative to current root */ 175 + __u64 mnt_ns_id; /* ID of the mount namespace */ 176 + __u32 fs_subtype; /* [str] Subtype of fs_type (if any) */ 177 + __u32 sb_source; /* [str] Source string of the mount */ 178 + __u32 opt_num; /* Number of fs options */ 179 + __u32 opt_array; /* [str] Array of nul terminated fs options */ 180 + __u32 opt_sec_num; /* Number of security options */ 181 + __u32 opt_sec_array; /* [str] Array of nul terminated security options */ 182 + __u64 supported_mask; /* Mask flags that this kernel supports */ 183 + __u32 mnt_uidmap_num; /* Number of uid mappings */ 184 + __u32 mnt_uidmap; /* [str] Array of uid mappings (as seen from callers namespace) */ 185 + __u32 mnt_gidmap_num; /* Number of gid mappings */ 186 + __u32 mnt_gidmap; /* [str] Array of gid mappings (as seen from callers namespace) */ 187 + __u64 __spare2[43]; 188 + char str[]; /* Variable size part containing strings */ 189 + }; 190 + 191 + /* 192 + * Structure for passing mount ID and miscellaneous parameters to statmount(2) 193 + * and listmount(2). 194 + * 195 + * For statmount(2) @param represents the request mask. 196 + * For listmount(2) @param represents the last listed mount id (or zero). 197 + */ 198 + struct mnt_id_req { 199 + __u32 size; 200 + __u32 spare; 201 + __u64 mnt_id; 202 + __u64 param; 203 + __u64 mnt_ns_id; 204 + }; 205 + 206 + /* List of all mnt_id_req versions. */ 207 + #define MNT_ID_REQ_SIZE_VER0 24 /* sizeof first published struct */ 208 + #define MNT_ID_REQ_SIZE_VER1 32 /* sizeof second published struct */ 209 + 210 + /* 211 + * @mask bits for statmount(2) 212 + */ 213 + #define STATMOUNT_SB_BASIC 0x00000001U /* Want/got sb_... */ 214 + #define STATMOUNT_MNT_BASIC 0x00000002U /* Want/got mnt_... */ 215 + #define STATMOUNT_PROPAGATE_FROM 0x00000004U /* Want/got propagate_from */ 216 + #define STATMOUNT_MNT_ROOT 0x00000008U /* Want/got mnt_root */ 217 + #define STATMOUNT_MNT_POINT 0x00000010U /* Want/got mnt_point */ 218 + #define STATMOUNT_FS_TYPE 0x00000020U /* Want/got fs_type */ 219 + #define STATMOUNT_MNT_NS_ID 0x00000040U /* Want/got mnt_ns_id */ 220 + #define STATMOUNT_MNT_OPTS 0x00000080U /* Want/got mnt_opts */ 221 + #define STATMOUNT_FS_SUBTYPE 0x00000100U /* Want/got fs_subtype */ 222 + #define STATMOUNT_SB_SOURCE 0x00000200U /* Want/got sb_source */ 223 + #define STATMOUNT_OPT_ARRAY 0x00000400U /* Want/got opt_... */ 224 + #define STATMOUNT_OPT_SEC_ARRAY 0x00000800U /* Want/got opt_sec... */ 225 + #define STATMOUNT_SUPPORTED_MASK 0x00001000U /* Want/got supported mask flags */ 226 + #define STATMOUNT_MNT_UIDMAP 0x00002000U /* Want/got uidmap... */ 227 + #define STATMOUNT_MNT_GIDMAP 0x00004000U /* Want/got gidmap... */ 228 + 229 + /* 230 + * Special @mnt_id values that can be passed to listmount 231 + */ 232 + #define LSMT_ROOT 0xffffffffffffffff /* root mount */ 233 + #define LISTMOUNT_REVERSE (1 << 0) /* List later mounts first */ 234 + 235 + #endif /* _UAPI_LINUX_MOUNT_H */
+45
tools/include/uapi/linux/nsfs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 + #ifndef __LINUX_NSFS_H 3 + #define __LINUX_NSFS_H 4 + 5 + #include <linux/ioctl.h> 6 + #include <linux/types.h> 7 + 8 + #define NSIO 0xb7 9 + 10 + /* Returns a file descriptor that refers to an owning user namespace */ 11 + #define NS_GET_USERNS _IO(NSIO, 0x1) 12 + /* Returns a file descriptor that refers to a parent namespace */ 13 + #define NS_GET_PARENT _IO(NSIO, 0x2) 14 + /* Returns the type of namespace (CLONE_NEW* value) referred to by 15 + file descriptor */ 16 + #define NS_GET_NSTYPE _IO(NSIO, 0x3) 17 + /* Get owner UID (in the caller's user namespace) for a user namespace */ 18 + #define NS_GET_OWNER_UID _IO(NSIO, 0x4) 19 + /* Get the id for a mount namespace */ 20 + #define NS_GET_MNTNS_ID _IOR(NSIO, 0x5, __u64) 21 + /* Translate pid from target pid namespace into the caller's pid namespace. */ 22 + #define NS_GET_PID_FROM_PIDNS _IOR(NSIO, 0x6, int) 23 + /* Return thread-group leader id of pid in the callers pid namespace. */ 24 + #define NS_GET_TGID_FROM_PIDNS _IOR(NSIO, 0x7, int) 25 + /* Translate pid from caller's pid namespace into a target pid namespace. */ 26 + #define NS_GET_PID_IN_PIDNS _IOR(NSIO, 0x8, int) 27 + /* Return thread-group leader id of pid in the target pid namespace. */ 28 + #define NS_GET_TGID_IN_PIDNS _IOR(NSIO, 0x9, int) 29 + 30 + struct mnt_ns_info { 31 + __u32 size; 32 + __u32 nr_mounts; 33 + __u64 mnt_ns_id; 34 + }; 35 + 36 + #define MNT_NS_INFO_SIZE_VER0 16 /* size of first published struct */ 37 + 38 + /* Get information about namespace. */ 39 + #define NS_MNT_GET_INFO _IOR(NSIO, 10, struct mnt_ns_info) 40 + /* Get next namespace. */ 41 + #define NS_MNT_GET_NEXT _IOR(NSIO, 11, struct mnt_ns_info) 42 + /* Get previous namespace. */ 43 + #define NS_MNT_GET_PREV _IOR(NSIO, 12, struct mnt_ns_info) 44 + 45 + #endif /* __LINUX_NSFS_H */
+2 -1
tools/testing/selftests/filesystems/statmount/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0-or-later 2 2 3 - CFLAGS += -Wall -O2 -g $(KHDR_INCLUDES) 3 + CFLAGS += -Wall -O2 -g $(KHDR_INCLUDES) $(TOOLS_INCLUDES) 4 + 4 5 TEST_GEN_PROGS := statmount_test statmount_test_ns listmount_test 5 6 6 7 include ../../lib.mk
+36
tools/testing/selftests/filesystems/statmount/statmount.h
··· 7 7 #include <linux/mount.h> 8 8 #include <asm/unistd.h> 9 9 10 + #ifndef __NR_statmount 11 + #if defined __alpha__ 12 + #define __NR_statmount 567 13 + #elif defined _MIPS_SIM 14 + #if _MIPS_SIM == _MIPS_SIM_ABI32 /* o32 */ 15 + #define __NR_statmount 4457 16 + #endif 17 + #if _MIPS_SIM == _MIPS_SIM_NABI32 /* n32 */ 18 + #define __NR_statmount 6457 19 + #endif 20 + #if _MIPS_SIM == _MIPS_SIM_ABI64 /* n64 */ 21 + #define __NR_statmount 5457 22 + #endif 23 + #else 24 + #define __NR_statmount 457 25 + #endif 26 + #endif 27 + 28 + #ifndef __NR_listmount 29 + #if defined __alpha__ 30 + #define __NR_listmount 568 31 + #elif defined _MIPS_SIM 32 + #if _MIPS_SIM == _MIPS_SIM_ABI32 /* o32 */ 33 + #define __NR_listmount 4458 34 + #endif 35 + #if _MIPS_SIM == _MIPS_SIM_NABI32 /* n32 */ 36 + #define __NR_listmount 6458 37 + #endif 38 + #if _MIPS_SIM == _MIPS_SIM_ABI64 /* n64 */ 39 + #define __NR_listmount 5458 40 + #endif 41 + #else 42 + #define __NR_listmount 458 43 + #endif 44 + #endif 45 + 10 46 static inline int statmount(uint64_t mnt_id, uint64_t mnt_ns_id, uint64_t mask, 11 47 struct statmount *buf, size_t bufsize, 12 48 unsigned int flags)