gh-83714: Check for struct statx.stx_atomic_write_unit_max_opt in configure (#140185)

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.  That's safe at
runtime because all kernels clear the reserved space in struct statx and
zero is a valid value for stx_atomic_write_unit_max_opt, and it avoids
allocating another mask bit, which are a limited resource.  But it also
means the kernel headers don't provide a way to check whether
stx_atomic_write_unit_max_opt exists, so add a configure check.
This commit is contained in:
Jeffrey Bosboom 2025-10-16 04:40:47 -07:00 committed by GitHub
parent ea4cc585cd
commit 5a31024da4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 28 additions and 2 deletions

View file

@ -3496,7 +3496,7 @@ features:
Maximum optimized size for direct I/O with torn-write protection. Maximum optimized size for direct I/O with torn-write protection.
.. availability:: Linux >= 4.11 with glibc >= 2.28 and build-time kernel .. 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 .. attribute:: stx_atomic_write_segments_max

View file

@ -3369,7 +3369,7 @@ static PyMemberDef pystatx_result_members[] = {
MM(stx_atomic_write_segments_max, Py_T_UINT, atomic_write_segments_max, MM(stx_atomic_write_segments_max, Py_T_UINT, atomic_write_segments_max,
"maximum iovecs for direct I/O with torn-write protection"), "maximum iovecs for direct I/O with torn-write protection"),
#endif #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, 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"), "maximum optimized size for direct I/O with torn-write protection"),
#endif #endif

15
configure generated vendored
View file

@ -25133,6 +25133,21 @@ printf "%s\n" "#define HAVE_SIGINFO_T_SI_BAND 1" >>confdefs.h
fi 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\n" "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5
printf %s "checking for time.h that defines altzone... " >&6; } printf %s "checking for time.h that defines altzone... " >&6; }
if test ${ac_cv_header_time_altzone+y} if test ${ac_cv_header_time_altzone+y}

View file

@ -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. # Issue #21085: In Cygwin, siginfo_t does not have si_band field.
AC_CHECK_MEMBERS([siginfo_t.si_band], [], [], [[@%:@include <signal.h>]]) AC_CHECK_MEMBERS([siginfo_t.si_band], [], [], [[@%:@include <signal.h>]])
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_CACHE_CHECK([for time.h that defines altzone], [ac_cv_header_time_altzone], [
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <time.h>]], [[return altzone;]])], AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <time.h>]], [[return altzone;]])],
[ac_cv_header_time_altzone=yes], [ac_cv_header_time_altzone=yes],

View file

@ -1330,6 +1330,10 @@
/* Define to 1 if 'pw_passwd' is a member of 'struct passwd'. */ /* Define to 1 if 'pw_passwd' is a member of 'struct passwd'. */
#undef HAVE_STRUCT_PASSWD_PW_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'. */ /* Define to 1 if 'st_birthtime' is a member of 'struct stat'. */
#undef HAVE_STRUCT_STAT_ST_BIRTHTIME #undef HAVE_STRUCT_STAT_ST_BIRTHTIME