Index: sys/amd64/linux/linux_proto.h =================================================================== --- sys/amd64/linux/linux_proto.h +++ sys/amd64/linux/linux_proto.h @@ -1435,7 +1435,10 @@ syscallarg_t dummy; }; struct linux_fchmodat2_args { - syscallarg_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; + char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; struct linux_map_shadow_stack_args { syscallarg_t dummy; @@ -2058,7 +2061,7 @@ #define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL #define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL #define LINUX_SYS_AUE_linux_cachestat AUE_NULL -#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL +#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT #define LINUX_SYS_AUE_linux_map_shadow_stack AUE_NULL #undef PAD_ Index: sys/amd64/linux/linux_sysent.c =================================================================== --- sys/amd64/linux/linux_sysent.c +++ sys/amd64/linux/linux_sysent.c @@ -466,6 +466,6 @@ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */ - { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ + { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_map_shadow_stack, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 453 = linux_map_shadow_stack */ }; Index: sys/amd64/linux/linux_systrace_args.c =================================================================== --- sys/amd64/linux/linux_systrace_args.c +++ sys/amd64/linux/linux_systrace_args.c @@ -2805,7 +2805,12 @@ } /* linux_fchmodat2 */ case 452: { - *n_args = 0; + struct linux_fchmodat2_args *p = params; + iarg[a++] = p->dfd; /* l_int */ + uarg[a++] = (intptr_t)p->filename; /* const char * */ + iarg[a++] = p->mode; /* l_mode_t */ + iarg[a++] = p->flags; /* l_uint */ + *n_args = 4; break; } /* linux_map_shadow_stack */ @@ -7294,6 +7299,22 @@ break; /* linux_fchmodat2 */ case 452: + switch (ndx) { + case 0: + p = "l_int"; + break; + case 1: + p = "userland const char *"; + break; + case 2: + p = "l_mode_t"; + break; + case 3: + p = "l_uint"; + break; + default: + break; + }; break; /* linux_map_shadow_stack */ case 453: @@ -8823,6 +8844,9 @@ case 451: /* linux_fchmodat2 */ case 452: + if (ndx == 0 || ndx == 1) + p = "int"; + break; /* linux_map_shadow_stack */ case 453: default: Index: sys/amd64/linux/syscalls.master =================================================================== --- sys/amd64/linux/syscalls.master +++ sys/amd64/linux/syscalls.master @@ -2187,8 +2187,13 @@ int linux_cachestat(void); } ; Linux 6.6: -452 AUE_NULL STD { - int linux_fchmodat2(void); +452 AUE_FCHMODAT STD { + int linux_fchmodat2( + l_int dfd, + const char *filename, + l_mode_t mode, + l_uint flags + ); } 453 AUE_NULL STD { int linux_map_shadow_stack(void); Index: sys/amd64/linux32/linux32_proto.h =================================================================== --- sys/amd64/linux32/linux32_proto.h +++ sys/amd64/linux32/linux32_proto.h @@ -1736,7 +1736,10 @@ syscallarg_t dummy; }; struct linux_fchmodat2_args { - syscallarg_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; + char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; int linux_exit(struct thread *, struct linux_exit_args *); int linux_fork(struct thread *, struct linux_fork_args *); @@ -2485,7 +2488,7 @@ #define LINUX32_SYS_AUE_linux_futex_waitv AUE_NULL #define LINUX32_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL #define LINUX32_SYS_AUE_linux_cachestat AUE_NULL -#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_NULL +#define LINUX32_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT #undef PAD_ #undef PADL_ Index: sys/amd64/linux32/linux32_sysent.c =================================================================== --- sys/amd64/linux32/linux32_sysent.c +++ sys/amd64/linux32/linux32_sysent.c @@ -467,5 +467,5 @@ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */ - { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ + { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ }; Index: sys/amd64/linux32/linux32_systrace_args.c =================================================================== --- sys/amd64/linux32/linux32_systrace_args.c +++ sys/amd64/linux32/linux32_systrace_args.c @@ -3321,7 +3321,12 @@ } /* linux_fchmodat2 */ case 452: { - *n_args = 0; + struct linux_fchmodat2_args *p = params; + iarg[a++] = p->dfd; /* l_int */ + uarg[a++] = (intptr_t)p->filename; /* const char * */ + iarg[a++] = p->mode; /* l_mode_t */ + iarg[a++] = p->flags; /* l_uint */ + *n_args = 4; break; } default: @@ -8677,6 +8682,22 @@ break; /* linux_fchmodat2 */ case 452: + switch (ndx) { + case 0: + p = "l_int"; + break; + case 1: + p = "userland const char *"; + break; + case 2: + p = "l_mode_t"; + break; + case 3: + p = "l_uint"; + break; + default: + break; + }; break; default: break; @@ -10493,6 +10514,9 @@ case 451: /* linux_fchmodat2 */ case 452: + if (ndx == 0 || ndx == 1) + p = "int"; + break; default: break; }; Index: sys/amd64/linux32/syscalls.master =================================================================== --- sys/amd64/linux32/syscalls.master +++ sys/amd64/linux32/syscalls.master @@ -2617,8 +2617,13 @@ int linux_cachestat(void); } ; Linux 6.6: -452 AUE_NULL STD { - int linux_fchmodat2(void); +452 AUE_FCHMODAT STD { + int linux_fchmodat2( + l_int dfd, + const char *filename, + l_mode_t mode, + l_uint flags + ); } ; vim: syntax=off Index: sys/arm64/linux/linux_proto.h =================================================================== --- sys/arm64/linux/linux_proto.h +++ sys/arm64/linux/linux_proto.h @@ -1245,7 +1245,10 @@ syscallarg_t dummy; }; struct linux_fchmodat2_args { - syscallarg_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; + char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; int linux_setxattr(struct thread *, struct linux_setxattr_args *); int linux_lsetxattr(struct thread *, struct linux_lsetxattr_args *); @@ -1766,7 +1769,7 @@ #define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL #define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL #define LINUX_SYS_AUE_linux_cachestat AUE_NULL -#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL +#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT #undef PAD_ #undef PADL_ Index: sys/arm64/linux/linux_sysent.c =================================================================== --- sys/arm64/linux/linux_sysent.c +++ sys/arm64/linux/linux_sysent.c @@ -466,5 +466,5 @@ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */ - { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ + { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ }; Index: sys/arm64/linux/linux_systrace_args.c =================================================================== --- sys/arm64/linux/linux_systrace_args.c +++ sys/arm64/linux/linux_systrace_args.c @@ -2427,7 +2427,12 @@ } /* linux_fchmodat2 */ case 452: { - *n_args = 0; + struct linux_fchmodat2_args *p = params; + iarg[a++] = p->dfd; /* l_int */ + uarg[a++] = (intptr_t)p->filename; /* const char * */ + iarg[a++] = p->mode; /* l_mode_t */ + iarg[a++] = p->flags; /* l_uint */ + *n_args = 4; break; } default: @@ -6364,6 +6369,22 @@ break; /* linux_fchmodat2 */ case 452: + switch (ndx) { + case 0: + p = "l_int"; + break; + case 1: + p = "userland const char *"; + break; + case 2: + p = "l_mode_t"; + break; + case 3: + p = "l_uint"; + break; + default: + break; + }; break; default: break; @@ -7675,6 +7696,9 @@ case 451: /* linux_fchmodat2 */ case 452: + if (ndx == 0 || ndx == 1) + p = "int"; + break; default: break; }; Index: sys/arm64/linux/syscalls.master =================================================================== --- sys/arm64/linux/syscalls.master +++ sys/arm64/linux/syscalls.master @@ -1865,8 +1865,13 @@ int linux_cachestat(void); } ; Linux 6.6: -452 AUE_NULL STD { - int linux_fchmodat2(void); +452 AUE_FCHMODAT STD { + int linux_fchmodat2( + l_int dfd, + const char *filename, + l_mode_t mode, + l_uint flags + ); } ; vim: syntax=off Index: sys/compat/linux/linux_dummy.c =================================================================== --- sys/compat/linux/linux_dummy.c +++ sys/compat/linux/linux_dummy.c @@ -154,5 +154,3 @@ DUMMY(set_mempolicy_home_node); /* Linux 6.5: */ DUMMY(cachestat); -/* Linux 6.6: */ -DUMMY(fchmodat2); Index: sys/compat/linux/linux_file.h =================================================================== --- sys/compat/linux/linux_file.h +++ sys/compat/linux/linux_file.h @@ -42,6 +42,12 @@ * have such facility (automount), we can simply ignore this flag. */ #define LINUX_AT_EMPTY_PATH 0x1000 + /* + * statx-specific flags for sync behavior with remote filesystems. + */ +#define LINUX_AT_STATX_FORCE_SYNC 0x2000 +#define LINUX_AT_STATX_DONT_SYNC 0x4000 +#define LINUX_AT_RECURSIVE 0x8000 /* * posix_fadvise advice Index: sys/compat/linux/linux_file.c =================================================================== --- sys/compat/linux/linux_file.c +++ sys/compat/linux/linux_file.c @@ -737,6 +737,25 @@ args->mode, 0)); } +int +linux_fchmodat2(struct thread *td, struct linux_fchmodat2_args *args) +{ + int dfd, flags; + + if ((args->flags & ~(LINUX_AT_SYMLINK_NOFOLLOW | LINUX_AT_EMPTY_PATH)) != 0) + return (EINVAL); + + flags = 0; + if (args->flags & LINUX_AT_SYMLINK_NOFOLLOW) + flags |= AT_SYMLINK_NOFOLLOW; + if (args->flags & LINUX_AT_EMPTY_PATH) + flags |= AT_EMPTY_PATH; + + dfd = (args->dfd == LINUX_AT_FDCWD) ? AT_FDCWD : args->dfd; + return (kern_fchmodat(td, dfd, args->filename, UIO_USERSPACE, + args->mode, flags)); +} + #ifdef LINUX_LEGACY_SYSCALLS int linux_mkdir(struct thread *td, struct linux_mkdir_args *args) Index: sys/compat/linux/linux_misc.h =================================================================== --- sys/compat/linux/linux_misc.h +++ sys/compat/linux/linux_misc.h @@ -59,6 +59,8 @@ #define LINUX_PR_CAPBSET_READ 23 #define LINUX_PR_SET_CHILD_SUBREAPER 36 #define LINUX_PR_SET_NO_NEW_PRIVS 38 +#define LINUX_PR_SET_THP_DISABLE 41 /* Disable transparent huge pages */ +#define LINUX_PR_GET_THP_DISABLE 42 /* Get THP disable status */ #define LINUX_PR_SET_PTRACER 1499557217 #define LINUX_MAX_COMM_LEN 16 /* Maximum length of the process name. */ Index: sys/compat/linux/linux_misc.c =================================================================== --- sys/compat/linux/linux_misc.c +++ sys/compat/linux/linux_misc.c @@ -1809,6 +1809,12 @@ error = kern_procctl(td, P_PID, p->p_pid, PROC_NO_NEW_PRIVS_CTL, &arg); break; + /* On FreeBSD huge pages are never disabled */ + case LINUX_PR_SET_THP_DISABLE: + break; + case LINUX_PR_GET_THP_DISABLE: + td->td_retval[0] = 0; + break; case LINUX_PR_SET_PTRACER: linux_msg(td, "unsupported prctl PR_SET_PTRACER"); error = EINVAL; Index: sys/compat/linux/linux_stats.c =================================================================== --- sys/compat/linux/linux_stats.c +++ sys/compat/linux/linux_stats.c @@ -495,7 +495,9 @@ int flags, unsupported; unsupported = linux_flags & ~(LINUX_AT_SYMLINK_NOFOLLOW | - LINUX_AT_EMPTY_PATH | LINUX_AT_NO_AUTOMOUNT); + LINUX_AT_EMPTY_PATH | LINUX_AT_NO_AUTOMOUNT | + LINUX_AT_STATX_FORCE_SYNC | LINUX_AT_STATX_DONT_SYNC | + LINUX_AT_RECURSIVE); if (unsupported != 0) { *out_flags = unsupported; return (false); Index: sys/i386/linux/linux_proto.h =================================================================== --- sys/i386/linux/linux_proto.h +++ sys/i386/linux/linux_proto.h @@ -1730,7 +1730,10 @@ syscallarg_t dummy; }; struct linux_fchmodat2_args { - syscallarg_t dummy; + char dfd_l_[PADL_(l_int)]; l_int dfd; char dfd_r_[PADR_(l_int)]; + char filename_l_[PADL_(const char *)]; const char * filename; char filename_r_[PADR_(const char *)]; + char mode_l_[PADL_(l_mode_t)]; l_mode_t mode; char mode_r_[PADR_(l_mode_t)]; + char flags_l_[PADL_(l_uint)]; l_uint flags; char flags_r_[PADR_(l_uint)]; }; int linux_exit(struct thread *, struct linux_exit_args *); int linux_fork(struct thread *, struct linux_fork_args *); @@ -2483,7 +2486,7 @@ #define LINUX_SYS_AUE_linux_futex_waitv AUE_NULL #define LINUX_SYS_AUE_linux_set_mempolicy_home_node AUE_NULL #define LINUX_SYS_AUE_linux_cachestat AUE_NULL -#define LINUX_SYS_AUE_linux_fchmodat2 AUE_NULL +#define LINUX_SYS_AUE_linux_fchmodat2 AUE_FCHMODAT #undef PAD_ #undef PADL_ Index: sys/i386/linux/linux_sysent.c =================================================================== --- sys/i386/linux/linux_sysent.c +++ sys/i386/linux/linux_sysent.c @@ -466,5 +466,5 @@ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_futex_waitv, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 449 = linux_futex_waitv */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_set_mempolicy_home_node, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 450 = linux_set_mempolicy_home_node */ { .sy_narg = 0, .sy_call = (sy_call_t *)linux_cachestat, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 451 = linux_cachestat */ - { .sy_narg = 0, .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ + { .sy_narg = AS(linux_fchmodat2_args), .sy_call = (sy_call_t *)linux_fchmodat2, .sy_auevent = AUE_FCHMODAT, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 452 = linux_fchmodat2 */ }; Index: sys/i386/linux/linux_systrace_args.c =================================================================== --- sys/i386/linux/linux_systrace_args.c +++ sys/i386/linux/linux_systrace_args.c @@ -3352,7 +3352,12 @@ } /* linux_fchmodat2 */ case 452: { - *n_args = 0; + struct linux_fchmodat2_args *p = params; + iarg[a++] = p->dfd; /* l_int */ + uarg[a++] = (intptr_t)p->filename; /* const char * */ + iarg[a++] = p->mode; /* l_mode_t */ + iarg[a++] = p->flags; /* l_uint */ + *n_args = 4; break; } default: @@ -8733,6 +8738,22 @@ break; /* linux_fchmodat2 */ case 452: + switch (ndx) { + case 0: + p = "l_int"; + break; + case 1: + p = "userland const char *"; + break; + case 2: + p = "l_mode_t"; + break; + case 3: + p = "l_uint"; + break; + default: + break; + }; break; default: break; @@ -10573,6 +10594,9 @@ case 451: /* linux_fchmodat2 */ case 452: + if (ndx == 0 || ndx == 1) + p = "int"; + break; default: break; }; Index: sys/i386/linux/syscalls.master =================================================================== --- sys/i386/linux/syscalls.master +++ sys/i386/linux/syscalls.master @@ -2629,8 +2629,13 @@ int linux_cachestat(void); } ; Linux 6.6: -452 AUE_NULL STD { - int linux_fchmodat2(void); +452 AUE_FCHMODAT STD { + int linux_fchmodat2( + l_int dfd, + const char *filename, + l_mode_t mode, + l_uint flags + ); } ; vim: syntax=off