Not all the world is an i386. Many architectures need 64-bit arguments to be aligned in suitable pairs of registers, and the original sys_sync_file_range(int, loff_t, loff_t, int) was therefore wasting an argument register for padding after the first integer. Since we don't normally have more than 6 arguments for system calls, that left no room for the final argument on some architectures. Fix this by introducing sys_sync_file_range2(int, int, loff_t, loff_t) which all fits nicely. In fact, ARM already had that, but called it sys_arm_sync_file_range. Move it to fs/sync.c and rename it, then implement the needed compatibility routine. And stop the missing syscall check from bitching about the absence of sys_sync_file_range() if we've implemented sys_sync_file_range2() instead. Tested on PPC32 and with 32-bit and 64-bit userspace on PPC64.
Showing the changes to include (4 of 9 files). Show all
Unified · Split
| @@ -367,6 +367,7 @@ · 366 unmodified lines | ||
| 367 | 367 | #define __NR_get_robust_list (__NR_SYSCALL_BASE+339) |
| 368 | 368 | #define __NR_splice (__NR_SYSCALL_BASE+340) |
| 369 | 369 | #define __NR_arm_sync_file_range (__NR_SYSCALL_BASE+341) |
| 370 | +#define __NR_sync_file_range2 __NR_arm_sync_file_range | |
| 370 | 371 | #define __NR_tee (__NR_SYSCALL_BASE+342) |
| 371 | 372 | #define __NR_vmsplice (__NR_SYSCALL_BASE+343) |
| 372 | 373 | #define __NR_move_pages (__NR_SYSCALL_BASE+344) |
| @@ -311,3 +311,4 @@ COMPAT_SYS_SPU(utimensat) · 310 unmodified lines | ||
| 311 | 311 | COMPAT_SYS_SPU(signalfd) |
| 312 | 312 | COMPAT_SYS_SPU(timerfd) |
| 313 | 313 | SYSCALL_SPU(eventfd) |
| 314 | +COMPAT_SYS_SPU(sync_file_range2) | |
| @@ -330,10 +330,11 @@ · 329 unmodified lines | ||
| 330 | 330 | #define __NR_signalfd 305 |
| 331 | 331 | #define __NR_timerfd 306 |
| 332 | 332 | #define __NR_eventfd 307 |
| 333 | +#define __NR_sync_file_range2 308 | |
| 333 | 334 | |
| 334 | 335 | #ifdef __KERNEL__ |
| 335 | 336 | |
| 336 | −#define __NR_syscalls 308 | |
| 337 | +#define __NR_syscalls 309 | |
| 337 | 338 | |
| 338 | 339 | #define __NR__exit __NR_exit |
| 339 | 340 | #define NR_syscalls __NR_syscalls |
| @@ -598,6 +598,8 @@ asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags); · 597 unmodified lines | ||
| 598 | 598 | |
| 599 | 599 | asmlinkage long sys_sync_file_range(int fd, loff_t offset, loff_t nbytes, |
| 600 | 600 | unsigned int flags); |
| 601 | +asmlinkage long sys_sync_file_range2(int fd, unsigned int flags, | |
| 602 | + loff_t offset, loff_t nbytes); | |
| 601 | 603 | asmlinkage long sys_get_robust_list(int pid, |
| 602 | 604 | struct robust_list_head __user * __user *head_ptr, |
| 603 | 605 | size_t __user *len_ptr); |