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 scripts (1 of 9 files). Show all
Unified · Split
| @@ -99,6 +99,11 @@ cat << EOF · 98 unmodified lines | |||
| 99 | #define __IGNORE_setfsuid32 | 99 | #define __IGNORE_setfsuid32 |
| 100 | #define __IGNORE_setfsgid32 | 100 | #define __IGNORE_setfsgid32 |
| 101 | 101 | ||
| 102 | /* sync_file_range had a stupid ABI. Allow sync_file_range2 instead */ | ||
| 103 | #ifdef __NR_sync_file_range2 | ||
| 104 | #define __IGNORE_sync_file_range | ||
| 105 | #endif | ||
| 106 | |||
| 102 | /* Unmerged syscalls for AFS, STREAMS, etc. */ | 107 | /* Unmerged syscalls for AFS, STREAMS, etc. */ |
| 103 | #define __IGNORE_afs_syscall | 108 | #define __IGNORE_afs_syscall |
| 104 | #define __IGNORE_getpmsg | 109 | #define __IGNORE_getpmsg |