]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: add support for atomic write statx fields
authorCatherine Hoang <catherine.hoang@oracle.com>
Wed, 20 Nov 2024 02:35:44 +0000 (18:35 -0800)
committerAndrey Albershteyn <aalbersh@kernel.org>
Thu, 21 Nov 2024 13:43:58 +0000 (14:43 +0100)
Add support for the new atomic_write_unit_min, atomic_write_unit_max, and
atomic_write_segments_max fields in statx for xfs_io. In order to support builds
against old kernel headers, define our own internal statx structs. If the
system's struct statx does not have the required atomic write fields, override
the struct definitions with the internal definitions in statx.h.

Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: John Garry <john.g.garry@oracle.com>
configure.ac
include/builddefs.in
io/stat.c
io/statx.h
m4/package_libcdev.m4

index dc587f39b805330332a4b9ccffb2d2182927352c..6d8000d1acfc41db3335519980bb53cf04293314 100644 (file)
@@ -157,6 +157,7 @@ AC_HAVE_COPY_FILE_RANGE
 AC_NEED_INTERNAL_FSXATTR
 AC_NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG
 AC_NEED_INTERNAL_FSCRYPT_POLICY_V2
+AC_NEED_INTERNAL_STATX
 AC_HAVE_GETFSMAP
 AC_HAVE_MAP_SYNC
 AC_HAVE_DEVMAPPER
index 1cbace071108dd1d2affe9476b4b2030ede56115..ac43b6412c8cbb43407186bda84d8be6d4e052b7 100644 (file)
@@ -98,6 +98,7 @@ HAVE_COPY_FILE_RANGE = @have_copy_file_range@
 NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@
 NEED_INTERNAL_FSCRYPT_ADD_KEY_ARG = @need_internal_fscrypt_add_key_arg@
 NEED_INTERNAL_FSCRYPT_POLICY_V2 = @need_internal_fscrypt_policy_v2@
+NEED_INTERNAL_STATX = @need_internal_statx@
 HAVE_GETFSMAP = @have_getfsmap@
 HAVE_MAP_SYNC = @have_map_sync@
 HAVE_DEVMAPPER = @have_devmapper@
@@ -132,6 +133,9 @@ endif
 ifeq ($(NEED_INTERNAL_FSCRYPT_POLICY_V2),yes)
 PCFLAGS+= -DOVERRIDE_SYSTEM_FSCRYPT_POLICY_V2
 endif
+ifeq ($(NEED_INTERNAL_STATX),yes)
+PCFLAGS+= -DOVERRIDE_SYSTEM_STATX
+endif
 ifeq ($(HAVE_GETFSMAP),yes)
 PCFLAGS+= -DHAVE_GETFSMAP
 endif
index 0f5618f63180e2ad8d1394039b6fe0c5bca1b5e7..326f2822e276b836a3e4862ddbfb617c76475abe 100644 (file)
--- a/io/stat.c
+++ b/io/stat.c
@@ -6,6 +6,10 @@
  * Portions of statx support written by David Howells (dhowells@redhat.com)
  */
 
+#ifdef OVERRIDE_SYSTEM_STATX
+#define statx sys_statx
+#endif
+
 #include "command.h"
 #include "input.h"
 #include "init.h"
@@ -347,6 +351,9 @@ 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.atomic_write_unit_min = %u\n", stx->stx_atomic_write_unit_min);
+       printf("stat.atomic_write_unit_max = %u\n", stx->stx_atomic_write_unit_max);
+       printf("stat.atomic_write_segments_max = %u\n", stx->stx_atomic_write_segments_max);
        return 0;
 }
 
index c6625ac431bfc9ffe2b17f3cac958bc92980488b..347f6d08210f83521947072352e7b05af15f8b74 100644 (file)
@@ -61,6 +61,7 @@ struct statx_timestamp {
        __s32   tv_nsec;
        __s32   __reserved;
 };
+#endif
 
 /*
  * Structures for the extended file attribute retrieval system call
@@ -99,6 +100,8 @@ struct statx_timestamp {
  * will have values installed for compatibility purposes so that stat() and
  * co. can be emulated in userspace.
  */
+#ifdef OVERRIDE_SYSTEM_STATX
+#undef statx
 struct statx {
        /* 0x00 */
        __u32   stx_mask;       /* What results were written [uncond] */
@@ -126,10 +129,23 @@ 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_subvol;     /* Subvolume identifier */
+       __u32   stx_atomic_write_unit_min;      /* Min atomic write unit in bytes */
+       __u32   stx_atomic_write_unit_max;      /* Max atomic write unit in bytes */
+       /* 0xb0 */
+       __u32   stx_atomic_write_segments_max;  /* Max atomic write segment count */
+       __u32   __spare1[1];
+       /* 0xb8 */
+       __u64   __spare3[9];    /* Spare space for future expansion */
        /* 0x100 */
 };
+#endif
 
+#ifndef STATX_TYPE
 /*
  * Flags to be stx_mask
  *
@@ -174,4 +190,9 @@ struct statx {
 #define STATX_ATTR_AUTOMOUNT           0x00001000 /* Dir: Automount trigger */
 
 #endif /* STATX_TYPE */
+
+#ifndef STATX_WRITE_ATOMIC
+#define STATX_WRITE_ATOMIC     0x00010000U     /* Want/got atomic_write_* fields */
+#endif
+
 #endif /* XFS_IO_STATX_H */
index 13cb5156d794f7849ac82f61df23e203570a94f1..6db1177350b64358e55cbaa08bc1e17c37c4b318 100644 (file)
@@ -98,6 +98,26 @@ AC_DEFUN([AC_NEED_INTERNAL_FSCRYPT_POLICY_V2],
     AC_SUBST(need_internal_fscrypt_policy_v2)
   ])
 
+#
+# Check if we need to override the system struct statx with
+# the internal definition.  This /only/ happens if the system
+# actually defines struct statx /and/ the system definition
+# is missing certain fields.
+#
+AC_DEFUN([AC_NEED_INTERNAL_STATX],
+  [ AC_CHECK_TYPE(struct statx,
+      [
+        AC_CHECK_MEMBER(struct statx.stx_atomic_write_unit_min,
+          ,
+          need_internal_statx=yes,
+          [#include <linux/stat.h>]
+        )
+      ],,
+      [#include <linux/stat.h>]
+    )
+    AC_SUBST(need_internal_statx)
+  ])
+
 #
 # Check if we have a FS_IOC_GETFSMAP ioctl (Linux)
 #