diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 1ac87b32badd78..c3ed6a976926fd 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -3496,7 +3496,7 @@ features: Maximum optimized size for direct I/O with torn-write protection. .. availability:: Linux >= 4.11 with glibc >= 2.28 and build-time kernel - userspace API headers >= 6.11. + userspace API headers >= 6.16. .. attribute:: stx_atomic_write_segments_max diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index e2b7146237feb6..32a25e1970d08b 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3369,7 +3369,7 @@ static PyMemberDef pystatx_result_members[] = { MM(stx_atomic_write_segments_max, Py_T_UINT, atomic_write_segments_max, "maximum iovecs for direct I/O with torn-write protection"), #endif -#if 0 +#ifdef HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MAX_OPT MM(stx_atomic_write_unit_max_opt, Py_T_UINT, atomic_write_unit_max_opt, "maximum optimized size for direct I/O with torn-write protection"), #endif diff --git a/configure b/configure index 28005cd1924be7..267981250cd7e2 100755 --- a/configure +++ b/configure @@ -25133,6 +25133,21 @@ printf "%s\n" "#define HAVE_SIGINFO_T_SI_BAND 1" >>confdefs.h fi +if test "$ac_cv_func_statx" = yes; then + # stx_atomic_write_unit_max_opt was added in Linux 6.16, but is controlled by + # the STATX_WRITE_ATOMIC mask bit added in Linux 6.11, so having the mask bit + # doesn't imply having the member. + ac_fn_c_check_member "$LINENO" "struct statx" "stx_atomic_write_unit_max_opt" "ac_cv_member_struct_statx_stx_atomic_write_unit_max_opt" "$ac_includes_default" +if test "x$ac_cv_member_struct_statx_stx_atomic_write_unit_max_opt" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MAX_OPT 1" >>confdefs.h + + +fi + +fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5 printf %s "checking for time.h that defines altzone... " >&6; } if test ${ac_cv_header_time_altzone+y} diff --git a/configure.ac b/configure.ac index d20f6f8c40abeb..382591952ef68f 100644 --- a/configure.ac +++ b/configure.ac @@ -5819,6 +5819,13 @@ AC_CHECK_MEMBERS([struct passwd.pw_gecos, struct passwd.pw_passwd], [], [], [[ # Issue #21085: In Cygwin, siginfo_t does not have si_band field. AC_CHECK_MEMBERS([siginfo_t.si_band], [], [], [[@%:@include ]]) +if test "$ac_cv_func_statx" = yes; then + # stx_atomic_write_unit_max_opt was added in Linux 6.16, but is controlled by + # the STATX_WRITE_ATOMIC mask bit added in Linux 6.11, so having the mask bit + # doesn't imply having the member. + AC_CHECK_MEMBERS([struct statx.stx_atomic_write_unit_max_opt]) +fi + AC_CACHE_CHECK([for time.h that defines altzone], [ac_cv_header_time_altzone], [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[return altzone;]])], [ac_cv_header_time_altzone=yes], diff --git a/pyconfig.h.in b/pyconfig.h.in index 611408d88f05b5..092f96e7152e11 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -1330,6 +1330,10 @@ /* Define to 1 if 'pw_passwd' is a member of 'struct passwd'. */ #undef HAVE_STRUCT_PASSWD_PW_PASSWD +/* Define to 1 if 'stx_atomic_write_unit_max_opt' is a member of 'struct + statx'. */ +#undef HAVE_STRUCT_STATX_STX_ATOMIC_WRITE_UNIT_MAX_OPT + /* Define to 1 if 'st_birthtime' is a member of 'struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BIRTHTIME