Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

sh: rework sync_file_range ABI

The unusual function calling conventions on SuperH ended up causing
sync_file_range to have the wrong argument order, with the 'flags'
argument getting sorted before 'nbytes' by the compiler.

In userspace, I found that musl, glibc, uclibc and strace all expect the
normal calling conventions with 'nbytes' last, so changing the kernel
to match them should make all of those work.

In order to be able to also fix libc implementations to work with existing
kernels, they need to be able to tell which ABI is used. An easy way
to do this is to add yet another system call using the sync_file_range2
ABI that works the same on all architectures.

Old user binaries can now work on new kernels, and new binaries can
try the new sync_file_range2() to work with new kernels or fall back
to the old sync_file_range() version if that doesn't exist.

Cc: stable@vger.kernel.org
Fixes: 75c92acdd5b1 ("sh: Wire up new syscalls.")
Acked-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+13 -1
+11
arch/sh/kernel/sys_sh32.c
··· 59 59 (u64)len0 << 32 | len1, advice); 60 60 #endif 61 61 } 62 + 63 + /* 64 + * swap the arguments the way that libc wants them instead of 65 + * moving flags ahead of the 64-bit nbytes argument 66 + */ 67 + SYSCALL_DEFINE6(sh_sync_file_range6, int, fd, SC_ARG64(offset), 68 + SC_ARG64(nbytes), unsigned int, flags) 69 + { 70 + return ksys_sync_file_range(fd, SC_VAL64(loff_t, offset), 71 + SC_VAL64(loff_t, nbytes), flags); 72 + }
+2 -1
arch/sh/kernel/syscalls/syscall.tbl
··· 321 321 311 common set_robust_list sys_set_robust_list 322 322 312 common get_robust_list sys_get_robust_list 323 323 313 common splice sys_splice 324 - 314 common sync_file_range sys_sync_file_range 324 + 314 common sync_file_range sys_sh_sync_file_range6 325 325 315 common tee sys_tee 326 326 316 common vmsplice sys_vmsplice 327 327 317 common move_pages sys_move_pages ··· 395 395 385 common pkey_alloc sys_pkey_alloc 396 396 386 common pkey_free sys_pkey_free 397 397 387 common rseq sys_rseq 398 + 388 common sync_file_range2 sys_sync_file_range2 398 399 # room for arch specific syscalls 399 400 393 common semget sys_semget 400 401 394 common semctl sys_semctl