aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@kernel.org>2022-08-09 12:36:58 -0400
committerJeff Layton <jlayton@kernel.org>2022-09-29 14:15:07 -0400
commit948d69ab0faa8b3900875c0dbf1128817c5cc760 (patch)
tree4265545b249d28a49388c1fd8e44358b4b228c51
parent3c6e12a4a4a0ae969f4a8952626e518ca82620e9 (diff)
downloadxfsprogs-dev-iversion.tar.gz
xfs_io: add support for stx_mnt_id and stx_version fieldsiversion
Add support for the new mnt_id field and the proposed change_attr field in statx to xfs_io. Add a new autoconf test to see whether the system's struct statx has the requisite fields. If not, or if there is no struct statx defined, then use the internal definitions in statx.h. Wrap most of the preprocessor constants in #ifdefs so that we only redefine the values needed. Since we can't undefine a struct definition, postfix their names with "_internal" and use the preprocessor to override the struct definitions. Cc: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Jeff Layton <jlayton@kernel.org>
-rw-r--r--configure.ac1
-rw-r--r--include/builddefs.in4
-rw-r--r--io/stat.c8
-rw-r--r--io/statx.h32
-rw-r--r--m4/package_libcdev.m414
5 files changed, 50 insertions, 9 deletions
diff --git a/configure.ac b/configure.ac
index 212da02e95..e9ff57c7dc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -187,6 +187,7 @@ AC_HAVE_FSETXATTR
AC_HAVE_MREMAP
AC_NEED_INTERNAL_FSXATTR
AC_NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG
+AC_NEED_INTERNAL_STATX
AC_HAVE_GETFSMAP
AC_HAVE_STATFS_FLAGS
AC_HAVE_MAP_SYNC
diff --git a/include/builddefs.in b/include/builddefs.in
index e0a2f3cbc9..4c690ee3a8 100644
--- a/include/builddefs.in
+++ b/include/builddefs.in
@@ -110,6 +110,7 @@ HAVE_FSETXATTR = @have_fsetxattr@
HAVE_MREMAP = @have_mremap@
NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@
NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG = @need_internal_fscrypt_add_key_arg@
+NEED_INTERNAL_STATX = @need_internal_statx@
HAVE_GETFSMAP = @have_getfsmap@
HAVE_STATFS_FLAGS = @have_statfs_flags@
HAVE_MAP_SYNC = @have_map_sync@
@@ -155,6 +156,9 @@ endif
ifeq ($(NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG),yes)
PCFLAGS+= -DOVERRIDE_SYSTEM_FSCRYPT_ADD_KEY_ARG
endif
+ifeq ($(NEED_INTERNAL_STATX),yes)
+PCFLAGS+= -DOVERRIDE_SYSTEM_STATX
+endif
ifeq ($(HAVE_GETFSMAP),yes)
PCFLAGS+= -DHAVE_GETFSMAP
endif
diff --git a/io/stat.c b/io/stat.c
index b57f9eefed..0dcc04fedf 100644
--- a/io/stat.c
+++ b/io/stat.c
@@ -17,6 +17,8 @@
#include <fcntl.h>
+#define IO_STATX_MASK (STATX_ALL | STATX_MNT_ID | STATX_VERSION)
+
static cmdinfo_t stat_cmd;
static cmdinfo_t statfs_cmd;
static cmdinfo_t statx_cmd;
@@ -349,6 +351,8 @@ dump_raw_statx(struct statx *stx)
printf("stat.rdev_minor = %u\n", stx->stx_rdev_minor);
printf("stat.dev_major = %u\n", stx->stx_dev_major);
printf("stat.dev_minor = %u\n", stx->stx_dev_minor);
+ printf("stat.mnt_id = 0x%llx\n", stx->stx_mnt_id);
+ printf("stat.version = 0x%llx\n", stx->stx_version);
return 0;
}
@@ -367,7 +371,7 @@ statx_f(
char *p;
struct statx stx;
int atflag = 0;
- unsigned int mask = STATX_ALL;
+ unsigned int mask = IO_STATX_MASK;
while ((c = getopt(argc, argv, "m:rvFD")) != EOF) {
switch (c) {
@@ -375,7 +379,7 @@ statx_f(
if (strcmp(optarg, "basic") == 0)
mask = STATX_BASIC_STATS;
else if (strcmp(optarg, "all") == 0)
- mask = STATX_ALL;
+ mask = IO_STATX_MASK;
else {
mask = strtoul(optarg, &p, 0);
if (!p || p == optarg) {
diff --git a/io/statx.h b/io/statx.h
index c6625ac431..2cc26ecf8a 100644
--- a/io/statx.h
+++ b/io/statx.h
@@ -5,6 +5,7 @@
#include <unistd.h>
#include <sys/syscall.h>
+#include <sys/types.h>
#ifndef AT_EMPTY_PATH
#define AT_EMPTY_PATH 0x1000
@@ -37,10 +38,10 @@
#ifndef STATX_TYPE
/* Pick up kernel definitions if glibc didn't already provide them */
#include <linux/stat.h>
-#endif
+#endif /* STATX_TYPE */
-#ifndef STATX_TYPE
-/* Local definitions if glibc & kernel headers didn't already provide them */
+#ifdef OVERRIDE_SYSTEM_STATX
+/* Local definitions if they don't exist or are too old */
/*
* Timestamp structure for the timestamps in struct statx.
@@ -56,11 +57,12 @@
*
* __reserved is held in case we need a yet finer resolution.
*/
-struct statx_timestamp {
+struct statx_timestamp_internal {
__s64 tv_sec;
__s32 tv_nsec;
__s32 __reserved;
};
+#define statx_timestamp statx_timestamp_internal
/*
* Structures for the extended file attribute retrieval system call
@@ -99,7 +101,7 @@ struct statx_timestamp {
* will have values installed for compatibility purposes so that stat() and
* co. can be emulated in userspace.
*/
-struct statx {
+struct statx_internal {
/* 0x00 */
__u32 stx_mask; /* What results were written [uncond] */
__u32 stx_blksize; /* Preferred general I/O size [uncond] */
@@ -126,9 +128,15 @@ struct statx {
__u32 stx_dev_major; /* ID of device containing file [uncond] */
__u32 stx_dev_minor;
/* 0x90 */
- __u64 __spare2[14]; /* Spare space for future expansion */
+ __u64 stx_mnt_id;
+ __u32 stx_dio_mem_align; /* Memory buffer alignment for direct I/O */
+ __u32 stx_dio_offset_align; /* File offset alignment for direct I/O */
+ /* 0xa0 */
+ __u64 stx_version; /* Inode change counter */
+ __u64 __spare2[11]; /* Spare space for future expansion */
/* 0x100 */
};
+#define statx statx_internal
/*
* Flags to be stx_mask
@@ -138,6 +146,7 @@ struct statx {
* These bits should be set in the mask argument of statx() to request
* particular items when calling statx().
*/
+#ifndef STATX_TYPE
#define STATX_TYPE 0x00000001U /* Want/got stx_mode & S_IFMT */
#define STATX_MODE 0x00000002U /* Want/got stx_mode & ~S_IFMT */
#define STATX_NLINK 0x00000004U /* Want/got stx_nlink */
@@ -153,6 +162,13 @@ struct statx {
#define STATX_BTIME 0x00000800U /* Want/got stx_btime */
#define STATX_ALL 0x00000fffU /* All currently supported flags */
#define STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */
+#endif /* STATX_TYPE */
+
+#ifndef STATX_VERSION
+#define STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */
+#define STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info */
+#define STATX_VERSION 0x00004000U /* Want/got stx_version */
+#endif /* STATX_VERSION */
/*
* Attributes to be found in stx_attributes
@@ -165,6 +181,7 @@ struct statx {
* semantically. Where possible, the numerical value is picked to correspond
* also.
*/
+#ifndef STATX_ATTR_COMPRESSED
#define STATX_ATTR_COMPRESSED 0x00000004 /* [I] File is compressed by the fs */
#define STATX_ATTR_IMMUTABLE 0x00000010 /* [I] File is marked immutable */
#define STATX_ATTR_APPEND 0x00000020 /* [I] File is append-only */
@@ -172,6 +189,7 @@ struct statx {
#define STATX_ATTR_ENCRYPTED 0x00000800 /* [I] File requires key to decrypt in fs */
#define STATX_ATTR_AUTOMOUNT 0x00001000 /* Dir: Automount trigger */
+#endif /* STATX_ATTR_COMPRESSED */
-#endif /* STATX_TYPE */
+#endif /* OVERRIDE_SYSTEM_STATX */
#endif /* XFS_IO_STATX_H */
diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4
index bb1ab49c11..8fde375183 100644
--- a/m4/package_libcdev.m4
+++ b/m4/package_libcdev.m4
@@ -507,3 +507,17 @@ AC_DEFUN([AC_PACKAGE_CHECK_LTO],
AC_SUBST(lto_cflags)
AC_SUBST(lto_ldflags)
])
+
+AC_DEFUN([AC_NEED_INTERNAL_STATX],
+ [ AC_CHECK_TYPE(struct statx,
+ [
+ AC_CHECK_MEMBER(struct statx.stx_change_attr,
+ ,
+ need_internal_statx=yes,
+ [#include <linux/stat.h>]
+ )
+ ],,
+ [#include <linux/stat.h>]
+ )
+ AC_SUBST(need_internal_statx)
+ ])