]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
parisc: use generic sys_fanotify_mark implementation
authorArnd Bergmann <arnd@arndb.de>
Fri, 7 Jun 2024 11:40:45 +0000 (13:40 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:33:54 +0000 (09:33 +0200)
[ Upstream commit 403f17a330732a666ae793f3b15bc75bb5540524 ]

The sys_fanotify_mark() syscall on parisc uses the reverse word order
for the two halves of the 64-bit argument compared to all syscalls on
all 32-bit architectures. As far as I can tell, the problem is that
the function arguments on parisc are sorted backwards (26, 25, 24, 23,
...) compared to everyone else, so the calling conventions of using an
even/odd register pair in native word order result in the lower word
coming first in function arguments, matching the expected behavior
on little-endian architectures. The system call conventions however
ended up matching what the other 32-bit architectures do.

A glibc cleanup in 2020 changed the userspace behavior in a way that
handles all architectures consistently, but this inadvertently broke
parisc32 by changing to the same method as everyone else.

The change made it into glibc-2.35 and subsequently into debian 12
(bookworm), which is the latest stable release. This means we
need to choose between reverting the glibc change or changing the
kernel to match it again, but either hange will leave some systems
broken.

Pick the option that is more likely to help current and future
users and change the kernel to match current glibc. This also
means the behavior is now consistent across architectures, but
it breaks running new kernels with old glibc builds before 2.35.

Link: https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=d150181d73d9
Link: https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/arch/parisc/kernel/sys_parisc.c?h=57b1dfbd5b4a39d
Cc: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Tested-by: Helge Deller <deller@gmx.de>
Acked-by: Helge Deller <deller@gmx.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
arch/parisc/Kconfig
arch/parisc/kernel/sys_parisc32.c
arch/parisc/kernel/syscalls/syscall.tbl

index 4adeb73d5885cc7b3acb37f4a177cd16b2fd681c..722e83edad2820c79f473cfa2b447da1c3b489d1 100644 (file)
@@ -14,6 +14,7 @@ config PARISC
        select ARCH_HAS_UBSAN_SANITIZE_ALL
        select ARCH_HAS_PTE_SPECIAL
        select ARCH_NO_SG_CHAIN
+       select ARCH_SPLIT_ARG64 if !64BIT
        select ARCH_SUPPORTS_HUGETLBFS if PA20
        select ARCH_SUPPORTS_MEMORY_FAILURE
        select ARCH_STACKWALK
index 2a12a547b447bdff42fc26724cdd8ec2a5b34a4f..826c8e51b5853bc14a6bbf1d1d08fa618c0cf651 100644 (file)
@@ -23,12 +23,3 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
        current->comm, current->pid, r20);
     return -ENOSYS;
 }
-
-asmlinkage long sys32_fanotify_mark(compat_int_t fanotify_fd, compat_uint_t flags,
-       compat_uint_t mask0, compat_uint_t mask1, compat_int_t dfd,
-       const char  __user * pathname)
-{
-       return sys_fanotify_mark(fanotify_fd, flags,
-                       ((__u64)mask1 << 32) | mask0,
-                        dfd, pathname);
-}
index 47b3bb90080dee4fc853b48b70092e1d7d6e2cd0..73f560e309573a943d81452cdc87bb3759222829 100644 (file)
 320    common  accept4                 sys_accept4
 321    common  prlimit64               sys_prlimit64
 322    common  fanotify_init           sys_fanotify_init
-323    common  fanotify_mark           sys_fanotify_mark               sys32_fanotify_mark
+323    common  fanotify_mark           sys_fanotify_mark               compat_sys_fanotify_mark
 324    32      clock_adjtime           sys_clock_adjtime32
 324    64      clock_adjtime           sys_clock_adjtime
 325    common  name_to_handle_at       sys_name_to_handle_at