Merge branch 'syscalls-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux

Pull removal of in-kernel calls to syscalls from Dominik Brodowski:
 "System calls are interaction points between userspace and the kernel.
  Therefore, system call functions such as sys_xyzzy() or
  compat_sys_xyzzy() should only be called from userspace via the
  syscall table, but not from elsewhere in the kernel.

  At least on 64-bit x86, it will likely be a hard requirement from
  v4.17 onwards to not call system call functions in the kernel: It is
  better to use use a different calling convention for system calls
  there, where struct pt_regs is decoded on-the-fly in a syscall wrapper
  which then hands processing over to the actual syscall function. This
  means that only those parameters which are actually needed for a
  specific syscall are passed on during syscall entry, instead of
  filling in six CPU registers with random user space content all the
  time (which may cause serious trouble down the call chain). Those
  x86-specific patches will be pushed through the x86 tree in the near
  future.

  Moreover, rules on how data may be accessed may differ between kernel
  data and user data. This is another reason why calling sys_xyzzy() is
  generally a bad idea, and -- at most -- acceptable in arch-specific
  code.

  This patchset removes all in-kernel calls to syscall functions in the
  kernel with the exception of arch/. On top of this, it cleans up the
  three places where many syscalls are referenced or prototyped, namely
  kernel/sys_ni.c, include/linux/syscalls.h and include/linux/compat.h"

* 'syscalls-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/linux: (109 commits)
  bpf: whitelist all syscalls for error injection
  kernel/sys_ni: remove {sys_,sys_compat} from cond_syscall definitions
  kernel/sys_ni: sort cond_syscall() entries
  syscalls/x86: auto-create compat_sys_*() prototypes
  syscalls: sort syscall prototypes in include/linux/compat.h
  net: remove compat_sys_*() prototypes from net/compat.h
  syscalls: sort syscall prototypes in include/linux/syscalls.h
  kexec: move sys_kexec_load() prototype to syscalls.h
  x86/sigreturn: use SYSCALL_DEFINE0
  x86: fix sys_sigreturn() return type to be long, not unsigned long
  x86/ioport: add ksys_ioperm() helper; remove in-kernel calls to sys_ioperm()
  mm: add ksys_readahead() helper; remove in-kernel calls to sys_readahead()
  mm: add ksys_mmap_pgoff() helper; remove in-kernel calls to sys_mmap_pgoff()
  mm: add ksys_fadvise64_64() helper; remove in-kernel call to sys_fadvise64_64()
  fs: add ksys_fallocate() wrapper; remove in-kernel calls to sys_fallocate()
  fs: add ksys_p{read,write}64() helpers; remove in-kernel calls to syscalls
  fs: add ksys_truncate() wrapper; remove in-kernel calls to sys_truncate()
  fs: add ksys_sync_file_range helper(); remove in-kernel calls to syscall
  kernel: add ksys_setsid() helper; remove in-kernel call to sys_setsid()
  kernel: add ksys_unshare() helper; remove in-kernel calls to sys_unshare()
  ...
This commit is contained in:
Linus Torvalds 2018-04-02 21:22:12 -07:00
commit 642e7fd233
105 changed files with 3203 additions and 1942 deletions

View File

@ -222,7 +222,7 @@ your new syscall number may get adjusted to resolve conflicts.
The file ``kernel/sys_ni.c`` provides a fallback stub implementation of each The file ``kernel/sys_ni.c`` provides a fallback stub implementation of each
system call, returning ``-ENOSYS``. Add your new system call here too:: system call, returning ``-ENOSYS``. Add your new system call here too::
cond_syscall(sys_xyzzy); COND_SYSCALL(xyzzy);
Your new kernel functionality, and the system call that controls it, should Your new kernel functionality, and the system call that controls it, should
normally be optional, so add a ``CONFIG`` option (typically to normally be optional, so add a ``CONFIG`` option (typically to
@ -487,6 +487,38 @@ patchset, for the convenience of reviewers.
The man page should be cc'ed to linux-man@vger.kernel.org The man page should be cc'ed to linux-man@vger.kernel.org
For more details, see https://www.kernel.org/doc/man-pages/patches.html For more details, see https://www.kernel.org/doc/man-pages/patches.html
Do not call System Calls in the Kernel
--------------------------------------
System calls are, as stated above, interaction points between userspace and
the kernel. Therefore, system call functions such as ``sys_xyzzy()`` or
``compat_sys_xyzzy()`` should only be called from userspace via the syscall
table, but not from elsewhere in the kernel. If the syscall functionality is
useful to be used within the kernel, needs to be shared between an old and a
new syscall, or needs to be shared between a syscall and its compatibility
variant, it should be implemented by means of a "helper" function (such as
``kern_xyzzy()``). This kernel function may then be called within the
syscall stub (``sys_xyzzy()``), the compatibility syscall stub
(``compat_sys_xyzzy()``), and/or other kernel code.
At least on 64-bit x86, it will be a hard requirement from v4.17 onwards to not
call system call functions in the kernel. It uses a different calling
convention for system calls where ``struct pt_regs`` is decoded on-the-fly in a
syscall wrapper which then hands processing over to the actual syscall function.
This means that only those parameters which are actually needed for a specific
syscall are passed on during syscall entry, instead of filling in six CPU
registers with random user space content all the time (which may cause serious
trouble down the call chain).
Moreover, rules on how data may be accessed may differ between kernel data and
user data. This is another reason why calling ``sys_xyzzy()`` is generally a
bad idea.
Exceptions to this rule are only allowed in architecture-specific overrides,
architecture-specific compatibility wrappers, or other code in arch/.
References and Sources References and Sources
---------------------- ----------------------

View File

@ -189,7 +189,7 @@ SYSCALL_DEFINE6(osf_mmap, unsigned long, addr, unsigned long, len,
goto out; goto out;
if (off & ~PAGE_MASK) if (off & ~PAGE_MASK)
goto out; goto out;
ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); ret = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
out: out:
return ret; return ret;
} }

View File

@ -35,5 +35,5 @@
asmlinkage long sys_arm_fadvise64_64(int fd, int advice, asmlinkage long sys_arm_fadvise64_64(int fd, int advice,
loff_t offset, loff_t len) loff_t offset, loff_t len)
{ {
return sys_fadvise64_64(fd, offset, len, advice); return ksys_fadvise64_64(fd, offset, len, advice);
} }

View File

@ -34,7 +34,7 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
if (offset_in_page(off) != 0) if (offset_in_page(off) != 0)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
} }
SYSCALL_DEFINE1(arm64_personality, unsigned int, personality) SYSCALL_DEFINE1(arm64_personality, unsigned int, personality)

View File

@ -139,7 +139,7 @@ int ia64_mmap_check(unsigned long addr, unsigned long len,
asmlinkage unsigned long asmlinkage unsigned long
sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff) sys_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, long pgoff)
{ {
addr = sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
if (!IS_ERR((void *) addr)) if (!IS_ERR((void *) addr))
force_successful_syscall_return(); force_successful_syscall_return();
return addr; return addr;
@ -151,7 +151,7 @@ sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, lo
if (offset_in_page(off) != 0) if (offset_in_page(off) != 0)
return -EINVAL; return -EINVAL;
addr = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); addr = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
if (!IS_ERR((void *) addr)) if (!IS_ERR((void *) addr))
force_successful_syscall_return(); force_successful_syscall_return();
return addr; return addr;

View File

@ -46,7 +46,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
* so we need to shift the argument down by 1; m68k mmap64(3) * so we need to shift the argument down by 1; m68k mmap64(3)
* (in libc) expects the last argument of mmap2 in 4Kb units. * (in libc) expects the last argument of mmap2 in 4Kb units.
*/ */
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
} }
/* Convert virtual (user) address VADDR to physical address PADDR */ /* Convert virtual (user) address VADDR to physical address PADDR */

View File

@ -40,7 +40,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
if (pgoff & ~PAGE_MASK) if (pgoff & ~PAGE_MASK)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT); return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> PAGE_SHIFT);
} }
SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,
@ -50,6 +50,6 @@ SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len,
if (pgoff & (~PAGE_MASK >> 12)) if (pgoff & (~PAGE_MASK >> 12))
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
pgoff >> (PAGE_SHIFT - 12)); pgoff >> (PAGE_SHIFT - 12));
} }

View File

@ -67,8 +67,8 @@ SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,
{ {
if (pgoff & (~PAGE_MASK >> 12)) if (pgoff & (~PAGE_MASK >> 12))
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
pgoff >> (PAGE_SHIFT-12)); pgoff >> (PAGE_SHIFT-12));
} }
#define RLIM_INFINITY32 0x7fffffff #define RLIM_INFINITY32 0x7fffffff
@ -82,13 +82,13 @@ struct rlimit32 {
SYSCALL_DEFINE4(32_truncate64, const char __user *, path, SYSCALL_DEFINE4(32_truncate64, const char __user *, path,
unsigned long, __dummy, unsigned long, a2, unsigned long, a3) unsigned long, __dummy, unsigned long, a2, unsigned long, a3)
{ {
return sys_truncate(path, merge_64(a2, a3)); return ksys_truncate(path, merge_64(a2, a3));
} }
SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy, SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy,
unsigned long, a2, unsigned long, a3) unsigned long, a2, unsigned long, a3)
{ {
return sys_ftruncate(fd, merge_64(a2, a3)); return ksys_ftruncate(fd, merge_64(a2, a3));
} }
SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high, SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high,
@ -105,13 +105,13 @@ SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high,
SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count, SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count,
unsigned long, unused, unsigned long, a4, unsigned long, a5) unsigned long, unused, unsigned long, a4, unsigned long, a5)
{ {
return sys_pread64(fd, buf, count, merge_64(a4, a5)); return ksys_pread64(fd, buf, count, merge_64(a4, a5));
} }
SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf, SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
size_t, count, u32, unused, u64, a4, u64, a5) size_t, count, u32, unused, u64, a4, u64, a5)
{ {
return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); return ksys_pwrite64(fd, buf, count, merge_64(a4, a5));
} }
SYSCALL_DEFINE1(32_personality, unsigned long, personality) SYSCALL_DEFINE1(32_personality, unsigned long, personality)
@ -131,7 +131,7 @@ SYSCALL_DEFINE1(32_personality, unsigned long, personality)
asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3, asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3,
size_t count) size_t count)
{ {
return sys_readahead(fd, merge_64(a2, a3), count); return ksys_readahead(fd, merge_64(a2, a3), count);
} }
asmlinkage long sys32_sync_file_range(int fd, int __pad, asmlinkage long sys32_sync_file_range(int fd, int __pad,
@ -139,7 +139,7 @@ asmlinkage long sys32_sync_file_range(int fd, int __pad,
unsigned long a4, unsigned long a5, unsigned long a4, unsigned long a5,
int flags) int flags)
{ {
return sys_sync_file_range(fd, return ksys_sync_file_range(fd,
merge_64(a2, a3), merge_64(a4, a5), merge_64(a2, a3), merge_64(a4, a5),
flags); flags);
} }
@ -149,7 +149,7 @@ asmlinkage long sys32_fadvise64_64(int fd, int __pad,
unsigned long a4, unsigned long a5, unsigned long a4, unsigned long a5,
int flags) int flags)
{ {
return sys_fadvise64_64(fd, return ksys_fadvise64_64(fd,
merge_64(a2, a3), merge_64(a4, a5), merge_64(a2, a3), merge_64(a4, a5),
flags); flags);
} }
@ -157,6 +157,6 @@ asmlinkage long sys32_fadvise64_64(int fd, int __pad,
asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2, asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2,
unsigned offset_a3, unsigned len_a4, unsigned len_a5) unsigned offset_a3, unsigned len_a4, unsigned len_a5)
{ {
return sys_fallocate(fd, mode, merge_64(offset_a2, offset_a3), return ksys_fallocate(fd, mode, merge_64(offset_a2, offset_a3),
merge_64(len_a4, len_a5)); merge_64(len_a4, len_a5));
} }

View File

@ -63,7 +63,8 @@ SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
{ {
if (offset & ~PAGE_MASK) if (offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); return ksys_mmap_pgoff(addr, len, prot, flags, fd,
offset >> PAGE_SHIFT);
} }
SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len, SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
@ -73,7 +74,8 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
if (pgoff & (~PAGE_MASK >> 12)) if (pgoff & (~PAGE_MASK >> 12))
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff >> (PAGE_SHIFT-12)); return ksys_mmap_pgoff(addr, len, prot, flags, fd,
pgoff >> (PAGE_SHIFT - 12));
} }
save_static_function(sys_fork); save_static_function(sys_fork);

View File

@ -270,8 +270,8 @@ asmlinkage unsigned long sys_mmap2(unsigned long addr, unsigned long len,
{ {
/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE /* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
we have. */ we have. */
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
pgoff >> (PAGE_SHIFT - 12)); pgoff >> (PAGE_SHIFT - 12));
} }
asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
@ -279,7 +279,7 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
unsigned long offset) unsigned long offset)
{ {
if (!(offset & ~PAGE_MASK)) { if (!(offset & ~PAGE_MASK)) {
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
offset >> PAGE_SHIFT); offset >> PAGE_SHIFT);
} else { } else {
return -EINVAL; return -EINVAL;
@ -292,24 +292,24 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
asmlinkage long parisc_truncate64(const char __user * path, asmlinkage long parisc_truncate64(const char __user * path,
unsigned int high, unsigned int low) unsigned int high, unsigned int low)
{ {
return sys_truncate(path, (long)high << 32 | low); return ksys_truncate(path, (long)high << 32 | low);
} }
asmlinkage long parisc_ftruncate64(unsigned int fd, asmlinkage long parisc_ftruncate64(unsigned int fd,
unsigned int high, unsigned int low) unsigned int high, unsigned int low)
{ {
return sys_ftruncate(fd, (long)high << 32 | low); return ksys_ftruncate(fd, (long)high << 32 | low);
} }
/* stubs for the benefit of the syscall_table since truncate64 and truncate /* stubs for the benefit of the syscall_table since truncate64 and truncate
* are identical on LP64 */ * are identical on LP64 */
asmlinkage long sys_truncate64(const char __user * path, unsigned long length) asmlinkage long sys_truncate64(const char __user * path, unsigned long length)
{ {
return sys_truncate(path, length); return ksys_truncate(path, length);
} }
asmlinkage long sys_ftruncate64(unsigned int fd, unsigned long length) asmlinkage long sys_ftruncate64(unsigned int fd, unsigned long length)
{ {
return sys_ftruncate(fd, length); return ksys_ftruncate(fd, length);
} }
asmlinkage long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg) asmlinkage long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg)
{ {
@ -320,7 +320,7 @@ asmlinkage long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg
asmlinkage long parisc_truncate64(const char __user * path, asmlinkage long parisc_truncate64(const char __user * path,
unsigned int high, unsigned int low) unsigned int high, unsigned int low)
{ {
return sys_truncate64(path, (loff_t)high << 32 | low); return ksys_truncate(path, (loff_t)high << 32 | low);
} }
asmlinkage long parisc_ftruncate64(unsigned int fd, asmlinkage long parisc_ftruncate64(unsigned int fd,
@ -333,26 +333,26 @@ asmlinkage long parisc_ftruncate64(unsigned int fd,
asmlinkage ssize_t parisc_pread64(unsigned int fd, char __user *buf, size_t count, asmlinkage ssize_t parisc_pread64(unsigned int fd, char __user *buf, size_t count,
unsigned int high, unsigned int low) unsigned int high, unsigned int low)
{ {
return sys_pread64(fd, buf, count, (loff_t)high << 32 | low); return ksys_pread64(fd, buf, count, (loff_t)high << 32 | low);
} }
asmlinkage ssize_t parisc_pwrite64(unsigned int fd, const char __user *buf, asmlinkage ssize_t parisc_pwrite64(unsigned int fd, const char __user *buf,
size_t count, unsigned int high, unsigned int low) size_t count, unsigned int high, unsigned int low)
{ {
return sys_pwrite64(fd, buf, count, (loff_t)high << 32 | low); return ksys_pwrite64(fd, buf, count, (loff_t)high << 32 | low);
} }
asmlinkage ssize_t parisc_readahead(int fd, unsigned int high, unsigned int low, asmlinkage ssize_t parisc_readahead(int fd, unsigned int high, unsigned int low,
size_t count) size_t count)
{ {
return sys_readahead(fd, (loff_t)high << 32 | low, count); return ksys_readahead(fd, (loff_t)high << 32 | low, count);
} }
asmlinkage long parisc_fadvise64_64(int fd, asmlinkage long parisc_fadvise64_64(int fd,
unsigned int high_off, unsigned int low_off, unsigned int high_off, unsigned int low_off,
unsigned int high_len, unsigned int low_len, int advice) unsigned int high_len, unsigned int low_len, int advice)
{ {
return sys_fadvise64_64(fd, (loff_t)high_off << 32 | low_off, return ksys_fadvise64_64(fd, (loff_t)high_off << 32 | low_off,
(loff_t)high_len << 32 | low_len, advice); (loff_t)high_len << 32 | low_len, advice);
} }
@ -360,15 +360,15 @@ asmlinkage long parisc_sync_file_range(int fd,
u32 hi_off, u32 lo_off, u32 hi_nbytes, u32 lo_nbytes, u32 hi_off, u32 lo_off, u32 hi_nbytes, u32 lo_nbytes,
unsigned int flags) unsigned int flags)
{ {
return sys_sync_file_range(fd, (loff_t)hi_off << 32 | lo_off, return ksys_sync_file_range(fd, (loff_t)hi_off << 32 | lo_off,
(loff_t)hi_nbytes << 32 | lo_nbytes, flags); (loff_t)hi_nbytes << 32 | lo_nbytes, flags);
} }
asmlinkage long parisc_fallocate(int fd, int mode, u32 offhi, u32 offlo, asmlinkage long parisc_fallocate(int fd, int mode, u32 offhi, u32 offlo,
u32 lenhi, u32 lenlo) u32 lenhi, u32 lenlo)
{ {
return sys_fallocate(fd, mode, ((u64)offhi << 32) | offlo, return ksys_fallocate(fd, mode, ((u64)offhi << 32) | offlo,
((u64)lenhi << 32) | lenlo); ((u64)lenhi << 32) | lenlo);
} }
long parisc_personality(unsigned long personality) long parisc_personality(unsigned long personality)

View File

@ -77,44 +77,44 @@ unsigned long compat_sys_mmap2(unsigned long addr, size_t len,
compat_ssize_t compat_sys_pread64(unsigned int fd, char __user *ubuf, compat_size_t count, compat_ssize_t compat_sys_pread64(unsigned int fd, char __user *ubuf, compat_size_t count,
u32 reg6, u32 poshi, u32 poslo) u32 reg6, u32 poshi, u32 poslo)
{ {
return sys_pread64(fd, ubuf, count, ((loff_t)poshi << 32) | poslo); return ksys_pread64(fd, ubuf, count, ((loff_t)poshi << 32) | poslo);
} }
compat_ssize_t compat_sys_pwrite64(unsigned int fd, const char __user *ubuf, compat_size_t count, compat_ssize_t compat_sys_pwrite64(unsigned int fd, const char __user *ubuf, compat_size_t count,
u32 reg6, u32 poshi, u32 poslo) u32 reg6, u32 poshi, u32 poslo)
{ {
return sys_pwrite64(fd, ubuf, count, ((loff_t)poshi << 32) | poslo); return ksys_pwrite64(fd, ubuf, count, ((loff_t)poshi << 32) | poslo);
} }
compat_ssize_t compat_sys_readahead(int fd, u32 r4, u32 offhi, u32 offlo, u32 count) compat_ssize_t compat_sys_readahead(int fd, u32 r4, u32 offhi, u32 offlo, u32 count)
{ {
return sys_readahead(fd, ((loff_t)offhi << 32) | offlo, count); return ksys_readahead(fd, ((loff_t)offhi << 32) | offlo, count);
} }
asmlinkage int compat_sys_truncate64(const char __user * path, u32 reg4, asmlinkage int compat_sys_truncate64(const char __user * path, u32 reg4,
unsigned long high, unsigned long low) unsigned long high, unsigned long low)
{ {
return sys_truncate(path, (high << 32) | low); return ksys_truncate(path, (high << 32) | low);
} }
asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo, asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
u32 lenhi, u32 lenlo) u32 lenhi, u32 lenlo)
{ {
return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo, return ksys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
((loff_t)lenhi << 32) | lenlo); ((loff_t)lenhi << 32) | lenlo);
} }
asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long high, asmlinkage int compat_sys_ftruncate64(unsigned int fd, u32 reg4, unsigned long high,
unsigned long low) unsigned long low)
{ {
return sys_ftruncate(fd, (high << 32) | low); return ksys_ftruncate(fd, (high << 32) | low);
} }
long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low, long ppc32_fadvise64(int fd, u32 unused, u32 offset_high, u32 offset_low,
size_t len, int advice) size_t len, int advice)
{ {
return sys_fadvise64(fd, (u64)offset_high << 32 | offset_low, len, return ksys_fadvise64_64(fd, (u64)offset_high << 32 | offset_low, len,
advice); advice);
} }
asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags, asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,
@ -124,5 +124,5 @@ asmlinkage long compat_sys_sync_file_range2(int fd, unsigned int flags,
loff_t offset = ((loff_t)offset_hi << 32) | offset_lo; loff_t offset = ((loff_t)offset_hi << 32) | offset_lo;
loff_t nbytes = ((loff_t)nbytes_hi << 32) | nbytes_lo; loff_t nbytes = ((loff_t)nbytes_hi << 32) | nbytes_lo;
return sys_sync_file_range(fd, offset, nbytes, flags); return ksys_sync_file_range(fd, offset, nbytes, flags);
} }

View File

@ -57,7 +57,7 @@ static inline long do_mmap2(unsigned long addr, size_t len,
off >>= shift; off >>= shift;
} }
ret = sys_mmap_pgoff(addr, len, prot, flags, fd, off); ret = ksys_mmap_pgoff(addr, len, prot, flags, fd, off);
out: out:
return ret; return ret;
} }
@ -119,8 +119,8 @@ long ppc64_personality(unsigned long personality)
long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low, long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
u32 len_high, u32 len_low) u32 len_high, u32 len_low)
{ {
return sys_fadvise64(fd, (u64)offset_high << 32 | offset_low, return ksys_fadvise64_64(fd, (u64)offset_high << 32 | offset_low,
(u64)len_high << 32 | len_low, advice); (u64)len_high << 32 | len_low, advice);
} }
long sys_switch_endian(void) long sys_switch_endian(void)

View File

@ -24,8 +24,8 @@ static long riscv_sys_mmap(unsigned long addr, unsigned long len,
{ {
if (unlikely(offset & (~PAGE_MASK >> page_shift_offset))) if (unlikely(offset & (~PAGE_MASK >> page_shift_offset)))
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
offset >> (PAGE_SHIFT - page_shift_offset)); offset >> (PAGE_SHIFT - page_shift_offset));
} }
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT

View File

@ -89,18 +89,18 @@
COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename, COMPAT_SYSCALL_DEFINE3(s390_chown16, const char __user *, filename,
u16, user, u16, group) u16, user, u16, group)
{ {
return sys_chown(filename, low2highuid(user), low2highgid(group)); return ksys_chown(filename, low2highuid(user), low2highgid(group));
} }
COMPAT_SYSCALL_DEFINE3(s390_lchown16, const char __user *, COMPAT_SYSCALL_DEFINE3(s390_lchown16, const char __user *,
filename, u16, user, u16, group) filename, u16, user, u16, group)
{ {
return sys_lchown(filename, low2highuid(user), low2highgid(group)); return ksys_lchown(filename, low2highuid(user), low2highgid(group));
} }
COMPAT_SYSCALL_DEFINE3(s390_fchown16, unsigned int, fd, u16, user, u16, group) COMPAT_SYSCALL_DEFINE3(s390_fchown16, unsigned int, fd, u16, user, u16, group)
{ {
return sys_fchown(fd, low2highuid(user), low2highgid(group)); return ksys_fchown(fd, low2highuid(user), low2highgid(group));
} }
COMPAT_SYSCALL_DEFINE2(s390_setregid16, u16, rgid, u16, egid) COMPAT_SYSCALL_DEFINE2(s390_setregid16, u16, rgid, u16, egid)
@ -302,12 +302,12 @@ COMPAT_SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, compat_ulong_t, second,
COMPAT_SYSCALL_DEFINE3(s390_truncate64, const char __user *, path, u32, high, u32, low) COMPAT_SYSCALL_DEFINE3(s390_truncate64, const char __user *, path, u32, high, u32, low)
{ {
return sys_truncate(path, (unsigned long)high << 32 | low); return ksys_truncate(path, (unsigned long)high << 32 | low);
} }
COMPAT_SYSCALL_DEFINE3(s390_ftruncate64, unsigned int, fd, u32, high, u32, low) COMPAT_SYSCALL_DEFINE3(s390_ftruncate64, unsigned int, fd, u32, high, u32, low)
{ {
return sys_ftruncate(fd, (unsigned long)high << 32 | low); return ksys_ftruncate(fd, (unsigned long)high << 32 | low);
} }
COMPAT_SYSCALL_DEFINE5(s390_pread64, unsigned int, fd, char __user *, ubuf, COMPAT_SYSCALL_DEFINE5(s390_pread64, unsigned int, fd, char __user *, ubuf,
@ -315,7 +315,7 @@ COMPAT_SYSCALL_DEFINE5(s390_pread64, unsigned int, fd, char __user *, ubuf,
{ {
if ((compat_ssize_t) count < 0) if ((compat_ssize_t) count < 0)
return -EINVAL; return -EINVAL;
return sys_pread64(fd, ubuf, count, (unsigned long)high << 32 | low); return ksys_pread64(fd, ubuf, count, (unsigned long)high << 32 | low);
} }
COMPAT_SYSCALL_DEFINE5(s390_pwrite64, unsigned int, fd, const char __user *, ubuf, COMPAT_SYSCALL_DEFINE5(s390_pwrite64, unsigned int, fd, const char __user *, ubuf,
@ -323,12 +323,12 @@ COMPAT_SYSCALL_DEFINE5(s390_pwrite64, unsigned int, fd, const char __user *, ubu
{ {
if ((compat_ssize_t) count < 0) if ((compat_ssize_t) count < 0)
return -EINVAL; return -EINVAL;
return sys_pwrite64(fd, ubuf, count, (unsigned long)high << 32 | low); return ksys_pwrite64(fd, ubuf, count, (unsigned long)high << 32 | low);
} }
COMPAT_SYSCALL_DEFINE4(s390_readahead, int, fd, u32, high, u32, low, s32, count) COMPAT_SYSCALL_DEFINE4(s390_readahead, int, fd, u32, high, u32, low, s32, count)
{ {
return sys_readahead(fd, (unsigned long)high << 32 | low, count); return ksys_readahead(fd, (unsigned long)high << 32 | low, count);
} }
struct stat64_emu31 { struct stat64_emu31 {
@ -442,8 +442,8 @@ COMPAT_SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct_emu31 __user *, arg
return -EFAULT; return -EFAULT;
if (a.offset & ~PAGE_MASK) if (a.offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, return ksys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
a.offset >> PAGE_SHIFT); a.offset >> PAGE_SHIFT);
} }
COMPAT_SYSCALL_DEFINE1(s390_mmap2, struct mmap_arg_struct_emu31 __user *, arg) COMPAT_SYSCALL_DEFINE1(s390_mmap2, struct mmap_arg_struct_emu31 __user *, arg)
@ -452,7 +452,7 @@ COMPAT_SYSCALL_DEFINE1(s390_mmap2, struct mmap_arg_struct_emu31 __user *, arg)
if (copy_from_user(&a, arg, sizeof(a))) if (copy_from_user(&a, arg, sizeof(a)))
return -EFAULT; return -EFAULT;
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset); return ksys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
} }
COMPAT_SYSCALL_DEFINE3(s390_read, unsigned int, fd, char __user *, buf, compat_size_t, count) COMPAT_SYSCALL_DEFINE3(s390_read, unsigned int, fd, char __user *, buf, compat_size_t, count)
@ -460,7 +460,7 @@ COMPAT_SYSCALL_DEFINE3(s390_read, unsigned int, fd, char __user *, buf, compat_s
if ((compat_ssize_t) count < 0) if ((compat_ssize_t) count < 0)
return -EINVAL; return -EINVAL;
return sys_read(fd, buf, count); return ksys_read(fd, buf, count);
} }
COMPAT_SYSCALL_DEFINE3(s390_write, unsigned int, fd, const char __user *, buf, compat_size_t, count) COMPAT_SYSCALL_DEFINE3(s390_write, unsigned int, fd, const char __user *, buf, compat_size_t, count)
@ -468,7 +468,7 @@ COMPAT_SYSCALL_DEFINE3(s390_write, unsigned int, fd, const char __user *, buf, c
if ((compat_ssize_t) count < 0) if ((compat_ssize_t) count < 0)
return -EINVAL; return -EINVAL;
return sys_write(fd, buf, count); return ksys_write(fd, buf, count);
} }
/* /*
@ -483,7 +483,8 @@ COMPAT_SYSCALL_DEFINE5(s390_fadvise64, int, fd, u32, high, u32, low, compat_size
advise = POSIX_FADV_DONTNEED; advise = POSIX_FADV_DONTNEED;
else if (advise == 5) else if (advise == 5)
advise = POSIX_FADV_NOREUSE; advise = POSIX_FADV_NOREUSE;
return sys_fadvise64(fd, (unsigned long)high << 32 | low, len, advise); return ksys_fadvise64_64(fd, (unsigned long)high << 32 | low, len,
advise);
} }
struct fadvise64_64_args { struct fadvise64_64_args {
@ -503,19 +504,19 @@ COMPAT_SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, arg
a.advice = POSIX_FADV_DONTNEED; a.advice = POSIX_FADV_DONTNEED;
else if (a.advice == 5) else if (a.advice == 5)
a.advice = POSIX_FADV_NOREUSE; a.advice = POSIX_FADV_NOREUSE;
return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice); return ksys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
} }
COMPAT_SYSCALL_DEFINE6(s390_sync_file_range, int, fd, u32, offhigh, u32, offlow, COMPAT_SYSCALL_DEFINE6(s390_sync_file_range, int, fd, u32, offhigh, u32, offlow,
u32, nhigh, u32, nlow, unsigned int, flags) u32, nhigh, u32, nlow, unsigned int, flags)
{ {
return sys_sync_file_range(fd, ((loff_t)offhigh << 32) + offlow, return ksys_sync_file_range(fd, ((loff_t)offhigh << 32) + offlow,
((u64)nhigh << 32) + nlow, flags); ((u64)nhigh << 32) + nlow, flags);
} }
COMPAT_SYSCALL_DEFINE6(s390_fallocate, int, fd, int, mode, u32, offhigh, u32, offlow, COMPAT_SYSCALL_DEFINE6(s390_fallocate, int, fd, int, mode, u32, offhigh, u32, offlow,
u32, lenhigh, u32, lenlow) u32, lenhigh, u32, lenlow)
{ {
return sys_fallocate(fd, mode, ((loff_t)offhigh << 32) + offlow, return ksys_fallocate(fd, mode, ((loff_t)offhigh << 32) + offlow,
((u64)lenhigh << 32) + lenlow); ((u64)lenhigh << 32) + lenlow);
} }

View File

@ -53,7 +53,7 @@ SYSCALL_DEFINE1(mmap2, struct s390_mmap_arg_struct __user *, arg)
if (copy_from_user(&a, arg, sizeof(a))) if (copy_from_user(&a, arg, sizeof(a)))
goto out; goto out;
error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset); error = ksys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
out: out:
return error; return error;
} }

View File

@ -35,7 +35,7 @@ asmlinkage int old_mmap(unsigned long addr, unsigned long len,
{ {
if (off & ~PAGE_MASK) if (off & ~PAGE_MASK)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT); return ksys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT);
} }
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
@ -51,7 +51,7 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
pgoff >>= PAGE_SHIFT - 12; pgoff >>= PAGE_SHIFT - 12;
return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); return ksys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
} }
/* sys_cacheflush -- flush (part of) the processor cache. */ /* sys_cacheflush -- flush (part of) the processor cache. */

View File

@ -39,23 +39,23 @@ asmlinkage int sys_sh_pipe(void)
asmlinkage ssize_t sys_pread_wrapper(unsigned int fd, char __user *buf, asmlinkage ssize_t sys_pread_wrapper(unsigned int fd, char __user *buf,
size_t count, long dummy, loff_t pos) size_t count, long dummy, loff_t pos)
{ {
return sys_pread64(fd, buf, count, pos); return ksys_pread64(fd, buf, count, pos);
} }
asmlinkage ssize_t sys_pwrite_wrapper(unsigned int fd, const char __user *buf, asmlinkage ssize_t sys_pwrite_wrapper(unsigned int fd, const char __user *buf,
size_t count, long dummy, loff_t pos) size_t count, long dummy, loff_t pos)
{ {
return sys_pwrite64(fd, buf, count, pos); return ksys_pwrite64(fd, buf, count, pos);
} }
asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1, asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,
u32 len0, u32 len1, int advice) u32 len0, u32 len1, int advice)
{ {
#ifdef __LITTLE_ENDIAN__ #ifdef __LITTLE_ENDIAN__
return sys_fadvise64_64(fd, (u64)offset1 << 32 | offset0, return ksys_fadvise64_64(fd, (u64)offset1 << 32 | offset0,
(u64)len1 << 32 | len0, advice); (u64)len1 << 32 | len0, advice);
#else #else
return sys_fadvise64_64(fd, (u64)offset0 << 32 | offset1, return ksys_fadvise64_64(fd, (u64)offset0 << 32 | offset1,
(u64)len0 << 32 | len1, advice); (u64)len0 << 32 | len1, advice);
#endif #endif
} }

View File

@ -86,7 +86,7 @@ static void prom_sync_me(void)
show_free_areas(0, NULL); show_free_areas(0, NULL);
if (!is_idle_task(current)) { if (!is_idle_task(current)) {
local_irq_enable(); local_irq_enable();
sys_sync(); ksys_sync();
local_irq_disable(); local_irq_disable();
} }
prom_printf("Returning to prom\n"); prom_printf("Returning to prom\n");

View File

@ -57,7 +57,7 @@ asmlinkage long sys32_truncate64(const char __user * path, unsigned long high, u
if ((int)high < 0) if ((int)high < 0)
return -EINVAL; return -EINVAL;
else else
return sys_truncate(path, (high << 32) | low); return ksys_truncate(path, (high << 32) | low);
} }
asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low) asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
@ -65,7 +65,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned
if ((int)high < 0) if ((int)high < 0)
return -EINVAL; return -EINVAL;
else else
return sys_ftruncate(fd, (high << 32) | low); return ksys_ftruncate(fd, (high << 32) | low);
} }
static int cp_compat_stat64(struct kstat *stat, static int cp_compat_stat64(struct kstat *stat,
@ -200,7 +200,7 @@ asmlinkage compat_ssize_t sys32_pread64(unsigned int fd,
unsigned long poshi, unsigned long poshi,
unsigned long poslo) unsigned long poslo)
{ {
return sys_pread64(fd, ubuf, count, (poshi << 32) | poslo); return ksys_pread64(fd, ubuf, count, (poshi << 32) | poslo);
} }
asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd,
@ -209,7 +209,7 @@ asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd,
unsigned long poshi, unsigned long poshi,
unsigned long poslo) unsigned long poslo)
{ {
return sys_pwrite64(fd, ubuf, count, (poshi << 32) | poslo); return ksys_pwrite64(fd, ubuf, count, (poshi << 32) | poslo);
} }
asmlinkage long compat_sys_readahead(int fd, asmlinkage long compat_sys_readahead(int fd,
@ -217,7 +217,7 @@ asmlinkage long compat_sys_readahead(int fd,
unsigned long offlo, unsigned long offlo,
compat_size_t count) compat_size_t count)
{ {
return sys_readahead(fd, (offhi << 32) | offlo, count); return ksys_readahead(fd, (offhi << 32) | offlo, count);
} }
long compat_sys_fadvise64(int fd, long compat_sys_fadvise64(int fd,
@ -225,7 +225,7 @@ long compat_sys_fadvise64(int fd,
unsigned long offlo, unsigned long offlo,
compat_size_t len, int advice) compat_size_t len, int advice)
{ {
return sys_fadvise64_64(fd, (offhi << 32) | offlo, len, advice); return ksys_fadvise64_64(fd, (offhi << 32) | offlo, len, advice);
} }
long compat_sys_fadvise64_64(int fd, long compat_sys_fadvise64_64(int fd,
@ -233,15 +233,15 @@ long compat_sys_fadvise64_64(int fd,
unsigned long lenhi, unsigned long lenlo, unsigned long lenhi, unsigned long lenlo,
int advice) int advice)
{ {
return sys_fadvise64_64(fd, return ksys_fadvise64_64(fd,
(offhi << 32) | offlo, (offhi << 32) | offlo,
(lenhi << 32) | lenlo, (lenhi << 32) | lenlo,
advice); advice);
} }
long sys32_sync_file_range(unsigned int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, unsigned int flags) long sys32_sync_file_range(unsigned int fd, unsigned long off_high, unsigned long off_low, unsigned long nb_high, unsigned long nb_low, unsigned int flags)
{ {
return sys_sync_file_range(fd, return ksys_sync_file_range(fd,
(off_high << 32) | off_low, (off_high << 32) | off_low,
(nb_high << 32) | nb_low, (nb_high << 32) | nb_low,
flags); flags);
@ -250,6 +250,6 @@ long sys32_sync_file_range(unsigned int fd, unsigned long off_high, unsigned lon
asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo, asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo,
u32 lenhi, u32 lenlo) u32 lenhi, u32 lenlo)
{ {
return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo, return ksys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,
((loff_t)lenhi << 32) | lenlo); ((loff_t)lenhi << 32) | lenlo);
} }

View File

@ -104,8 +104,8 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
{ {
/* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE /* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
we have. */ we have. */
return sys_mmap_pgoff(addr, len, prot, flags, fd, return ksys_mmap_pgoff(addr, len, prot, flags, fd,
pgoff >> (PAGE_SHIFT - 12)); pgoff >> (PAGE_SHIFT - 12));
} }
asmlinkage long sys_mmap(unsigned long addr, unsigned long len, asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
@ -113,7 +113,7 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len,
unsigned long off) unsigned long off)
{ {
/* no alignment check? */ /* no alignment check? */
return sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
} }
long sparc_remap_file_pages(unsigned long start, unsigned long size, long sparc_remap_file_pages(unsigned long start, unsigned long size,

View File

@ -458,7 +458,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
goto out; goto out;
if (off & ~PAGE_MASK) if (off & ~PAGE_MASK)
goto out; goto out;
retval = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); retval = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
out: out:
return retval; return retval;
} }

View File

@ -22,7 +22,7 @@ long old_mmap(unsigned long addr, unsigned long len,
if (offset & ~PAGE_MASK) if (offset & ~PAGE_MASK)
goto out; goto out;
err = sys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); err = ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
out: out:
return err; return err;
} }

View File

@ -13,7 +13,7 @@
4 i386 write sys_write 4 i386 write sys_write
5 i386 open sys_open compat_sys_open 5 i386 open sys_open compat_sys_open
6 i386 close sys_close 6 i386 close sys_close
7 i386 waitpid sys_waitpid compat_sys_x86_waitpid 7 i386 waitpid sys_waitpid
8 i386 creat sys_creat 8 i386 creat sys_creat
9 i386 link sys_link 9 i386 link sys_link
10 i386 unlink sys_unlink 10 i386 unlink sys_unlink
@ -137,7 +137,7 @@
128 i386 init_module sys_init_module 128 i386 init_module sys_init_module
129 i386 delete_module sys_delete_module 129 i386 delete_module sys_delete_module
130 i386 get_kernel_syms 130 i386 get_kernel_syms
131 i386 quotactl sys_quotactl sys32_quotactl 131 i386 quotactl sys_quotactl compat_sys_quotactl32
132 i386 getpgid sys_getpgid 132 i386 getpgid sys_getpgid
133 i386 fchdir sys_fchdir 133 i386 fchdir sys_fchdir
134 i386 bdflush sys_bdflush 134 i386 bdflush sys_bdflush

View File

@ -33,7 +33,6 @@
#include <asm/vdso.h> #include <asm/vdso.h>
#include <asm/sigframe.h> #include <asm/sigframe.h>
#include <asm/sighandling.h> #include <asm/sighandling.h>
#include <asm/sys_ia32.h>
#include <asm/smap.h> #include <asm/smap.h>
/* /*

View File

@ -41,12 +41,13 @@
#include <linux/highuid.h> #include <linux/highuid.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched/task.h>
#include <asm/mman.h> #include <asm/mman.h>
#include <asm/types.h> #include <asm/types.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <asm/vgtod.h> #include <asm/vgtod.h>
#include <asm/sys_ia32.h> #include <asm/ia32.h>
#define AA(__x) ((unsigned long)(__x)) #define AA(__x) ((unsigned long)(__x))
@ -54,13 +55,14 @@
COMPAT_SYSCALL_DEFINE3(x86_truncate64, const char __user *, filename, COMPAT_SYSCALL_DEFINE3(x86_truncate64, const char __user *, filename,
unsigned long, offset_low, unsigned long, offset_high) unsigned long, offset_low, unsigned long, offset_high)
{ {
return sys_truncate(filename, ((loff_t) offset_high << 32) | offset_low); return ksys_truncate(filename,
((loff_t) offset_high << 32) | offset_low);
} }
COMPAT_SYSCALL_DEFINE3(x86_ftruncate64, unsigned int, fd, COMPAT_SYSCALL_DEFINE3(x86_ftruncate64, unsigned int, fd,
unsigned long, offset_low, unsigned long, offset_high) unsigned long, offset_low, unsigned long, offset_high)
{ {
return sys_ftruncate(fd, ((loff_t) offset_high << 32) | offset_low); return ksys_ftruncate(fd, ((loff_t) offset_high << 32) | offset_low);
} }
/* /*
@ -164,29 +166,23 @@ COMPAT_SYSCALL_DEFINE1(x86_mmap, struct mmap_arg_struct32 __user *, arg)
if (a.offset & ~PAGE_MASK) if (a.offset & ~PAGE_MASK)
return -EINVAL; return -EINVAL;
return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, return ksys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
a.offset>>PAGE_SHIFT); a.offset>>PAGE_SHIFT);
} }
COMPAT_SYSCALL_DEFINE3(x86_waitpid, compat_pid_t, pid, unsigned int __user *,
stat_addr, int, options)
{
return compat_sys_wait4(pid, stat_addr, options, NULL);
}
/* warning: next two assume little endian */ /* warning: next two assume little endian */
COMPAT_SYSCALL_DEFINE5(x86_pread, unsigned int, fd, char __user *, ubuf, COMPAT_SYSCALL_DEFINE5(x86_pread, unsigned int, fd, char __user *, ubuf,
u32, count, u32, poslo, u32, poshi) u32, count, u32, poslo, u32, poshi)
{ {
return sys_pread64(fd, ubuf, count, return ksys_pread64(fd, ubuf, count,
((loff_t)AA(poshi) << 32) | AA(poslo)); ((loff_t)AA(poshi) << 32) | AA(poslo));
} }
COMPAT_SYSCALL_DEFINE5(x86_pwrite, unsigned int, fd, const char __user *, ubuf, COMPAT_SYSCALL_DEFINE5(x86_pwrite, unsigned int, fd, const char __user *, ubuf,
u32, count, u32, poslo, u32, poshi) u32, count, u32, poslo, u32, poshi)
{ {
return sys_pwrite64(fd, ubuf, count, return ksys_pwrite64(fd, ubuf, count,
((loff_t)AA(poshi) << 32) | AA(poslo)); ((loff_t)AA(poshi) << 32) | AA(poslo));
} }
@ -198,40 +194,40 @@ COMPAT_SYSCALL_DEFINE6(x86_fadvise64_64, int, fd, __u32, offset_low,
__u32, offset_high, __u32, len_low, __u32, len_high, __u32, offset_high, __u32, len_low, __u32, len_high,
int, advice) int, advice)
{ {
return sys_fadvise64_64(fd, return ksys_fadvise64_64(fd,
(((u64)offset_high)<<32) | offset_low, (((u64)offset_high)<<32) | offset_low,
(((u64)len_high)<<32) | len_low, (((u64)len_high)<<32) | len_low,
advice); advice);
} }
COMPAT_SYSCALL_DEFINE4(x86_readahead, int, fd, unsigned int, off_lo, COMPAT_SYSCALL_DEFINE4(x86_readahead, int, fd, unsigned int, off_lo,
unsigned int, off_hi, size_t, count) unsigned int, off_hi, size_t, count)
{ {
return sys_readahead(fd, ((u64)off_hi << 32) | off_lo, count); return ksys_readahead(fd, ((u64)off_hi << 32) | off_lo, count);
} }
COMPAT_SYSCALL_DEFINE6(x86_sync_file_range, int, fd, unsigned int, off_low, COMPAT_SYSCALL_DEFINE6(x86_sync_file_range, int, fd, unsigned int, off_low,
unsigned int, off_hi, unsigned int, n_low, unsigned int, off_hi, unsigned int, n_low,
unsigned int, n_hi, int, flags) unsigned int, n_hi, int, flags)
{ {
return sys_sync_file_range(fd, return ksys_sync_file_range(fd,
((u64)off_hi << 32) | off_low, ((u64)off_hi << 32) | off_low,
((u64)n_hi << 32) | n_low, flags); ((u64)n_hi << 32) | n_low, flags);
} }
COMPAT_SYSCALL_DEFINE5(x86_fadvise64, int, fd, unsigned int, offset_lo, COMPAT_SYSCALL_DEFINE5(x86_fadvise64, int, fd, unsigned int, offset_lo,
unsigned int, offset_hi, size_t, len, int, advice) unsigned int, offset_hi, size_t, len, int, advice)
{ {
return sys_fadvise64_64(fd, ((u64)offset_hi << 32) | offset_lo, return ksys_fadvise64_64(fd, ((u64)offset_hi << 32) | offset_lo,
len, advice); len, advice);
} }
COMPAT_SYSCALL_DEFINE6(x86_fallocate, int, fd, int, mode, COMPAT_SYSCALL_DEFINE6(x86_fallocate, int, fd, int, mode,
unsigned int, offset_lo, unsigned int, offset_hi, unsigned int, offset_lo, unsigned int, offset_hi,
unsigned int, len_lo, unsigned int, len_hi) unsigned int, len_lo, unsigned int, len_hi)
{ {
return sys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo, return ksys_fallocate(fd, mode, ((u64)offset_hi << 32) | offset_lo,
((u64)len_hi << 32) | len_lo); ((u64)len_hi << 32) | len_lo);
} }
/* /*
@ -241,6 +237,6 @@ COMPAT_SYSCALL_DEFINE5(x86_clone, unsigned long, clone_flags,
unsigned long, newsp, int __user *, parent_tidptr, unsigned long, newsp, int __user *, parent_tidptr,
unsigned long, tls_val, int __user *, child_tidptr) unsigned long, tls_val, int __user *, child_tidptr)
{ {
return sys_clone(clone_flags, newsp, parent_tidptr, child_tidptr, return _do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr,
tls_val); tls_val);
} }

View File

@ -1,67 +0,0 @@
/*
* sys_ia32.h - Linux ia32 syscall interfaces
*
* Copyright (c) 2008 Jaswinder Singh Rajput
*
* This file is released under the GPLv2.
* See the file COPYING for more details.
*/
#ifndef _ASM_X86_SYS_IA32_H
#define _ASM_X86_SYS_IA32_H
#ifdef CONFIG_COMPAT
#include <linux/compiler.h>
#include <linux/linkage.h>
#include <linux/types.h>
#include <linux/signal.h>
#include <asm/compat.h>
#include <asm/ia32.h>
/* ia32/sys_ia32.c */
asmlinkage long compat_sys_x86_truncate64(const char __user *, unsigned long,
unsigned long);
asmlinkage long compat_sys_x86_ftruncate64(unsigned int, unsigned long,
unsigned long);
asmlinkage long compat_sys_x86_stat64(const char __user *,
struct stat64 __user *);
asmlinkage long compat_sys_x86_lstat64(const char __user *,
struct stat64 __user *);
asmlinkage long compat_sys_x86_fstat64(unsigned int, struct stat64 __user *);
asmlinkage long compat_sys_x86_fstatat(unsigned int, const char __user *,
struct stat64 __user *, int);
struct mmap_arg_struct32;
asmlinkage long compat_sys_x86_mmap(struct mmap_arg_struct32 __user *);
asmlinkage long compat_sys_x86_waitpid(compat_pid_t, unsigned int __user *,
int);
asmlinkage long compat_sys_x86_pread(unsigned int, char __user *, u32, u32,
u32);
asmlinkage long compat_sys_x86_pwrite(unsigned int, const char __user *, u32,
u32, u32);
asmlinkage long compat_sys_x86_fadvise64_64(int, __u32, __u32, __u32, __u32,
int);
asmlinkage ssize_t compat_sys_x86_readahead(int, unsigned int, unsigned int,
size_t);
asmlinkage long compat_sys_x86_sync_file_range(int, unsigned int, unsigned int,
unsigned int, unsigned int,
int);
asmlinkage long compat_sys_x86_fadvise64(int, unsigned int, unsigned int,
size_t, int);
asmlinkage long compat_sys_x86_fallocate(int, int, unsigned int, unsigned int,
unsigned int, unsigned int);
asmlinkage long compat_sys_x86_clone(unsigned long, unsigned long, int __user *,
unsigned long, int __user *);
/* ia32/ia32_signal.c */
asmlinkage long sys32_sigreturn(void);
asmlinkage long sys32_rt_sigreturn(void);
#endif /* CONFIG_COMPAT */
#endif /* _ASM_X86_SYS_IA32_H */

View File

@ -17,6 +17,7 @@
/* Common in X86_32 and X86_64 */ /* Common in X86_32 and X86_64 */
/* kernel/ioport.c */ /* kernel/ioport.c */
long ksys_ioperm(unsigned long from, unsigned long num, int turn_on);
asmlinkage long sys_ioperm(unsigned long, unsigned long, int); asmlinkage long sys_ioperm(unsigned long, unsigned long, int);
asmlinkage long sys_iopl(unsigned int); asmlinkage long sys_iopl(unsigned int);
@ -34,7 +35,7 @@ asmlinkage long sys_get_thread_area(struct user_desc __user *);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/* kernel/signal.c */ /* kernel/signal.c */
asmlinkage unsigned long sys_sigreturn(void); asmlinkage long sys_sigreturn(void);
/* kernel/vm86_32.c */ /* kernel/vm86_32.c */
struct vm86_struct; struct vm86_struct;

View File

@ -23,7 +23,7 @@
/* /*
* this changes the io permissions bitmap in the current task. * this changes the io permissions bitmap in the current task.
*/ */
SYSCALL_DEFINE3(ioperm, unsigned long, from, unsigned long, num, int, turn_on) long ksys_ioperm(unsigned long from, unsigned long num, int turn_on)
{ {
struct thread_struct *t = &current->thread; struct thread_struct *t = &current->thread;
struct tss_struct *tss; struct tss_struct *tss;
@ -96,6 +96,11 @@ SYSCALL_DEFINE3(ioperm, unsigned long, from, unsigned long, num, int, turn_on)
return 0; return 0;
} }
SYSCALL_DEFINE3(ioperm, unsigned long, from, unsigned long, num, int, turn_on)
{
return ksys_ioperm(from, num, turn_on);
}
/* /*
* sys_iopl has to be used when you want to access the IO ports * sys_iopl has to be used when you want to access the IO ports
* beyond the 0x3ff range: to get the full 65536 ports bitmapped * beyond the 0x3ff range: to get the full 65536 ports bitmapped

View File

@ -25,6 +25,7 @@
#include <linux/user-return-notifier.h> #include <linux/user-return-notifier.h>
#include <linux/uprobes.h> #include <linux/uprobes.h>
#include <linux/context_tracking.h> #include <linux/context_tracking.h>
#include <linux/syscalls.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/ucontext.h> #include <asm/ucontext.h>
@ -601,7 +602,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
asmlinkage unsigned long sys_sigreturn(void) SYSCALL_DEFINE0(sigreturn)
{ {
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
struct sigframe __user *frame; struct sigframe __user *frame;
@ -633,7 +634,7 @@ badframe:
} }
#endif /* CONFIG_X86_32 */ #endif /* CONFIG_X86_32 */
asmlinkage long sys_rt_sigreturn(void) SYSCALL_DEFINE0(rt_sigreturn)
{ {
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;

View File

@ -97,7 +97,7 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
if (off & ~PAGE_MASK) if (off & ~PAGE_MASK)
goto out; goto out;
error = sys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT); error = ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
out: out:
return error; return error;
} }

View File

@ -55,7 +55,7 @@ asmlinkage long xtensa_shmat(int shmid, char __user *shmaddr, int shmflg)
asmlinkage long xtensa_fadvise64_64(int fd, int advice, asmlinkage long xtensa_fadvise64_64(int fd, int advice,
unsigned long long offset, unsigned long long len) unsigned long long offset, unsigned long long len)
{ {
return sys_fadvise64_64(fd, offset, len, advice); return ksys_fadvise64_64(fd, offset, len, advice);
} }
#ifdef CONFIG_MMU #ifdef CONFIG_MMU

View File

@ -356,7 +356,8 @@ int devtmpfs_mount(const char *mntdir)
if (!thread) if (!thread)
return 0; return 0;
err = sys_mount("devtmpfs", (char *)mntdir, "devtmpfs", MS_SILENT, NULL); err = ksys_mount("devtmpfs", (char *)mntdir, "devtmpfs", MS_SILENT,
NULL);
if (err) if (err)
printk(KERN_INFO "devtmpfs: error mounting %i\n", err); printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
else else
@ -379,14 +380,14 @@ static int devtmpfsd(void *p)
{ {
char options[] = "mode=0755"; char options[] = "mode=0755";
int *err = p; int *err = p;
*err = sys_unshare(CLONE_NEWNS); *err = ksys_unshare(CLONE_NEWNS);
if (*err) if (*err)
goto out; goto out;
*err = sys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options); *err = ksys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options);
if (*err) if (*err)
goto out; goto out;
sys_chdir("/.."); /* will traverse into overmounted root */ ksys_chdir("/.."); /* will traverse into overmounted root */
sys_chroot("."); ksys_chroot(".");
complete(&setup_done); complete(&setup_done);
while (1) { while (1) {
spin_lock(&req_lock); spin_lock(&req_lock);

View File

@ -660,7 +660,7 @@ static void sysrq_do_reset(struct timer_list *t)
state->reset_requested = true; state->reset_requested = true;
sys_sync(); ksys_sync();
kernel_restart(NULL); kernel_restart(NULL);
} }

View File

@ -57,7 +57,7 @@ extern struct tty_driver *console_driver;
*/ */
#ifdef CONFIG_X86 #ifdef CONFIG_X86
#include <linux/syscalls.h> #include <asm/syscalls.h>
#endif #endif
static void complete_change_console(struct vc_data *vc); static void complete_change_console(struct vc_data *vc);
@ -420,12 +420,12 @@ int vt_ioctl(struct tty_struct *tty,
ret = -EINVAL; ret = -EINVAL;
break; break;
} }
ret = sys_ioperm(arg, 1, (cmd == KDADDIO)) ? -ENXIO : 0; ret = ksys_ioperm(arg, 1, (cmd == KDADDIO)) ? -ENXIO : 0;
break; break;
case KDENABIO: case KDENABIO:
case KDDISABIO: case KDDISABIO:
ret = sys_ioperm(GPFIRST, GPNUM, ret = ksys_ioperm(GPFIRST, GPNUM,
(cmd == KDENABIO)) ? -ENXIO : 0; (cmd == KDENABIO)) ? -ENXIO : 0;
break; break;
#endif #endif

View File

@ -310,7 +310,7 @@ static int autofs_dev_ioctl_closemount(struct file *fp,
struct autofs_sb_info *sbi, struct autofs_sb_info *sbi,
struct autofs_dev_ioctl *param) struct autofs_dev_ioctl *param)
{ {
return sys_close(param->ioctlfd); return ksys_close(param->ioctlfd);
} }
/* /*

View File

@ -241,7 +241,7 @@ ret:
return retval; return retval;
error: error:
if (fd_binary > 0) if (fd_binary > 0)
sys_close(fd_binary); ksys_close(fd_binary);
bprm->interp_flags = 0; bprm->interp_flags = 0;
bprm->interp_data = 0; bprm->interp_data = 0;
goto ret; goto ret;

View File

@ -146,7 +146,7 @@ out:
/* And here is where the userspace process can look up the cookie value /* And here is where the userspace process can look up the cookie value
* to retrieve the path. * to retrieve the path.
*/ */
SYSCALL_DEFINE3(lookup_dcookie, u64, cookie64, char __user *, buf, size_t, len) static int do_lookup_dcookie(u64 cookie64, char __user *buf, size_t len)
{ {
unsigned long cookie = (unsigned long)cookie64; unsigned long cookie = (unsigned long)cookie64;
int err = -EINVAL; int err = -EINVAL;
@ -203,13 +203,18 @@ out:
return err; return err;
} }
SYSCALL_DEFINE3(lookup_dcookie, u64, cookie64, char __user *, buf, size_t, len)
{
return do_lookup_dcookie(cookie64, buf, len);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, w0, u32, w1, char __user *, buf, compat_size_t, len) COMPAT_SYSCALL_DEFINE4(lookup_dcookie, u32, w0, u32, w1, char __user *, buf, compat_size_t, len)
{ {
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
return sys_lookup_dcookie(((u64)w0 << 32) | w1, buf, len); return do_lookup_dcookie(((u64)w0 << 32) | w1, buf, len);
#else #else
return sys_lookup_dcookie(((u64)w1 << 32) | w0, buf, len); return do_lookup_dcookie(((u64)w1 << 32) | w0, buf, len);
#endif #endif
} }
#endif #endif

View File

@ -380,7 +380,7 @@ struct eventfd_ctx *eventfd_ctx_fileget(struct file *file)
} }
EXPORT_SYMBOL_GPL(eventfd_ctx_fileget); EXPORT_SYMBOL_GPL(eventfd_ctx_fileget);
SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags) static int do_eventfd(unsigned int count, int flags)
{ {
struct eventfd_ctx *ctx; struct eventfd_ctx *ctx;
int fd; int fd;
@ -409,8 +409,13 @@ SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags)
return fd; return fd;
} }
SYSCALL_DEFINE1(eventfd, unsigned int, count) SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags)
{ {
return sys_eventfd2(count, 0); return do_eventfd(count, flags);
}
SYSCALL_DEFINE1(eventfd, unsigned int, count)
{
return do_eventfd(count, 0);
} }

View File

@ -1936,7 +1936,7 @@ static void clear_tfile_check_list(void)
/* /*
* Open an eventpoll file descriptor. * Open an eventpoll file descriptor.
*/ */
SYSCALL_DEFINE1(epoll_create1, int, flags) static int do_epoll_create(int flags)
{ {
int error, fd; int error, fd;
struct eventpoll *ep = NULL; struct eventpoll *ep = NULL;
@ -1979,12 +1979,17 @@ out_free_ep:
return error; return error;
} }
SYSCALL_DEFINE1(epoll_create1, int, flags)
{
return do_epoll_create(flags);
}
SYSCALL_DEFINE1(epoll_create, int, size) SYSCALL_DEFINE1(epoll_create, int, size)
{ {
if (size <= 0) if (size <= 0)
return -EINVAL; return -EINVAL;
return sys_epoll_create1(0); return do_epoll_create(0);
} }
/* /*
@ -2148,8 +2153,8 @@ error_return:
* Implement the event wait interface for the eventpoll file. It is the kernel * Implement the event wait interface for the eventpoll file. It is the kernel
* part of the user space epoll_wait(2). * part of the user space epoll_wait(2).
*/ */
SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events, static int do_epoll_wait(int epfd, struct epoll_event __user *events,
int, maxevents, int, timeout) int maxevents, int timeout)
{ {
int error; int error;
struct fd f; struct fd f;
@ -2190,6 +2195,12 @@ error_fput:
return error; return error;
} }
SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events,
int, maxevents, int, timeout)
{
return do_epoll_wait(epfd, events, maxevents, timeout);
}
/* /*
* Implement the event wait interface for the eventpoll file. It is the kernel * Implement the event wait interface for the eventpoll file. It is the kernel
* part of the user space epoll_pwait(2). * part of the user space epoll_pwait(2).
@ -2214,7 +2225,7 @@ SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
set_current_blocked(&ksigmask); set_current_blocked(&ksigmask);
} }
error = sys_epoll_wait(epfd, events, maxevents, timeout); error = do_epoll_wait(epfd, events, maxevents, timeout);
/* /*
* If we changed the signal mask, we need to restore the original one. * If we changed the signal mask, we need to restore the original one.
@ -2257,7 +2268,7 @@ COMPAT_SYSCALL_DEFINE6(epoll_pwait, int, epfd,
set_current_blocked(&ksigmask); set_current_blocked(&ksigmask);
} }
err = sys_epoll_wait(epfd, events, maxevents, timeout); err = do_epoll_wait(epfd, events, maxevents, timeout);
/* /*
* If we changed the signal mask, we need to restore the original one. * If we changed the signal mask, we need to restore the original one.

View File

@ -607,8 +607,8 @@ static int fixup_compat_flock(struct flock *flock)
return 0; return 0;
} }
COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, static long do_compat_fcntl64(unsigned int fd, unsigned int cmd,
compat_ulong_t, arg) compat_ulong_t arg)
{ {
struct fd f = fdget_raw(fd); struct fd f = fdget_raw(fd);
struct flock flock; struct flock flock;
@ -672,6 +672,12 @@ out_put:
return err; return err;
} }
COMPAT_SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
compat_ulong_t, arg)
{
return do_compat_fcntl64(fd, cmd, arg);
}
COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd,
compat_ulong_t, arg) compat_ulong_t, arg)
{ {
@ -684,7 +690,7 @@ COMPAT_SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd,
case F_OFD_SETLKW: case F_OFD_SETLKW:
return -EINVAL; return -EINVAL;
} }
return compat_sys_fcntl64(fd, cmd, arg); return do_compat_fcntl64(fd, cmd, arg);
} }
#endif #endif

View File

@ -638,6 +638,7 @@ out_unlock:
spin_unlock(&files->file_lock); spin_unlock(&files->file_lock);
return -EBADF; return -EBADF;
} }
EXPORT_SYMBOL(__close_fd); /* for ksys_close() */
void do_close_on_exec(struct files_struct *files) void do_close_on_exec(struct files_struct *files)
{ {
@ -870,7 +871,7 @@ out_unlock:
return err; return err;
} }
SYSCALL_DEFINE3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags) static int ksys_dup3(unsigned int oldfd, unsigned int newfd, int flags)
{ {
int err = -EBADF; int err = -EBADF;
struct file *file; struct file *file;
@ -904,6 +905,11 @@ out_unlock:
return err; return err;
} }
SYSCALL_DEFINE3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags)
{
return ksys_dup3(oldfd, newfd, flags);
}
SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd) SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd)
{ {
if (unlikely(newfd == oldfd)) { /* corner case */ if (unlikely(newfd == oldfd)) { /* corner case */
@ -916,10 +922,10 @@ SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd)
rcu_read_unlock(); rcu_read_unlock();
return retval; return retval;
} }
return sys_dup3(oldfd, newfd, 0); return ksys_dup3(oldfd, newfd, 0);
} }
SYSCALL_DEFINE1(dup, unsigned int, fildes) int ksys_dup(unsigned int fildes)
{ {
int ret = -EBADF; int ret = -EBADF;
struct file *file = fget_raw(fildes); struct file *file = fget_raw(fildes);
@ -934,6 +940,11 @@ SYSCALL_DEFINE1(dup, unsigned int, fildes)
return ret; return ret;
} }
SYSCALL_DEFINE1(dup, unsigned int, fildes)
{
return ksys_dup(fildes);
}
int f_dupfd(unsigned int from, struct file *file, unsigned flags) int f_dupfd(unsigned int from, struct file *file, unsigned flags)
{ {
int err; int err;

View File

@ -84,7 +84,7 @@ extern int set_attr(const char *file, struct hostfs_iattr *attrs, int fd);
extern int make_symlink(const char *from, const char *to); extern int make_symlink(const char *from, const char *to);
extern int unlink_file(const char *file); extern int unlink_file(const char *file);
extern int do_mkdir(const char *file, int mode); extern int do_mkdir(const char *file, int mode);
extern int do_rmdir(const char *file); extern int hostfs_do_rmdir(const char *file);
extern int do_mknod(const char *file, int mode, unsigned int major, extern int do_mknod(const char *file, int mode, unsigned int major,
unsigned int minor); unsigned int minor);
extern int link_file(const char *from, const char *to); extern int link_file(const char *from, const char *to);

View File

@ -706,7 +706,7 @@ static int hostfs_rmdir(struct inode *ino, struct dentry *dentry)
if ((file = dentry_name(dentry)) == NULL) if ((file = dentry_name(dentry)) == NULL)
return -ENOMEM; return -ENOMEM;
err = do_rmdir(file); err = hostfs_do_rmdir(file);
__putname(file); __putname(file);
return err; return err;
} }

View File

@ -304,7 +304,7 @@ int do_mkdir(const char *file, int mode)
return 0; return 0;
} }
int do_rmdir(const char *file) int hostfs_do_rmdir(const char *file)
{ {
int err; int err;

View File

@ -55,7 +55,15 @@ extern void __init chrdev_init(void);
extern int user_path_mountpoint_at(int, const char __user *, unsigned int, struct path *); extern int user_path_mountpoint_at(int, const char __user *, unsigned int, struct path *);
extern int vfs_path_lookup(struct dentry *, struct vfsmount *, extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
const char *, unsigned int, struct path *); const char *, unsigned int, struct path *);
long do_mknodat(int dfd, const char __user *filename, umode_t mode,
unsigned int dev);
long do_mkdirat(int dfd, const char __user *pathname, umode_t mode);
long do_rmdir(int dfd, const char __user *pathname);
long do_unlinkat(int dfd, struct filename *name); long do_unlinkat(int dfd, struct filename *name);
long do_symlinkat(const char __user *oldname, int newdfd,
const char __user *newname);
int do_linkat(int olddfd, const char __user *oldname, int newdfd,
const char __user *newname, int flags);
/* /*
* namespace.c * namespace.c
@ -111,6 +119,12 @@ extern struct file *do_filp_open(int dfd, struct filename *pathname,
extern struct file *do_file_open_root(struct dentry *, struct vfsmount *, extern struct file *do_file_open_root(struct dentry *, struct vfsmount *,
const char *, const struct open_flags *); const char *, const struct open_flags *);
long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
long do_faccessat(int dfd, const char __user *filename, int mode);
int do_fchmodat(int dfd, const char __user *filename, umode_t mode);
int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
int flag);
extern int open_check_o_direct(struct file *f); extern int open_check_o_direct(struct file *f);
extern int vfs_open(const struct path *, struct file *, const struct cred *); extern int vfs_open(const struct path *, struct file *, const struct cred *);
extern struct file *filp_clone_open(struct file *); extern struct file *filp_clone_open(struct file *);

View File

@ -689,7 +689,7 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
return error; return error;
} }
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) int ksys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{ {
int error; int error;
struct fd f = fdget(fd); struct fd f = fdget(fd);
@ -702,3 +702,8 @@ SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
fdput(f); fdput(f);
return error; return error;
} }
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
return ksys_ioctl(fd, cmd, arg);
}

View File

@ -3729,8 +3729,8 @@ static int may_mknod(umode_t mode)
} }
} }
SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, long do_mknodat(int dfd, const char __user *filename, umode_t mode,
unsigned, dev) unsigned int dev)
{ {
struct dentry *dentry; struct dentry *dentry;
struct path path; struct path path;
@ -3773,9 +3773,15 @@ out:
return error; return error;
} }
SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode,
unsigned int, dev)
{
return do_mknodat(dfd, filename, mode, dev);
}
SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev) SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, dev)
{ {
return sys_mknodat(AT_FDCWD, filename, mode, dev); return do_mknodat(AT_FDCWD, filename, mode, dev);
} }
int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
@ -3804,7 +3810,7 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
} }
EXPORT_SYMBOL(vfs_mkdir); EXPORT_SYMBOL(vfs_mkdir);
SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) long do_mkdirat(int dfd, const char __user *pathname, umode_t mode)
{ {
struct dentry *dentry; struct dentry *dentry;
struct path path; struct path path;
@ -3829,9 +3835,14 @@ retry:
return error; return error;
} }
SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode)
{
return do_mkdirat(dfd, pathname, mode);
}
SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode) SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode)
{ {
return sys_mkdirat(AT_FDCWD, pathname, mode); return do_mkdirat(AT_FDCWD, pathname, mode);
} }
int vfs_rmdir(struct inode *dir, struct dentry *dentry) int vfs_rmdir(struct inode *dir, struct dentry *dentry)
@ -3873,7 +3884,7 @@ out:
} }
EXPORT_SYMBOL(vfs_rmdir); EXPORT_SYMBOL(vfs_rmdir);
static long do_rmdir(int dfd, const char __user *pathname) long do_rmdir(int dfd, const char __user *pathname)
{ {
int error = 0; int error = 0;
struct filename *name; struct filename *name;
@ -4109,8 +4120,8 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
} }
EXPORT_SYMBOL(vfs_symlink); EXPORT_SYMBOL(vfs_symlink);
SYSCALL_DEFINE3(symlinkat, const char __user *, oldname, long do_symlinkat(const char __user *oldname, int newdfd,
int, newdfd, const char __user *, newname) const char __user *newname)
{ {
int error; int error;
struct filename *from; struct filename *from;
@ -4140,9 +4151,15 @@ out_putname:
return error; return error;
} }
SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
int, newdfd, const char __user *, newname)
{
return do_symlinkat(oldname, newdfd, newname);
}
SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname) SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
{ {
return sys_symlinkat(oldname, AT_FDCWD, newname); return do_symlinkat(oldname, AT_FDCWD, newname);
} }
/** /**
@ -4234,8 +4251,8 @@ EXPORT_SYMBOL(vfs_link);
* with linux 2.0, and to avoid hard-linking to directories * with linux 2.0, and to avoid hard-linking to directories
* and other special files. --ADM * and other special files. --ADM
*/ */
SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, int do_linkat(int olddfd, const char __user *oldname, int newdfd,
int, newdfd, const char __user *, newname, int, flags) const char __user *newname, int flags)
{ {
struct dentry *new_dentry; struct dentry *new_dentry;
struct path old_path, new_path; struct path old_path, new_path;
@ -4299,9 +4316,15 @@ out:
return error; return error;
} }
SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname, int, flags)
{
return do_linkat(olddfd, oldname, newdfd, newname, flags);
}
SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname) SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname)
{ {
return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0); return do_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
} }
/** /**
@ -4479,8 +4502,8 @@ out:
} }
EXPORT_SYMBOL(vfs_rename); EXPORT_SYMBOL(vfs_rename);
SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, static int do_renameat2(int olddfd, const char __user *oldname, int newdfd,
int, newdfd, const char __user *, newname, unsigned int, flags) const char __user *newname, unsigned int flags)
{ {
struct dentry *old_dentry, *new_dentry; struct dentry *old_dentry, *new_dentry;
struct dentry *trap; struct dentry *trap;
@ -4622,15 +4645,21 @@ exit:
return error; return error;
} }
SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname, unsigned int, flags)
{
return do_renameat2(olddfd, oldname, newdfd, newname, flags);
}
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname, SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname) int, newdfd, const char __user *, newname)
{ {
return sys_renameat2(olddfd, oldname, newdfd, newname, 0); return do_renameat2(olddfd, oldname, newdfd, newname, 0);
} }
SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname) SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname)
{ {
return sys_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0); return do_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
} }
int vfs_whiteout(struct inode *dir, struct dentry *dentry) int vfs_whiteout(struct inode *dir, struct dentry *dentry)

View File

@ -1680,7 +1680,7 @@ static inline bool may_mandlock(void)
* unixes. Our API is identical to OSF/1 to avoid making a mess of AMD * unixes. Our API is identical to OSF/1 to avoid making a mess of AMD
*/ */
SYSCALL_DEFINE2(umount, char __user *, name, int, flags) int ksys_umount(char __user *name, int flags)
{ {
struct path path; struct path path;
struct mount *mnt; struct mount *mnt;
@ -1720,6 +1720,11 @@ out:
return retval; return retval;
} }
SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
{
return ksys_umount(name, flags);
}
#ifdef __ARCH_WANT_SYS_OLDUMOUNT #ifdef __ARCH_WANT_SYS_OLDUMOUNT
/* /*
@ -1727,7 +1732,7 @@ out:
*/ */
SYSCALL_DEFINE1(oldumount, char __user *, name) SYSCALL_DEFINE1(oldumount, char __user *, name)
{ {
return sys_umount(name, 0); return ksys_umount(name, 0);
} }
#endif #endif
@ -3032,8 +3037,8 @@ struct dentry *mount_subtree(struct vfsmount *mnt, const char *name)
} }
EXPORT_SYMBOL(mount_subtree); EXPORT_SYMBOL(mount_subtree);
SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, int ksys_mount(char __user *dev_name, char __user *dir_name, char __user *type,
char __user *, type, unsigned long, flags, void __user *, data) unsigned long flags, void __user *data)
{ {
int ret; int ret;
char *kernel_type; char *kernel_type;
@ -3066,6 +3071,12 @@ out_type:
return ret; return ret;
} }
SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
char __user *, type, unsigned long, flags, void __user *, data)
{
return ksys_mount(dev_name, dir_name, type, flags, data);
}
/* /*
* Return true if path is reachable from root * Return true if path is reachable from root
* *

View File

@ -820,9 +820,8 @@ out_destroy_group:
return fd; return fd;
} }
SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags, static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
__u64, mask, int, dfd, int dfd, const char __user *pathname)
const char __user *, pathname)
{ {
struct inode *inode = NULL; struct inode *inode = NULL;
struct vfsmount *mnt = NULL; struct vfsmount *mnt = NULL;
@ -928,13 +927,20 @@ fput_and_out:
return ret; return ret;
} }
SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags,
__u64, mask, int, dfd,
const char __user *, pathname)
{
return do_fanotify_mark(fanotify_fd, flags, mask, dfd, pathname);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE6(fanotify_mark, COMPAT_SYSCALL_DEFINE6(fanotify_mark,
int, fanotify_fd, unsigned int, flags, int, fanotify_fd, unsigned int, flags,
__u32, mask0, __u32, mask1, int, dfd, __u32, mask0, __u32, mask1, int, dfd,
const char __user *, pathname) const char __user *, pathname)
{ {
return sys_fanotify_mark(fanotify_fd, flags, return do_fanotify_mark(fanotify_fd, flags,
#ifdef __BIG_ENDIAN #ifdef __BIG_ENDIAN
((__u64)mask0 << 32) | mask1, ((__u64)mask0 << 32) | mask1,
#else #else

View File

@ -635,7 +635,7 @@ static struct fsnotify_group *inotify_new_group(unsigned int max_events)
/* inotify syscalls */ /* inotify syscalls */
SYSCALL_DEFINE1(inotify_init1, int, flags) static int do_inotify_init(int flags)
{ {
struct fsnotify_group *group; struct fsnotify_group *group;
int ret; int ret;
@ -660,9 +660,14 @@ SYSCALL_DEFINE1(inotify_init1, int, flags)
return ret; return ret;
} }
SYSCALL_DEFINE1(inotify_init1, int, flags)
{
return do_inotify_init(flags);
}
SYSCALL_DEFINE0(inotify_init) SYSCALL_DEFINE0(inotify_init)
{ {
return sys_inotify_init1(0); return do_inotify_init(0);
} }
SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname, SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,

View File

@ -128,7 +128,7 @@ out:
} }
EXPORT_SYMBOL_GPL(vfs_truncate); EXPORT_SYMBOL_GPL(vfs_truncate);
static long do_sys_truncate(const char __user *pathname, loff_t length) long do_sys_truncate(const char __user *pathname, loff_t length)
{ {
unsigned int lookup_flags = LOOKUP_FOLLOW; unsigned int lookup_flags = LOOKUP_FOLLOW;
struct path path; struct path path;
@ -162,7 +162,7 @@ COMPAT_SYSCALL_DEFINE2(truncate, const char __user *, path, compat_off_t, length
} }
#endif #endif
static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) long do_sys_ftruncate(unsigned int fd, loff_t length, int small)
{ {
struct inode *inode; struct inode *inode;
struct dentry *dentry; struct dentry *dentry;
@ -333,7 +333,7 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
} }
EXPORT_SYMBOL_GPL(vfs_fallocate); EXPORT_SYMBOL_GPL(vfs_fallocate);
SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len) int ksys_fallocate(int fd, int mode, loff_t offset, loff_t len)
{ {
struct fd f = fdget(fd); struct fd f = fdget(fd);
int error = -EBADF; int error = -EBADF;
@ -345,12 +345,17 @@ SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
return error; return error;
} }
SYSCALL_DEFINE4(fallocate, int, fd, int, mode, loff_t, offset, loff_t, len)
{
return ksys_fallocate(fd, mode, offset, len);
}
/* /*
* access() needs to use the real uid/gid, not the effective uid/gid. * access() needs to use the real uid/gid, not the effective uid/gid.
* We do this by temporarily clearing all FS-related capabilities and * We do this by temporarily clearing all FS-related capabilities and
* switching the fsuid/fsgid around to the real ones. * switching the fsuid/fsgid around to the real ones.
*/ */
SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) long do_faccessat(int dfd, const char __user *filename, int mode)
{ {
const struct cred *old_cred; const struct cred *old_cred;
struct cred *override_cred; struct cred *override_cred;
@ -426,12 +431,17 @@ out:
return res; return res;
} }
SYSCALL_DEFINE2(access, const char __user *, filename, int, mode) SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
{ {
return sys_faccessat(AT_FDCWD, filename, mode); return do_faccessat(dfd, filename, mode);
} }
SYSCALL_DEFINE1(chdir, const char __user *, filename) SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
{
return do_faccessat(AT_FDCWD, filename, mode);
}
int ksys_chdir(const char __user *filename)
{ {
struct path path; struct path path;
int error; int error;
@ -457,6 +467,11 @@ out:
return error; return error;
} }
SYSCALL_DEFINE1(chdir, const char __user *, filename)
{
return ksys_chdir(filename);
}
SYSCALL_DEFINE1(fchdir, unsigned int, fd) SYSCALL_DEFINE1(fchdir, unsigned int, fd)
{ {
struct fd f = fdget_raw(fd); struct fd f = fdget_raw(fd);
@ -479,7 +494,7 @@ out:
return error; return error;
} }
SYSCALL_DEFINE1(chroot, const char __user *, filename) int ksys_chroot(const char __user *filename)
{ {
struct path path; struct path path;
int error; int error;
@ -512,6 +527,11 @@ out:
return error; return error;
} }
SYSCALL_DEFINE1(chroot, const char __user *, filename)
{
return ksys_chroot(filename);
}
static int chmod_common(const struct path *path, umode_t mode) static int chmod_common(const struct path *path, umode_t mode)
{ {
struct inode *inode = path->dentry->d_inode; struct inode *inode = path->dentry->d_inode;
@ -541,7 +561,7 @@ out_unlock:
return error; return error;
} }
SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode) int ksys_fchmod(unsigned int fd, umode_t mode)
{ {
struct fd f = fdget(fd); struct fd f = fdget(fd);
int err = -EBADF; int err = -EBADF;
@ -554,7 +574,12 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode)
return err; return err;
} }
SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, umode_t, mode) SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode)
{
return ksys_fchmod(fd, mode);
}
int do_fchmodat(int dfd, const char __user *filename, umode_t mode)
{ {
struct path path; struct path path;
int error; int error;
@ -572,9 +597,15 @@ retry:
return error; return error;
} }
SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename,
umode_t, mode)
{
return do_fchmodat(dfd, filename, mode);
}
SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode) SYSCALL_DEFINE2(chmod, const char __user *, filename, umode_t, mode)
{ {
return sys_fchmodat(AT_FDCWD, filename, mode); return do_fchmodat(AT_FDCWD, filename, mode);
} }
static int chown_common(const struct path *path, uid_t user, gid_t group) static int chown_common(const struct path *path, uid_t user, gid_t group)
@ -619,8 +650,8 @@ retry_deleg:
return error; return error;
} }
SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user, int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
gid_t, group, int, flag) int flag)
{ {
struct path path; struct path path;
int error = -EINVAL; int error = -EINVAL;
@ -651,18 +682,24 @@ out:
return error; return error;
} }
SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
gid_t, group, int, flag)
{
return do_fchownat(dfd, filename, user, group, flag);
}
SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group) SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
{ {
return sys_fchownat(AT_FDCWD, filename, user, group, 0); return do_fchownat(AT_FDCWD, filename, user, group, 0);
} }
SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group) SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group)
{ {
return sys_fchownat(AT_FDCWD, filename, user, group, return do_fchownat(AT_FDCWD, filename, user, group,
AT_SYMLINK_NOFOLLOW); AT_SYMLINK_NOFOLLOW);
} }
SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group) int ksys_fchown(unsigned int fd, uid_t user, gid_t group)
{ {
struct fd f = fdget(fd); struct fd f = fdget(fd);
int error = -EBADF; int error = -EBADF;
@ -682,6 +719,11 @@ out:
return error; return error;
} }
SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
{
return ksys_fchown(fd, user, group);
}
int open_check_o_direct(struct file *f) int open_check_o_direct(struct file *f)
{ {
/* NB: we're sure to have correct a_ops only after f_op->open */ /* NB: we're sure to have correct a_ops only after f_op->open */
@ -1114,7 +1156,7 @@ COMPAT_SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, fla
*/ */
SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode) SYSCALL_DEFINE2(creat, const char __user *, pathname, umode_t, mode)
{ {
return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode); return ksys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
} }
#endif #endif
@ -1163,7 +1205,6 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
return retval; return retval;
} }
EXPORT_SYMBOL(sys_close);
/* /*
* This routine simulates a hangup on the tty, to arrange that users * This routine simulates a hangup on the tty, to arrange that users

View File

@ -841,7 +841,7 @@ int do_pipe_flags(int *fd, int flags)
* sys_pipe() is the normal C calling standard for creating * sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way Unix traditionally does this, though. * a pipe. It's not the way Unix traditionally does this, though.
*/ */
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags) static int do_pipe2(int __user *fildes, int flags)
{ {
struct file *files[2]; struct file *files[2];
int fd[2]; int fd[2];
@ -863,9 +863,14 @@ SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
return error; return error;
} }
SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
{
return do_pipe2(fildes, flags);
}
SYSCALL_DEFINE1(pipe, int __user *, fildes) SYSCALL_DEFINE1(pipe, int __user *, fildes)
{ {
return sys_pipe2(fildes, 0); return do_pipe2(fildes, 0);
} }
static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt) static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt)

View File

@ -41,8 +41,9 @@ struct compat_fs_quota_stat {
__u16 qs_iwarnlimit; __u16 qs_iwarnlimit;
}; };
asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special, COMPAT_SYSCALL_DEFINE4(quotactl32, unsigned int, cmd,
qid_t id, void __user *addr) const char __user *, special, qid_t, id,
void __user *, addr)
{ {
unsigned int cmds; unsigned int cmds;
struct if_dqblk __user *dqblk; struct if_dqblk __user *dqblk;
@ -59,7 +60,7 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
case Q_GETQUOTA: case Q_GETQUOTA:
dqblk = compat_alloc_user_space(sizeof(struct if_dqblk)); dqblk = compat_alloc_user_space(sizeof(struct if_dqblk));
compat_dqblk = addr; compat_dqblk = addr;
ret = sys_quotactl(cmd, special, id, dqblk); ret = kernel_quotactl(cmd, special, id, dqblk);
if (ret) if (ret)
break; break;
if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) || if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) ||
@ -75,12 +76,12 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
get_user(data, &compat_dqblk->dqb_valid) || get_user(data, &compat_dqblk->dqb_valid) ||
put_user(data, &dqblk->dqb_valid)) put_user(data, &dqblk->dqb_valid))
break; break;
ret = sys_quotactl(cmd, special, id, dqblk); ret = kernel_quotactl(cmd, special, id, dqblk);
break; break;
case Q_XGETQSTAT: case Q_XGETQSTAT:
fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat)); fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat));
compat_fsqstat = addr; compat_fsqstat = addr;
ret = sys_quotactl(cmd, special, id, fsqstat); ret = kernel_quotactl(cmd, special, id, fsqstat);
if (ret) if (ret)
break; break;
ret = -EFAULT; ret = -EFAULT;
@ -113,7 +114,7 @@ asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
ret = 0; ret = 0;
break; break;
default: default:
ret = sys_quotactl(cmd, special, id, addr); ret = kernel_quotactl(cmd, special, id, addr);
} }
return ret; return ret;
} }

View File

@ -833,8 +833,8 @@ static struct super_block *quotactl_block(const char __user *special, int cmd)
* calls. Maybe we need to add the process quotas etc. in the future, * calls. Maybe we need to add the process quotas etc. in the future,
* but we probably should use rlimits for that. * but we probably should use rlimits for that.
*/ */
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special, int kernel_quotactl(unsigned int cmd, const char __user *special,
qid_t, id, void __user *, addr) qid_t id, void __user *addr)
{ {
uint cmds, type; uint cmds, type;
struct super_block *sb = NULL; struct super_block *sb = NULL;
@ -885,3 +885,9 @@ out:
path_put(pathp); path_put(pathp);
return ret; return ret;
} }
SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
qid_t, id, void __user *, addr)
{
return kernel_quotactl(cmd, special, id, addr);
}

View File

@ -301,7 +301,7 @@ loff_t vfs_llseek(struct file *file, loff_t offset, int whence)
} }
EXPORT_SYMBOL(vfs_llseek); EXPORT_SYMBOL(vfs_llseek);
SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence) off_t ksys_lseek(unsigned int fd, off_t offset, unsigned int whence)
{ {
off_t retval; off_t retval;
struct fd f = fdget_pos(fd); struct fd f = fdget_pos(fd);
@ -319,10 +319,15 @@ SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
return retval; return retval;
} }
SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
{
return ksys_lseek(fd, offset, whence);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence) COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence)
{ {
return sys_lseek(fd, offset, whence); return ksys_lseek(fd, offset, whence);
} }
#endif #endif
@ -563,7 +568,7 @@ static inline void file_pos_write(struct file *file, loff_t pos)
file->f_pos = pos; file->f_pos = pos;
} }
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) ssize_t ksys_read(unsigned int fd, char __user *buf, size_t count)
{ {
struct fd f = fdget_pos(fd); struct fd f = fdget_pos(fd);
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
@ -578,8 +583,12 @@ SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
return ret; return ret;
} }
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
size_t, count) {
return ksys_read(fd, buf, count);
}
ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count)
{ {
struct fd f = fdget_pos(fd); struct fd f = fdget_pos(fd);
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
@ -595,8 +604,14 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
return ret; return ret;
} }
SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf, SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
size_t, count, loff_t, pos) size_t, count)
{
return ksys_write(fd, buf, count);
}
ssize_t ksys_pread64(unsigned int fd, char __user *buf, size_t count,
loff_t pos)
{ {
struct fd f; struct fd f;
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
@ -615,8 +630,14 @@ SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
return ret; return ret;
} }
SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf, SYSCALL_DEFINE4(pread64, unsigned int, fd, char __user *, buf,
size_t, count, loff_t, pos) size_t, count, loff_t, pos)
{
return ksys_pread64(fd, buf, count, pos);
}
ssize_t ksys_pwrite64(unsigned int fd, const char __user *buf,
size_t count, loff_t pos)
{ {
struct fd f; struct fd f;
ssize_t ret = -EBADF; ssize_t ret = -EBADF;
@ -635,6 +656,12 @@ SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
return ret; return ret;
} }
SYSCALL_DEFINE4(pwrite64, unsigned int, fd, const char __user *, buf,
size_t, count, loff_t, pos)
{
return ksys_pwrite64(fd, buf, count, pos);
}
static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter, static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter,
loff_t *ppos, int type, rwf_t flags) loff_t *ppos, int type, rwf_t flags)
{ {

View File

@ -292,8 +292,8 @@ efault:
return -EFAULT; return -EFAULT;
} }
SYSCALL_DEFINE3(getdents64, unsigned int, fd, int ksys_getdents64(unsigned int fd, struct linux_dirent64 __user *dirent,
struct linux_dirent64 __user *, dirent, unsigned int, count) unsigned int count)
{ {
struct fd f; struct fd f;
struct linux_dirent64 __user * lastdirent; struct linux_dirent64 __user * lastdirent;
@ -326,6 +326,13 @@ SYSCALL_DEFINE3(getdents64, unsigned int, fd,
return error; return error;
} }
SYSCALL_DEFINE3(getdents64, unsigned int, fd,
struct linux_dirent64 __user *, dirent, unsigned int, count)
{
return ksys_getdents64(fd, dirent, count);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct compat_old_linux_dirent { struct compat_old_linux_dirent {
compat_ulong_t d_ino; compat_ulong_t d_ino;

View File

@ -675,8 +675,8 @@ out_nofds:
return ret; return ret;
} }
SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp, static int kern_select(int n, fd_set __user *inp, fd_set __user *outp,
fd_set __user *, exp, struct timeval __user *, tvp) fd_set __user *exp, struct timeval __user *tvp)
{ {
struct timespec64 end_time, *to = NULL; struct timespec64 end_time, *to = NULL;
struct timeval tv; struct timeval tv;
@ -699,6 +699,12 @@ SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
return ret; return ret;
} }
SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
fd_set __user *, exp, struct timeval __user *, tvp)
{
return kern_select(n, inp, outp, exp, tvp);
}
static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp, static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
fd_set __user *exp, struct timespec __user *tsp, fd_set __user *exp, struct timespec __user *tsp,
const sigset_t __user *sigmask, size_t sigsetsize) const sigset_t __user *sigmask, size_t sigsetsize)
@ -784,7 +790,7 @@ SYSCALL_DEFINE1(old_select, struct sel_arg_struct __user *, arg)
if (copy_from_user(&a, arg, sizeof(a))) if (copy_from_user(&a, arg, sizeof(a)))
return -EFAULT; return -EFAULT;
return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); return kern_select(a.n, a.inp, a.outp, a.exp, a.tvp);
} }
#endif #endif
@ -1259,9 +1265,9 @@ out_nofds:
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp, static int do_compat_select(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp, compat_ulong_t __user *outp, compat_ulong_t __user *exp,
struct compat_timeval __user *, tvp) struct compat_timeval __user *tvp)
{ {
struct timespec64 end_time, *to = NULL; struct timespec64 end_time, *to = NULL;
struct compat_timeval tv; struct compat_timeval tv;
@ -1284,6 +1290,13 @@ COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE5(select, int, n, compat_ulong_t __user *, inp,
compat_ulong_t __user *, outp, compat_ulong_t __user *, exp,
struct compat_timeval __user *, tvp)
{
return do_compat_select(n, inp, outp, exp, tvp);
}
struct compat_sel_arg_struct { struct compat_sel_arg_struct {
compat_ulong_t n; compat_ulong_t n;
compat_uptr_t inp; compat_uptr_t inp;
@ -1298,8 +1311,8 @@ COMPAT_SYSCALL_DEFINE1(old_select, struct compat_sel_arg_struct __user *, arg)
if (copy_from_user(&a, arg, sizeof(a))) if (copy_from_user(&a, arg, sizeof(a)))
return -EFAULT; return -EFAULT;
return compat_sys_select(a.n, compat_ptr(a.inp), compat_ptr(a.outp), return do_compat_select(a.n, compat_ptr(a.inp), compat_ptr(a.outp),
compat_ptr(a.exp), compat_ptr(a.tvp)); compat_ptr(a.exp), compat_ptr(a.tvp));
} }
static long do_compat_pselect(int n, compat_ulong_t __user *inp, static long do_compat_pselect(int n, compat_ulong_t __user *inp,

View File

@ -256,8 +256,8 @@ static const struct file_operations signalfd_fops = {
.llseek = noop_llseek, .llseek = noop_llseek,
}; };
SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask, static int do_signalfd4(int ufd, sigset_t __user *user_mask, size_t sizemask,
size_t, sizemask, int, flags) int flags)
{ {
sigset_t sigmask; sigset_t sigmask;
struct signalfd_ctx *ctx; struct signalfd_ctx *ctx;
@ -310,17 +310,22 @@ SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
return ufd; return ufd;
} }
SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
size_t, sizemask, int, flags)
{
return do_signalfd4(ufd, user_mask, sizemask, flags);
}
SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask, SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
size_t, sizemask) size_t, sizemask)
{ {
return sys_signalfd4(ufd, user_mask, sizemask, 0); return do_signalfd4(ufd, user_mask, sizemask, 0);
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd, static long do_compat_signalfd4(int ufd,
const compat_sigset_t __user *,sigmask, const compat_sigset_t __user *sigmask,
compat_size_t, sigsetsize, compat_size_t sigsetsize, int flags)
int, flags)
{ {
sigset_t tmp; sigset_t tmp;
sigset_t __user *ksigmask; sigset_t __user *ksigmask;
@ -333,13 +338,21 @@ COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd,
if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t))) if (copy_to_user(ksigmask, &tmp, sizeof(sigset_t)))
return -EFAULT; return -EFAULT;
return sys_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags); return do_signalfd4(ufd, ksigmask, sizeof(sigset_t), flags);
}
COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd,
const compat_sigset_t __user *, sigmask,
compat_size_t, sigsetsize,
int, flags)
{
return do_compat_signalfd4(ufd, sigmask, sigsetsize, flags);
} }
COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd, COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd,
const compat_sigset_t __user *,sigmask, const compat_sigset_t __user *,sigmask,
compat_size_t, sigsetsize) compat_size_t, sigsetsize)
{ {
return compat_sys_signalfd4(ufd, sigmask, sigsetsize, 0); return do_compat_signalfd4(ufd, sigmask, sigsetsize, 0);
} }
#endif #endif

View File

@ -1331,8 +1331,8 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *uiov,
* Currently we punt and implement it as a normal copy, see pipe_to_user(). * Currently we punt and implement it as a normal copy, see pipe_to_user().
* *
*/ */
SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov, static long do_vmsplice(int fd, const struct iovec __user *iov,
unsigned long, nr_segs, unsigned int, flags) unsigned long nr_segs, unsigned int flags)
{ {
struct fd f; struct fd f;
long error; long error;
@ -1358,6 +1358,12 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
return error; return error;
} }
SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
unsigned long, nr_segs, unsigned int, flags)
{
return do_vmsplice(fd, iov, nr_segs, flags);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32, COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
unsigned int, nr_segs, unsigned int, flags) unsigned int, nr_segs, unsigned int, flags)
@ -1375,7 +1381,7 @@ COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, io
put_user(v.iov_len, &iov[i].iov_len)) put_user(v.iov_len, &iov[i].iov_len))
return -EFAULT; return -EFAULT;
} }
return sys_vmsplice(fd, iov, nr_segs, flags); return do_vmsplice(fd, iov, nr_segs, flags);
} }
#endif #endif

View File

@ -379,8 +379,8 @@ SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf)
return error; return error;
} }
SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname, static int do_readlinkat(int dfd, const char __user *pathname,
char __user *, buf, int, bufsiz) char __user *buf, int bufsiz)
{ {
struct path path; struct path path;
int error; int error;
@ -415,10 +415,16 @@ retry:
return error; return error;
} }
SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
char __user *, buf, int, bufsiz)
{
return do_readlinkat(dfd, pathname, buf, bufsiz);
}
SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf, SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf,
int, bufsiz) int, bufsiz)
{ {
return sys_readlinkat(AT_FDCWD, path, buf, bufsiz); return do_readlinkat(AT_FDCWD, path, buf, bufsiz);
} }

View File

@ -105,7 +105,7 @@ static void fdatawait_one_bdev(struct block_device *bdev, void *arg)
* just write metadata (such as inodes or bitmaps) to block device page cache * just write metadata (such as inodes or bitmaps) to block device page cache
* and do not sync it on their own in ->sync_fs(). * and do not sync it on their own in ->sync_fs().
*/ */
SYSCALL_DEFINE0(sync) void ksys_sync(void)
{ {
int nowait = 0, wait = 1; int nowait = 0, wait = 1;
@ -117,6 +117,11 @@ SYSCALL_DEFINE0(sync)
iterate_bdevs(fdatawait_one_bdev, NULL); iterate_bdevs(fdatawait_one_bdev, NULL);
if (unlikely(laptop_mode)) if (unlikely(laptop_mode))
laptop_sync_completion(); laptop_sync_completion();
}
SYSCALL_DEFINE0(sync)
{
ksys_sync();
return 0; return 0;
} }
@ -280,8 +285,8 @@ SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
* already-instantiated disk blocks, there are no guarantees here that the data * already-instantiated disk blocks, there are no guarantees here that the data
* will be available after a crash. * will be available after a crash.
*/ */
SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes, int ksys_sync_file_range(int fd, loff_t offset, loff_t nbytes,
unsigned int, flags) unsigned int flags)
{ {
int ret; int ret;
struct fd f; struct fd f;
@ -359,10 +364,16 @@ out:
return ret; return ret;
} }
SYSCALL_DEFINE4(sync_file_range, int, fd, loff_t, offset, loff_t, nbytes,
unsigned int, flags)
{
return ksys_sync_file_range(fd, offset, nbytes, flags);
}
/* It would be nice if people remember that not all the world's an i386 /* It would be nice if people remember that not all the world's an i386
when they introduce new system calls */ when they introduce new system calls */
SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags, SYSCALL_DEFINE4(sync_file_range2, int, fd, unsigned int, flags,
loff_t, offset, loff_t, nbytes) loff_t, offset, loff_t, nbytes)
{ {
return sys_sync_file_range(fd, offset, nbytes, flags); return ksys_sync_file_range(fd, offset, nbytes, flags);
} }

View File

@ -184,8 +184,8 @@ SYSCALL_DEFINE4(utimensat, int, dfd, const char __user *, filename,
return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags); return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
} }
SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename, static long do_futimesat(int dfd, const char __user *filename,
struct timeval __user *, utimes) struct timeval __user *utimes)
{ {
struct timeval times[2]; struct timeval times[2];
struct timespec64 tstimes[2]; struct timespec64 tstimes[2];
@ -212,10 +212,17 @@ SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0); return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0);
} }
SYSCALL_DEFINE3(futimesat, int, dfd, const char __user *, filename,
struct timeval __user *, utimes)
{
return do_futimesat(dfd, filename, utimes);
}
SYSCALL_DEFINE2(utimes, char __user *, filename, SYSCALL_DEFINE2(utimes, char __user *, filename,
struct timeval __user *, utimes) struct timeval __user *, utimes)
{ {
return sys_futimesat(AT_FDCWD, filename, utimes); return do_futimesat(AT_FDCWD, filename, utimes);
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
@ -253,7 +260,8 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
return do_utimes(dfd, filename, t ? tv : NULL, flags); return do_utimes(dfd, filename, t ? tv : NULL, flags);
} }
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, const char __user *, filename, struct compat_timeval __user *, t) static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
struct compat_timeval __user *t)
{ {
struct timespec64 tv[2]; struct timespec64 tv[2];
@ -272,8 +280,15 @@ COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd, const char __user *, filena
return do_utimes(dfd, filename, t ? tv : NULL, 0); return do_utimes(dfd, filename, t ? tv : NULL, 0);
} }
COMPAT_SYSCALL_DEFINE3(futimesat, unsigned int, dfd,
const char __user *, filename,
struct compat_timeval __user *, t)
{
return do_compat_futimesat(dfd, filename, t);
}
COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct compat_timeval __user *, t) COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct compat_timeval __user *, t)
{ {
return compat_sys_futimesat(AT_FDCWD, filename, t); return do_compat_futimesat(AT_FDCWD, filename, t);
} }
#endif #endif

View File

@ -33,6 +33,8 @@
#endif #endif
#define COMPAT_SYSCALL_DEFINE0(name) \ #define COMPAT_SYSCALL_DEFINE0(name) \
asmlinkage long compat_sys_##name(void); \
ALLOW_ERROR_INJECTION(compat_sys_##name, ERRNO); \
asmlinkage long compat_sys_##name(void) asmlinkage long compat_sys_##name(void)
#define COMPAT_SYSCALL_DEFINE1(name, ...) \ #define COMPAT_SYSCALL_DEFINE1(name, ...) \
@ -49,8 +51,10 @@
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\ asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))\
__attribute__((alias(__stringify(compat_SyS##name)))); \ __attribute__((alias(__stringify(compat_SyS##name)))); \
ALLOW_ERROR_INJECTION(compat_sys##name, ERRNO); \
static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\ static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__));\ asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__));\
asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\ asmlinkage long compat_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))\
@ -305,10 +309,6 @@ extern int put_compat_rusage(const struct rusage *,
struct compat_siginfo; struct compat_siginfo;
extern asmlinkage long compat_sys_waitid(int, compat_pid_t,
struct compat_siginfo __user *, int,
struct compat_rusage __user *);
struct compat_dirent { struct compat_dirent {
u32 d_ino; u32 d_ino;
compat_off_t d_off; compat_off_t d_off;
@ -422,87 +422,6 @@ struct compat_msgbuf;
extern void compat_exit_robust_list(struct task_struct *curr); extern void compat_exit_robust_list(struct task_struct *curr);
asmlinkage long
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
compat_size_t len);
asmlinkage long
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
compat_size_t __user *len_ptr);
asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
compat_ssize_t msgsz, int msgflg);
asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,
compat_ssize_t msgsz, compat_long_t msgtyp, int msgflg);
long compat_sys_msgctl(int first, int second, void __user *uptr);
long compat_sys_shmctl(int first, int second, void __user *uptr);
long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned nsems, const struct compat_timespec __user *timeout);
asmlinkage long compat_sys_keyctl(u32 option,
u32 arg2, u32 arg3, u32 arg4, u32 arg5);
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd,
const struct compat_iovec __user *vec, compat_ulong_t vlen);
asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd,
const struct compat_iovec __user *vec, compat_ulong_t vlen);
asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
#ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
asmlinkage long compat_sys_preadv64(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos);
#endif
#ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
asmlinkage long compat_sys_pwritev64(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos);
#endif
#ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2
asmlinkage long compat_sys_readv64v2(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos, rwf_t flags);
#endif
#ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2
asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos, rwf_t flags);
#endif
asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
const compat_uptr_t __user *envp);
asmlinkage long compat_sys_execveat(int dfd, const char __user *filename,
const compat_uptr_t __user *argv,
const compat_uptr_t __user *envp, int flags);
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
struct compat_timeval __user *tvp);
asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg);
asmlinkage long compat_sys_wait4(compat_pid_t pid,
compat_uint_t __user *stat_addr, int options,
struct compat_rusage __user *ru);
#define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t)) #define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t))
#define BITS_TO_COMPAT_LONGS(bits) DIV_ROUND_UP(bits, BITS_PER_COMPAT_LONG) #define BITS_TO_COMPAT_LONGS(bits) DIV_ROUND_UP(bits, BITS_PER_COMPAT_LONG)
@ -515,13 +434,6 @@ int copy_siginfo_from_user32(siginfo_t *to, const struct compat_siginfo __user *
int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *from); int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *from);
int get_compat_sigevent(struct sigevent *event, int get_compat_sigevent(struct sigevent *event,
const struct compat_sigevent __user *u_event); const struct compat_sigevent __user *u_event);
long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
struct compat_siginfo __user *uinfo);
#ifdef CONFIG_COMPAT_OLD_SIGACTION
asmlinkage long compat_sys_sigaction(int sig,
const struct compat_old_sigaction __user *act,
struct compat_old_sigaction __user *oact);
#endif
static inline int compat_timeval_compare(struct compat_timeval *lhs, static inline int compat_timeval_compare(struct compat_timeval *lhs,
struct compat_timeval *rhs) struct compat_timeval *rhs)
@ -543,13 +455,6 @@ static inline int compat_timespec_compare(struct compat_timespec *lhs,
return lhs->tv_nsec - rhs->tv_nsec; return lhs->tv_nsec - rhs->tv_nsec;
} }
asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv,
struct timezone __user *tz);
asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
struct timezone __user *tz);
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat); extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
/* /*
@ -575,237 +480,14 @@ put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
#endif #endif
} }
asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
const compat_ulong_t __user *new_nodes);
extern int compat_ptrace_request(struct task_struct *child, extern int compat_ptrace_request(struct task_struct *child,
compat_long_t request, compat_long_t request,
compat_ulong_t addr, compat_ulong_t data); compat_ulong_t addr, compat_ulong_t data);
extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
compat_ulong_t addr, compat_ulong_t data); compat_ulong_t addr, compat_ulong_t data);
asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
compat_long_t addr, compat_long_t data);
asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
/*
* epoll (fs/eventpoll.c) compat bits follow ...
*/
struct epoll_event; /* fortunately, this one is fixed-layout */ struct epoll_event; /* fortunately, this one is fixed-layout */
asmlinkage long compat_sys_epoll_pwait(int epfd,
struct epoll_event __user *events,
int maxevents, int timeout,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
asmlinkage long compat_sys_utime(const char __user *filename,
struct compat_utimbuf __user *t);
asmlinkage long compat_sys_utimensat(unsigned int dfd,
const char __user *filename,
struct compat_timespec __user *t,
int flags);
asmlinkage long compat_sys_time(compat_time_t __user *tloc);
asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
asmlinkage long compat_sys_signalfd(int ufd,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
const struct compat_itimerspec __user *utmr,
struct compat_itimerspec __user *otmr);
asmlinkage long compat_sys_timerfd_gettime(int ufd,
struct compat_itimerspec __user *otmr);
asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
__u32 __user *pages,
const int __user *nodes,
int __user *status,
int flags);
asmlinkage long compat_sys_futimesat(unsigned int dfd,
const char __user *filename,
struct compat_timeval __user *t);
asmlinkage long compat_sys_utimes(const char __user *filename,
struct compat_timeval __user *t);
asmlinkage long compat_sys_newstat(const char __user *filename,
struct compat_stat __user *statbuf);
asmlinkage long compat_sys_newlstat(const char __user *filename,
struct compat_stat __user *statbuf);
asmlinkage long compat_sys_newfstatat(unsigned int dfd,
const char __user *filename,
struct compat_stat __user *statbuf,
int flag);
asmlinkage long compat_sys_newfstat(unsigned int fd,
struct compat_stat __user *statbuf);
asmlinkage long compat_sys_statfs(const char __user *pathname,
struct compat_statfs __user *buf);
asmlinkage long compat_sys_fstatfs(unsigned int fd,
struct compat_statfs __user *buf);
asmlinkage long compat_sys_statfs64(const char __user *pathname,
compat_size_t sz,
struct compat_statfs64 __user *buf);
asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
struct compat_statfs64 __user *buf);
asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id,
compat_long_t min_nr,
compat_long_t nr,
struct io_event __user *events,
struct compat_timespec __user *timeout);
asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
u32 __user *iocb);
asmlinkage long compat_sys_mount(const char __user *dev_name,
const char __user *dir_name,
const char __user *type, compat_ulong_t flags,
const void __user *data);
asmlinkage long compat_sys_old_readdir(unsigned int fd,
struct compat_old_linux_dirent __user *,
unsigned int count);
asmlinkage long compat_sys_getdents(unsigned int fd,
struct compat_linux_dirent __user *dirent,
unsigned int count);
asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
unsigned int nr_segs, unsigned int flags);
asmlinkage long compat_sys_open(const char __user *filename, int flags,
umode_t mode);
asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
int flags, umode_t mode);
asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
struct file_handle __user *handle,
int flags);
asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp,
compat_ulong_t __user *exp,
struct compat_timespec __user *tsp,
void __user *sig);
asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
unsigned int nfds,
struct compat_timespec __user *tsp,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
asmlinkage long compat_sys_signalfd4(int ufd,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize, int flags);
asmlinkage long compat_sys_get_mempolicy(int __user *policy,
compat_ulong_t __user *nmask,
compat_ulong_t maxnode,
compat_ulong_t addr,
compat_ulong_t flags);
asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
compat_ulong_t maxnode);
asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
compat_ulong_t mode,
compat_ulong_t __user *nmask,
compat_ulong_t maxnode, compat_ulong_t flags);
asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
char __user *optval, unsigned int optlen);
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
unsigned flags);
asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
unsigned vlen, unsigned int flags);
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
unsigned int flags);
asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
unsigned flags);
asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len,
unsigned flags, struct sockaddr __user *addr,
int __user *addrlen);
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
unsigned vlen, unsigned int flags,
struct compat_timespec __user *timeout);
asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
struct compat_timespec __user *rmtp);
asmlinkage long compat_sys_getitimer(int which,
struct compat_itimerval __user *it);
asmlinkage long compat_sys_setitimer(int which,
struct compat_itimerval __user *in,
struct compat_itimerval __user *out);
asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
asmlinkage long compat_sys_setrlimit(unsigned int resource,
struct compat_rlimit __user *rlim);
asmlinkage long compat_sys_getrlimit(unsigned int resource,
struct compat_rlimit __user *rlim);
asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
unsigned int len,
compat_ulong_t __user *user_mask_ptr);
asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
unsigned int len,
compat_ulong_t __user *user_mask_ptr);
asmlinkage long compat_sys_timer_create(clockid_t which_clock,
struct compat_sigevent __user *timer_event_spec,
timer_t __user *created_timer_id);
asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
struct compat_itimerspec __user *new,
struct compat_itimerspec __user *old);
asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
struct compat_itimerspec __user *setting);
asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock,
struct compat_timex __user *tp);
asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
struct compat_timespec __user *rqtp,
struct compat_timespec __user *rmtp);
asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
struct compat_siginfo __user *uinfo,
struct compat_timespec __user *uts, compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
compat_sigset_t __user *oset,
compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
compat_size_t sigsetsize);
#ifndef CONFIG_ODD_RT_SIGACTION
asmlinkage long compat_sys_rt_sigaction(int,
const struct compat_sigaction __user *,
struct compat_sigaction __user *,
compat_size_t);
#endif
asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
struct compat_siginfo __user *uinfo);
asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
struct compat_timespec __user *utime, u32 __user *uaddr2,
u32 val3);
asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
char __user *optval, int __user *optlen);
asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,
compat_ulong_t nr_segments,
struct compat_kexec_segment __user *,
compat_ulong_t flags);
asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
const struct compat_mq_attr __user *u_mqstat,
struct compat_mq_attr __user *u_omqstat);
asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
const struct compat_sigevent __user *u_notification);
asmlinkage long compat_sys_mq_open(const char __user *u_name,
int oflag, compat_mode_t mode,
struct compat_mq_attr __user *u_attr);
asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
const char __user *u_msg_ptr,
compat_size_t msg_len, unsigned int msg_prio,
const struct compat_timespec __user *u_abs_timeout);
asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
char __user *u_msg_ptr,
compat_size_t msg_len, unsigned int __user *u_msg_prio,
const struct compat_timespec __user *u_abs_timeout);
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args);
extern ssize_t compat_rw_copy_check_uvector(int type, extern ssize_t compat_rw_copy_check_uvector(int type,
const struct compat_iovec __user *uvector, const struct compat_iovec __user *uvector,
@ -815,31 +497,6 @@ extern ssize_t compat_rw_copy_check_uvector(int type,
extern void __user *compat_alloc_user_space(unsigned long len); extern void __user *compat_alloc_user_space(unsigned long len);
asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid,
const struct compat_iovec __user *lvec,
compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
compat_ulong_t riovcnt, compat_ulong_t flags);
asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
const struct compat_iovec __user *lvec,
compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
compat_ulong_t riovcnt, compat_ulong_t flags);
asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
compat_off_t __user *offset, compat_size_t count);
asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
compat_loff_t __user *offset, compat_size_t count);
asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
compat_stack_t __user *uoss_ptr);
#ifdef __ARCH_WANT_SYS_SIGPENDING
asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set);
#endif
#ifdef __ARCH_WANT_SYS_SIGPROCMASK
asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *nset,
compat_old_sigset_t __user *oset);
#endif
int compat_restore_altstack(const compat_stack_t __user *uss); int compat_restore_altstack(const compat_stack_t __user *uss);
int __compat_save_altstack(compat_stack_t __user *, unsigned long); int __compat_save_altstack(compat_stack_t __user *, unsigned long);
#define compat_save_altstack_ex(uss, sp) do { \ #define compat_save_altstack_ex(uss, sp) do { \
@ -852,13 +509,452 @@ int __compat_save_altstack(compat_stack_t __user *, unsigned long);
sas_ss_reset(t); \ sas_ss_reset(t); \
} while (0); } while (0);
/*
* These syscall function prototypes are kept in the same order as
* include/uapi/asm-generic/unistd.h. Deprecated or obsolete system calls
* go below.
*
* Please note that these prototypes here are only provided for information
* purposes, for static analysis, and for linking from the syscall table.
* These functions should not be called elsewhere from kernel code.
*/
asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
u32 __user *iocb);
asmlinkage long compat_sys_io_getevents(compat_aio_context_t ctx_id,
compat_long_t min_nr,
compat_long_t nr,
struct io_event __user *events,
struct compat_timespec __user *timeout);
/* fs/cookies.c */
asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
/* fs/eventpoll.c */
asmlinkage long compat_sys_epoll_pwait(int epfd,
struct epoll_event __user *events,
int maxevents, int timeout,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
/* fs/fcntl.c */
asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
/* fs/ioctl.c */
asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
compat_ulong_t arg);
/* fs/namespace.c */
asmlinkage long compat_sys_mount(const char __user *dev_name,
const char __user *dir_name,
const char __user *type, compat_ulong_t flags,
const void __user *data);
/* fs/open.c */
asmlinkage long compat_sys_statfs(const char __user *pathname,
struct compat_statfs __user *buf);
asmlinkage long compat_sys_statfs64(const char __user *pathname,
compat_size_t sz,
struct compat_statfs64 __user *buf);
asmlinkage long compat_sys_fstatfs(unsigned int fd,
struct compat_statfs __user *buf);
asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
struct compat_statfs64 __user *buf);
asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
/* No generic prototype for truncate64, ftruncate64, fallocate */
asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
int flags, umode_t mode);
/* fs/readdir.c */
asmlinkage long compat_sys_getdents(unsigned int fd,
struct compat_linux_dirent __user *dirent,
unsigned int count);
/* fs/read_write.c */
asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd,
const struct compat_iovec __user *vec, compat_ulong_t vlen);
asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd,
const struct compat_iovec __user *vec, compat_ulong_t vlen);
/* No generic prototype for pread64 and pwrite64 */
asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high);
#ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
asmlinkage long compat_sys_preadv64(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos);
#endif
#ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
asmlinkage long compat_sys_pwritev64(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos);
#endif
/* fs/sendfile.c */
asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
compat_off_t __user *offset, compat_size_t count);
asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
compat_loff_t __user *offset, compat_size_t count);
/* fs/select.c */
asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp,
compat_ulong_t __user *exp,
struct compat_timespec __user *tsp,
void __user *sig);
asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
unsigned int nfds,
struct compat_timespec __user *tsp,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
/* fs/signalfd.c */
asmlinkage long compat_sys_signalfd4(int ufd,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize, int flags);
/* fs/splice.c */
asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
unsigned int nr_segs, unsigned int flags);
/* fs/stat.c */
asmlinkage long compat_sys_newfstatat(unsigned int dfd,
const char __user *filename,
struct compat_stat __user *statbuf,
int flag);
asmlinkage long compat_sys_newfstat(unsigned int fd,
struct compat_stat __user *statbuf);
/* fs/sync.c: No generic prototype for sync_file_range and sync_file_range2 */
/* fs/timerfd.c */
asmlinkage long compat_sys_timerfd_gettime(int ufd,
struct compat_itimerspec __user *otmr);
asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
const struct compat_itimerspec __user *utmr,
struct compat_itimerspec __user *otmr);
/* fs/utimes.c */
asmlinkage long compat_sys_utimensat(unsigned int dfd,
const char __user *filename,
struct compat_timespec __user *t,
int flags);
/* kernel/exit.c */
asmlinkage long compat_sys_waitid(int, compat_pid_t,
struct compat_siginfo __user *, int,
struct compat_rusage __user *);
/* kernel/futex.c */
asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
struct compat_timespec __user *utime, u32 __user *uaddr2,
u32 val3);
asmlinkage long
compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
compat_size_t len);
asmlinkage long
compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
compat_size_t __user *len_ptr);
/* kernel/hrtimer.c */
asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
struct compat_timespec __user *rmtp);
/* kernel/itimer.c */
asmlinkage long compat_sys_getitimer(int which,
struct compat_itimerval __user *it);
asmlinkage long compat_sys_setitimer(int which,
struct compat_itimerval __user *in,
struct compat_itimerval __user *out);
/* kernel/kexec.c */
asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,
compat_ulong_t nr_segments,
struct compat_kexec_segment __user *,
compat_ulong_t flags);
/* kernel/posix-timers.c */
asmlinkage long compat_sys_timer_create(clockid_t which_clock,
struct compat_sigevent __user *timer_event_spec,
timer_t __user *created_timer_id);
asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
struct compat_itimerspec __user *setting);
asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
struct compat_itimerspec __user *new,
struct compat_itimerspec __user *old);
asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
struct compat_timespec __user *tp);
asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
struct compat_timespec __user *rqtp,
struct compat_timespec __user *rmtp);
/* kernel/ptrace.c */
asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
compat_long_t addr, compat_long_t data);
/* kernel/sched/core.c */
asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
unsigned int len,
compat_ulong_t __user *user_mask_ptr);
asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
unsigned int len,
compat_ulong_t __user *user_mask_ptr);
asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
struct compat_timespec __user *interval); struct compat_timespec __user *interval);
/* kernel/signal.c */
asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
compat_stack_t __user *uoss_ptr);
asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
compat_size_t sigsetsize);
#ifndef CONFIG_ODD_RT_SIGACTION
asmlinkage long compat_sys_rt_sigaction(int,
const struct compat_sigaction __user *,
struct compat_sigaction __user *,
compat_size_t);
#endif
asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
compat_sigset_t __user *oset,
compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
struct compat_siginfo __user *uinfo,
struct compat_timespec __user *uts, compat_size_t sigsetsize);
asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
struct compat_siginfo __user *uinfo);
/* No generic prototype for rt_sigreturn */
/* kernel/sys.c */
asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
asmlinkage long compat_sys_getrlimit(unsigned int resource,
struct compat_rlimit __user *rlim);
asmlinkage long compat_sys_setrlimit(unsigned int resource,
struct compat_rlimit __user *rlim);
asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
/* kernel/time.c */
asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv,
struct timezone __user *tz);
asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
struct timezone __user *tz);
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
/* kernel/timer.c */
asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
/* ipc/mqueue.c */
asmlinkage long compat_sys_mq_open(const char __user *u_name,
int oflag, compat_mode_t mode,
struct compat_mq_attr __user *u_attr);
asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
const char __user *u_msg_ptr,
compat_size_t msg_len, unsigned int msg_prio,
const struct compat_timespec __user *u_abs_timeout);
asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
char __user *u_msg_ptr,
compat_size_t msg_len, unsigned int __user *u_msg_prio,
const struct compat_timespec __user *u_abs_timeout);
asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
const struct compat_sigevent __user *u_notification);
asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
const struct compat_mq_attr __user *u_mqstat,
struct compat_mq_attr __user *u_omqstat);
/* ipc/msg.c */
asmlinkage long compat_sys_msgctl(int first, int second, void __user *uptr);
asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,
compat_ssize_t msgsz, compat_long_t msgtyp, int msgflg);
asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
compat_ssize_t msgsz, int msgflg);
/* ipc/sem.c */
asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
asmlinkage long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned nsems, const struct compat_timespec __user *timeout);
/* ipc/shm.c */
asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr);
asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
/* net/socket.c */
asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len,
unsigned flags, struct sockaddr __user *addr,
int __user *addrlen);
asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
char __user *optval, unsigned int optlen);
asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
char __user *optval, int __user *optlen);
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
unsigned flags);
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
unsigned int flags);
/* mm/filemap.c: No generic prototype for readahead */
/* security/keys/keyctl.c */
asmlinkage long compat_sys_keyctl(u32 option,
u32 arg2, u32 arg3, u32 arg4, u32 arg5);
/* arch/example/kernel/sys_example.c */
asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
const compat_uptr_t __user *envp);
/* mm/fadvise.c: No generic prototype for fadvise64_64 */
/* mm/, CONFIG_MMU only */
asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
compat_ulong_t mode,
compat_ulong_t __user *nmask,
compat_ulong_t maxnode, compat_ulong_t flags);
asmlinkage long compat_sys_get_mempolicy(int __user *policy,
compat_ulong_t __user *nmask,
compat_ulong_t maxnode,
compat_ulong_t addr,
compat_ulong_t flags);
asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
compat_ulong_t maxnode);
asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
const compat_ulong_t __user *new_nodes);
asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
__u32 __user *pages,
const int __user *nodes,
int __user *status,
int flags);
asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
compat_pid_t pid, int sig,
struct compat_siginfo __user *uinfo);
asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
unsigned vlen, unsigned int flags,
struct compat_timespec __user *timeout);
asmlinkage long compat_sys_wait4(compat_pid_t pid,
compat_uint_t __user *stat_addr, int options,
struct compat_rusage __user *ru);
asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32, asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,
int, const char __user *); int, const char __user *);
asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
struct file_handle __user *handle,
int flags);
asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock,
struct compat_timex __user *tp);
asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
unsigned vlen, unsigned int flags);
asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid,
const struct compat_iovec __user *lvec,
compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
compat_ulong_t riovcnt, compat_ulong_t flags);
asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
const struct compat_iovec __user *lvec,
compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
compat_ulong_t riovcnt, compat_ulong_t flags);
asmlinkage long compat_sys_execveat(int dfd, const char __user *filename,
const compat_uptr_t __user *argv,
const compat_uptr_t __user *envp, int flags);
asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd,
const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
#ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2
asmlinkage long compat_sys_readv64v2(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos, rwf_t flags);
#endif
#ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2
asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
const struct compat_iovec __user *vec,
unsigned long vlen, loff_t pos, rwf_t flags);
#endif
/*
* Deprecated system calls which are still defined in
* include/uapi/asm-generic/unistd.h and wanted by >= 1 arch
*/
/* __ARCH_WANT_SYSCALL_NO_AT */
asmlinkage long compat_sys_open(const char __user *filename, int flags,
umode_t mode);
asmlinkage long compat_sys_utimes(const char __user *filename,
struct compat_timeval __user *t);
/* __ARCH_WANT_SYSCALL_NO_FLAGS */
asmlinkage long compat_sys_signalfd(int ufd,
const compat_sigset_t __user *sigmask,
compat_size_t sigsetsize);
/* __ARCH_WANT_SYSCALL_OFF_T */
asmlinkage long compat_sys_newstat(const char __user *filename,
struct compat_stat __user *statbuf);
asmlinkage long compat_sys_newlstat(const char __user *filename,
struct compat_stat __user *statbuf);
/* __ARCH_WANT_SYSCALL_DEPRECATED */
asmlinkage long compat_sys_time(compat_time_t __user *tloc);
asmlinkage long compat_sys_utime(const char __user *filename,
struct compat_utimbuf __user *t);
asmlinkage long compat_sys_futimesat(unsigned int dfd,
const char __user *filename,
struct compat_timeval __user *t);
asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
compat_ulong_t __user *outp, compat_ulong_t __user *exp,
struct compat_timeval __user *tvp);
asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
unsigned flags);
asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args);
/* obsolete: fs/readdir.c */
asmlinkage long compat_sys_old_readdir(unsigned int fd,
struct compat_old_linux_dirent __user *,
unsigned int count);
/* obsolete: fs/select.c */
asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg);
/* obsolete: ipc */
asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
/* obsolete: kernel/signal.c */
#ifdef __ARCH_WANT_SYS_SIGPENDING
asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set);
#endif
#ifdef __ARCH_WANT_SYS_SIGPROCMASK
asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *nset,
compat_old_sigset_t __user *oset);
#endif
#ifdef CONFIG_COMPAT_OLD_SIGACTION
asmlinkage long compat_sys_sigaction(int sig,
const struct compat_old_sigaction __user *act,
struct compat_old_sigaction __user *oact);
#endif
/* obsolete: kernel/time/time.c */
asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
/* obsolete: net/socket.c */
asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
asmlinkage long compat_sys_arch_prctl(int option, unsigned long arg2);
/* /*
* For most but not all architectures, "am I in a compat syscall?" and * For most but not all architectures, "am I in a compat syscall?" and

View File

@ -9,9 +9,6 @@ struct inode;
struct mm_struct; struct mm_struct;
struct task_struct; struct task_struct;
long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
u32 __user *uaddr2, u32 val2, u32 val3);
extern int extern int
handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi); handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi);
@ -55,6 +52,9 @@ union futex_key {
#ifdef CONFIG_FUTEX #ifdef CONFIG_FUTEX
extern void exit_robust_list(struct task_struct *curr); extern void exit_robust_list(struct task_struct *curr);
long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
u32 __user *uaddr2, u32 val2, u32 val3);
#ifdef CONFIG_HAVE_FUTEX_CMPXCHG #ifdef CONFIG_HAVE_FUTEX_CMPXCHG
#define futex_cmpxchg_enabled 1 #define futex_cmpxchg_enabled 1
#else #else
@ -64,6 +64,13 @@ extern int futex_cmpxchg_enabled;
static inline void exit_robust_list(struct task_struct *curr) static inline void exit_robust_list(struct task_struct *curr)
{ {
} }
static inline long do_futex(u32 __user *uaddr, int op, u32 val,
ktime_t *timeout, u32 __user *uaddr2,
u32 val2, u32 val3)
{
return -EINVAL;
}
#endif #endif
#ifdef CONFIG_FUTEX_PI #ifdef CONFIG_FUTEX_PI

View File

@ -223,10 +223,6 @@ struct kimage {
extern void machine_kexec(struct kimage *image); extern void machine_kexec(struct kimage *image);
extern int machine_kexec_prepare(struct kimage *image); extern int machine_kexec_prepare(struct kimage *image);
extern void machine_kexec_cleanup(struct kimage *image); extern void machine_kexec_cleanup(struct kimage *image);
extern asmlinkage long sys_kexec_load(unsigned long entry,
unsigned long nr_segments,
struct kexec_segment __user *segments,
unsigned long flags);
extern int kernel_kexec(void); extern int kernel_kexec(void);
extern struct page *kimage_alloc_control_pages(struct kimage *image, extern struct page *kimage_alloc_control_pages(struct kimage *image,
unsigned int order); unsigned int order);

View File

@ -27,6 +27,9 @@ static inline bool is_quota_modification(struct inode *inode, struct iattr *ia)
(ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid)); (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid));
} }
int kernel_quotactl(unsigned int cmd, const char __user *special,
qid_t id, void __user *addr);
#if defined(CONFIG_QUOTA) #if defined(CONFIG_QUOTA)
#define quota_error(sb, fmt, args...) \ #define quota_error(sb, fmt, args...) \

View File

@ -346,11 +346,40 @@ extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
struct timespec; struct timespec;
/* The __sys_...msg variants allow MSG_CMSG_COMPAT */ /* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned flags); * forbid_cmsg_compat==false
extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags); */
extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
unsigned int flags, bool forbid_cmsg_compat);
extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
unsigned int flags, bool forbid_cmsg_compat);
extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
unsigned int flags, struct timespec *timeout); unsigned int flags, struct timespec *timeout);
extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
unsigned int vlen, unsigned int flags); unsigned int vlen, unsigned int flags,
bool forbid_cmsg_compat);
/* helpers which do the actual work for syscalls */
extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
unsigned int flags, struct sockaddr __user *addr,
int __user *addr_len);
extern int __sys_sendto(int fd, void __user *buff, size_t len,
unsigned int flags, struct sockaddr __user *addr,
int addr_len);
extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
int __user *upeer_addrlen, int flags);
extern int __sys_socket(int family, int type, int protocol);
extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
int addrlen);
extern int __sys_listen(int fd, int backlog);
extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
int __user *usockaddr_len);
extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
int __user *usockaddr_len);
extern int __sys_socketpair(int family, int type, int protocol,
int __user *usockvec);
extern int __sys_shutdown(int fd, int how);
#endif /* _LINUX_SOCKET_H */ #endif /* _LINUX_SOCKET_H */

File diff suppressed because it is too large Load Diff

View File

@ -44,17 +44,6 @@ int compat_sock_get_timestampns(struct sock *, struct timespec __user *);
int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *, int get_compat_msghdr(struct msghdr *, struct compat_msghdr __user *,
struct sockaddr __user **, struct iovec **); struct sockaddr __user **, struct iovec **);
struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval); struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval);
asmlinkage long compat_sys_sendmsg(int, struct compat_msghdr __user *,
unsigned int);
asmlinkage long compat_sys_sendmmsg(int, struct compat_mmsghdr __user *,
unsigned int, unsigned int);
asmlinkage long compat_sys_recvmsg(int, struct compat_msghdr __user *,
unsigned int);
asmlinkage long compat_sys_recvmmsg(int, struct compat_mmsghdr __user *,
unsigned int, unsigned int,
struct compat_timespec __user *);
asmlinkage long compat_sys_getsockopt(int, int, int, char __user *,
int __user *);
int put_cmsg_compat(struct msghdr*, int, int, int, void *); int put_cmsg_compat(struct msghdr*, int, int, int, void *);
int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *,

View File

@ -363,11 +363,11 @@ static void __init get_fs_names(char *page)
static int __init do_mount_root(char *name, char *fs, int flags, void *data) static int __init do_mount_root(char *name, char *fs, int flags, void *data)
{ {
struct super_block *s; struct super_block *s;
int err = sys_mount(name, "/root", fs, flags, data); int err = ksys_mount(name, "/root", fs, flags, data);
if (err) if (err)
return err; return err;
sys_chdir("/root"); ksys_chdir("/root");
s = current->fs->pwd.dentry->d_sb; s = current->fs->pwd.dentry->d_sb;
ROOT_DEV = s->s_dev; ROOT_DEV = s->s_dev;
printk(KERN_INFO printk(KERN_INFO
@ -489,21 +489,21 @@ void __init change_floppy(char *fmt, ...)
va_start(args, fmt); va_start(args, fmt);
vsprintf(buf, fmt, args); vsprintf(buf, fmt, args);
va_end(args); va_end(args);
fd = sys_open("/dev/root", O_RDWR | O_NDELAY, 0); fd = ksys_open("/dev/root", O_RDWR | O_NDELAY, 0);
if (fd >= 0) { if (fd >= 0) {
sys_ioctl(fd, FDEJECT, 0); ksys_ioctl(fd, FDEJECT, 0);
sys_close(fd); ksys_close(fd);
} }
printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf); printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
fd = sys_open("/dev/console", O_RDWR, 0); fd = ksys_open("/dev/console", O_RDWR, 0);
if (fd >= 0) { if (fd >= 0) {
sys_ioctl(fd, TCGETS, (long)&termios); ksys_ioctl(fd, TCGETS, (long)&termios);
termios.c_lflag &= ~ICANON; termios.c_lflag &= ~ICANON;
sys_ioctl(fd, TCSETSF, (long)&termios); ksys_ioctl(fd, TCSETSF, (long)&termios);
sys_read(fd, &c, 1); ksys_read(fd, &c, 1);
termios.c_lflag |= ICANON; termios.c_lflag |= ICANON;
sys_ioctl(fd, TCSETSF, (long)&termios); ksys_ioctl(fd, TCSETSF, (long)&termios);
sys_close(fd); ksys_close(fd);
} }
} }
#endif #endif
@ -599,8 +599,8 @@ void __init prepare_namespace(void)
mount_root(); mount_root();
out: out:
devtmpfs_mount("dev"); devtmpfs_mount("dev");
sys_mount(".", "/", NULL, MS_MOVE, NULL); ksys_mount(".", "/", NULL, MS_MOVE, NULL);
sys_chroot("."); ksys_chroot(".");
} }
static bool is_tmpfs; static bool is_tmpfs;

View File

@ -16,8 +16,8 @@ extern int root_mountflags;
static inline int create_dev(char *name, dev_t dev) static inline int create_dev(char *name, dev_t dev)
{ {
sys_unlink(name); ksys_unlink(name);
return sys_mknod(name, S_IFBLK|0600, new_encode_dev(dev)); return ksys_mknod(name, S_IFBLK|0600, new_encode_dev(dev));
} }
static inline u32 bstat(char *name) static inline u32 bstat(char *name)

View File

@ -36,16 +36,16 @@ __setup("noinitrd", no_initrd);
static int init_linuxrc(struct subprocess_info *info, struct cred *new) static int init_linuxrc(struct subprocess_info *info, struct cred *new)
{ {
sys_unshare(CLONE_FS | CLONE_FILES); ksys_unshare(CLONE_FS | CLONE_FILES);
/* stdin/stdout/stderr for /linuxrc */ /* stdin/stdout/stderr for /linuxrc */
sys_open("/dev/console", O_RDWR, 0); ksys_open("/dev/console", O_RDWR, 0);
sys_dup(0); ksys_dup(0);
sys_dup(0); ksys_dup(0);
/* move initrd over / and chdir/chroot in initrd root */ /* move initrd over / and chdir/chroot in initrd root */
sys_chdir("/root"); ksys_chdir("/root");
sys_mount(".", "/", NULL, MS_MOVE, NULL); ksys_mount(".", "/", NULL, MS_MOVE, NULL);
sys_chroot("."); ksys_chroot(".");
sys_setsid(); ksys_setsid();
return 0; return 0;
} }
@ -60,8 +60,8 @@ static void __init handle_initrd(void)
create_dev("/dev/root.old", Root_RAM0); create_dev("/dev/root.old", Root_RAM0);
/* mount initrd on rootfs' /root */ /* mount initrd on rootfs' /root */
mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY); mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
sys_mkdir("/old", 0700); ksys_mkdir("/old", 0700);
sys_chdir("/old"); ksys_chdir("/old");
/* try loading default modules from initrd */ /* try loading default modules from initrd */
load_default_modules(); load_default_modules();
@ -81,37 +81,37 @@ static void __init handle_initrd(void)
current->flags &= ~PF_FREEZER_SKIP; current->flags &= ~PF_FREEZER_SKIP;
/* move initrd to rootfs' /old */ /* move initrd to rootfs' /old */
sys_mount("..", ".", NULL, MS_MOVE, NULL); ksys_mount("..", ".", NULL, MS_MOVE, NULL);
/* switch root and cwd back to / of rootfs */ /* switch root and cwd back to / of rootfs */
sys_chroot(".."); ksys_chroot("..");
if (new_decode_dev(real_root_dev) == Root_RAM0) { if (new_decode_dev(real_root_dev) == Root_RAM0) {
sys_chdir("/old"); ksys_chdir("/old");
return; return;
} }
sys_chdir("/"); ksys_chdir("/");
ROOT_DEV = new_decode_dev(real_root_dev); ROOT_DEV = new_decode_dev(real_root_dev);
mount_root(); mount_root();
printk(KERN_NOTICE "Trying to move old root to /initrd ... "); printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL); error = ksys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
if (!error) if (!error)
printk("okay\n"); printk("okay\n");
else { else {
int fd = sys_open("/dev/root.old", O_RDWR, 0); int fd = ksys_open("/dev/root.old", O_RDWR, 0);
if (error == -ENOENT) if (error == -ENOENT)
printk("/initrd does not exist. Ignored.\n"); printk("/initrd does not exist. Ignored.\n");
else else
printk("failed\n"); printk("failed\n");
printk(KERN_NOTICE "Unmounting old root\n"); printk(KERN_NOTICE "Unmounting old root\n");
sys_umount("/old", MNT_DETACH); ksys_umount("/old", MNT_DETACH);
printk(KERN_NOTICE "Trying to free ramdisk memory ... "); printk(KERN_NOTICE "Trying to free ramdisk memory ... ");
if (fd < 0) { if (fd < 0) {
error = fd; error = fd;
} else { } else {
error = sys_ioctl(fd, BLKFLSBUF, 0); error = ksys_ioctl(fd, BLKFLSBUF, 0);
sys_close(fd); ksys_close(fd);
} }
printk(!error ? "okay\n" : "failed\n"); printk(!error ? "okay\n" : "failed\n");
} }
@ -128,11 +128,11 @@ bool __init initrd_load(void)
* mounted in the normal path. * mounted in the normal path.
*/ */
if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
sys_unlink("/initrd.image"); ksys_unlink("/initrd.image");
handle_initrd(); handle_initrd();
return true; return true;
} }
} }
sys_unlink("/initrd.image"); ksys_unlink("/initrd.image");
return false; return false;
} }

View File

@ -181,17 +181,17 @@ static void __init md_setup_drive(void)
partitioned ? "_d" : "", minor, partitioned ? "_d" : "", minor,
md_setup_args[ent].device_names); md_setup_args[ent].device_names);
fd = sys_open(name, 0, 0); fd = ksys_open(name, 0, 0);
if (fd < 0) { if (fd < 0) {
printk(KERN_ERR "md: open failed - cannot start " printk(KERN_ERR "md: open failed - cannot start "
"array %s\n", name); "array %s\n", name);
continue; continue;
} }
if (sys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) { if (ksys_ioctl(fd, SET_ARRAY_INFO, 0) == -EBUSY) {
printk(KERN_WARNING printk(KERN_WARNING
"md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n", "md: Ignoring md=%d, already autodetected. (Use raid=noautodetect)\n",
minor); minor);
sys_close(fd); ksys_close(fd);
continue; continue;
} }
@ -210,7 +210,7 @@ static void __init md_setup_drive(void)
ainfo.state = (1 << MD_SB_CLEAN); ainfo.state = (1 << MD_SB_CLEAN);
ainfo.layout = 0; ainfo.layout = 0;
ainfo.chunk_size = md_setup_args[ent].chunk; ainfo.chunk_size = md_setup_args[ent].chunk;
err = sys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo); err = ksys_ioctl(fd, SET_ARRAY_INFO, (long)&ainfo);
for (i = 0; !err && i <= MD_SB_DISKS; i++) { for (i = 0; !err && i <= MD_SB_DISKS; i++) {
dev = devices[i]; dev = devices[i];
if (!dev) if (!dev)
@ -220,7 +220,8 @@ static void __init md_setup_drive(void)
dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC); dinfo.state = (1<<MD_DISK_ACTIVE)|(1<<MD_DISK_SYNC);
dinfo.major = MAJOR(dev); dinfo.major = MAJOR(dev);
dinfo.minor = MINOR(dev); dinfo.minor = MINOR(dev);
err = sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); err = ksys_ioctl(fd, ADD_NEW_DISK,
(long)&dinfo);
} }
} else { } else {
/* persistent */ /* persistent */
@ -230,11 +231,11 @@ static void __init md_setup_drive(void)
break; break;
dinfo.major = MAJOR(dev); dinfo.major = MAJOR(dev);
dinfo.minor = MINOR(dev); dinfo.minor = MINOR(dev);
sys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo); ksys_ioctl(fd, ADD_NEW_DISK, (long)&dinfo);
} }
} }
if (!err) if (!err)
err = sys_ioctl(fd, RUN_ARRAY, 0); err = ksys_ioctl(fd, RUN_ARRAY, 0);
if (err) if (err)
printk(KERN_WARNING "md: starting md%d failed\n", minor); printk(KERN_WARNING "md: starting md%d failed\n", minor);
else { else {
@ -243,11 +244,11 @@ static void __init md_setup_drive(void)
* boot a kernel with devfs compiled in from partitioned md * boot a kernel with devfs compiled in from partitioned md
* array without it * array without it
*/ */
sys_close(fd); ksys_close(fd);
fd = sys_open(name, 0, 0); fd = ksys_open(name, 0, 0);
sys_ioctl(fd, BLKRRPART, 0); ksys_ioctl(fd, BLKRRPART, 0);
} }
sys_close(fd); ksys_close(fd);
} }
} }
@ -294,10 +295,10 @@ static void __init autodetect_raid(void)
wait_for_device_probe(); wait_for_device_probe();
fd = sys_open("/dev/md0", 0, 0); fd = ksys_open("/dev/md0", 0, 0);
if (fd >= 0) { if (fd >= 0) {
sys_ioctl(fd, RAID_AUTORUN, raid_autopart); ksys_ioctl(fd, RAID_AUTORUN, raid_autopart);
sys_close(fd); ksys_close(fd);
} }
} }

View File

@ -90,8 +90,8 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
/* /*
* Read block 0 to test for compressed kernel * Read block 0 to test for compressed kernel
*/ */
sys_lseek(fd, start_block * BLOCK_SIZE, 0); ksys_lseek(fd, start_block * BLOCK_SIZE, 0);
sys_read(fd, buf, size); ksys_read(fd, buf, size);
*decompressor = decompress_method(buf, size, &compress_name); *decompressor = decompress_method(buf, size, &compress_name);
if (compress_name) { if (compress_name) {
@ -136,8 +136,8 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
/* /*
* Read 512 bytes further to check if cramfs is padded * Read 512 bytes further to check if cramfs is padded
*/ */
sys_lseek(fd, start_block * BLOCK_SIZE + 0x200, 0); ksys_lseek(fd, start_block * BLOCK_SIZE + 0x200, 0);
sys_read(fd, buf, size); ksys_read(fd, buf, size);
if (cramfsb->magic == CRAMFS_MAGIC) { if (cramfsb->magic == CRAMFS_MAGIC) {
printk(KERN_NOTICE printk(KERN_NOTICE
@ -150,8 +150,8 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
/* /*
* Read block 1 to test for minix and ext2 superblock * Read block 1 to test for minix and ext2 superblock
*/ */
sys_lseek(fd, (start_block+1) * BLOCK_SIZE, 0); ksys_lseek(fd, (start_block+1) * BLOCK_SIZE, 0);
sys_read(fd, buf, size); ksys_read(fd, buf, size);
/* Try minix */ /* Try minix */
if (minixsb->s_magic == MINIX_SUPER_MAGIC || if (minixsb->s_magic == MINIX_SUPER_MAGIC ||
@ -178,7 +178,7 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
start_block); start_block);
done: done:
sys_lseek(fd, start_block * BLOCK_SIZE, 0); ksys_lseek(fd, start_block * BLOCK_SIZE, 0);
kfree(buf); kfree(buf);
return nblocks; return nblocks;
} }
@ -196,11 +196,11 @@ int __init rd_load_image(char *from)
char rotator[4] = { '|' , '/' , '-' , '\\' }; char rotator[4] = { '|' , '/' , '-' , '\\' };
#endif #endif
out_fd = sys_open("/dev/ram", O_RDWR, 0); out_fd = ksys_open("/dev/ram", O_RDWR, 0);
if (out_fd < 0) if (out_fd < 0)
goto out; goto out;
in_fd = sys_open(from, O_RDONLY, 0); in_fd = ksys_open(from, O_RDONLY, 0);
if (in_fd < 0) if (in_fd < 0)
goto noclose_input; goto noclose_input;
@ -218,7 +218,7 @@ int __init rd_load_image(char *from)
* NOTE NOTE: nblocks is not actually blocks but * NOTE NOTE: nblocks is not actually blocks but
* the number of kibibytes of data to load into a ramdisk. * the number of kibibytes of data to load into a ramdisk.
*/ */
if (sys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0) if (ksys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0)
rd_blocks = 0; rd_blocks = 0;
else else
rd_blocks >>= 1; rd_blocks >>= 1;
@ -232,7 +232,7 @@ int __init rd_load_image(char *from)
/* /*
* OK, time to copy in the data * OK, time to copy in the data
*/ */
if (sys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0) if (ksys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0)
devblocks = 0; devblocks = 0;
else else
devblocks >>= 1; devblocks >>= 1;
@ -257,20 +257,20 @@ int __init rd_load_image(char *from)
if (i && (i % devblocks == 0)) { if (i && (i % devblocks == 0)) {
printk("done disk #%d.\n", disk++); printk("done disk #%d.\n", disk++);
rotate = 0; rotate = 0;
if (sys_close(in_fd)) { if (ksys_close(in_fd)) {
printk("Error closing the disk.\n"); printk("Error closing the disk.\n");
goto noclose_input; goto noclose_input;
} }
change_floppy("disk #%d", disk); change_floppy("disk #%d", disk);
in_fd = sys_open(from, O_RDONLY, 0); in_fd = ksys_open(from, O_RDONLY, 0);
if (in_fd < 0) { if (in_fd < 0) {
printk("Error opening disk.\n"); printk("Error opening disk.\n");
goto noclose_input; goto noclose_input;
} }
printk("Loading disk #%d... ", disk); printk("Loading disk #%d... ", disk);
} }
sys_read(in_fd, buf, BLOCK_SIZE); ksys_read(in_fd, buf, BLOCK_SIZE);
sys_write(out_fd, buf, BLOCK_SIZE); ksys_write(out_fd, buf, BLOCK_SIZE);
#if !defined(CONFIG_S390) #if !defined(CONFIG_S390)
if (!(i % 16)) { if (!(i % 16)) {
pr_cont("%c\b", rotator[rotate & 0x3]); pr_cont("%c\b", rotator[rotate & 0x3]);
@ -283,12 +283,12 @@ int __init rd_load_image(char *from)
successful_load: successful_load:
res = 1; res = 1;
done: done:
sys_close(in_fd); ksys_close(in_fd);
noclose_input: noclose_input:
sys_close(out_fd); ksys_close(out_fd);
out: out:
kfree(buf); kfree(buf);
sys_unlink("/dev/ram"); ksys_unlink("/dev/ram");
return res; return res;
} }
@ -307,7 +307,7 @@ static int crd_infd, crd_outfd;
static long __init compr_fill(void *buf, unsigned long len) static long __init compr_fill(void *buf, unsigned long len)
{ {
long r = sys_read(crd_infd, buf, len); long r = ksys_read(crd_infd, buf, len);
if (r < 0) if (r < 0)
printk(KERN_ERR "RAMDISK: error while reading compressed data"); printk(KERN_ERR "RAMDISK: error while reading compressed data");
else if (r == 0) else if (r == 0)
@ -317,7 +317,7 @@ static long __init compr_fill(void *buf, unsigned long len)
static long __init compr_flush(void *window, unsigned long outcnt) static long __init compr_flush(void *window, unsigned long outcnt)
{ {
long written = sys_write(crd_outfd, window, outcnt); long written = ksys_write(crd_outfd, window, outcnt);
if (written != outcnt) { if (written != outcnt) {
if (decompress_error == 0) if (decompress_error == 0)
printk(KERN_ERR printk(KERN_ERR

View File

@ -27,7 +27,7 @@ static ssize_t __init xwrite(int fd, const char *p, size_t count)
/* sys_write only can write MAX_RW_COUNT aka 2G-4K bytes at most */ /* sys_write only can write MAX_RW_COUNT aka 2G-4K bytes at most */
while (count) { while (count) {
ssize_t rv = sys_write(fd, p, count); ssize_t rv = ksys_write(fd, p, count);
if (rv < 0) { if (rv < 0) {
if (rv == -EINTR || rv == -EAGAIN) if (rv == -EINTR || rv == -EAGAIN)
@ -306,7 +306,7 @@ static int __init maybe_link(void)
if (nlink >= 2) { if (nlink >= 2) {
char *old = find_link(major, minor, ino, mode, collected); char *old = find_link(major, minor, ino, mode, collected);
if (old) if (old)
return (sys_link(old, collected) < 0) ? -1 : 1; return (ksys_link(old, collected) < 0) ? -1 : 1;
} }
return 0; return 0;
} }
@ -317,9 +317,9 @@ static void __init clean_path(char *path, umode_t fmode)
if (!vfs_lstat(path, &st) && (st.mode ^ fmode) & S_IFMT) { if (!vfs_lstat(path, &st) && (st.mode ^ fmode) & S_IFMT) {
if (S_ISDIR(st.mode)) if (S_ISDIR(st.mode))
sys_rmdir(path); ksys_rmdir(path);
else else
sys_unlink(path); ksys_unlink(path);
} }
} }
@ -340,28 +340,28 @@ static int __init do_name(void)
int openflags = O_WRONLY|O_CREAT; int openflags = O_WRONLY|O_CREAT;
if (ml != 1) if (ml != 1)
openflags |= O_TRUNC; openflags |= O_TRUNC;
wfd = sys_open(collected, openflags, mode); wfd = ksys_open(collected, openflags, mode);
if (wfd >= 0) { if (wfd >= 0) {
sys_fchown(wfd, uid, gid); ksys_fchown(wfd, uid, gid);
sys_fchmod(wfd, mode); ksys_fchmod(wfd, mode);
if (body_len) if (body_len)
sys_ftruncate(wfd, body_len); ksys_ftruncate(wfd, body_len);
vcollected = kstrdup(collected, GFP_KERNEL); vcollected = kstrdup(collected, GFP_KERNEL);
state = CopyFile; state = CopyFile;
} }
} }
} else if (S_ISDIR(mode)) { } else if (S_ISDIR(mode)) {
sys_mkdir(collected, mode); ksys_mkdir(collected, mode);
sys_chown(collected, uid, gid); ksys_chown(collected, uid, gid);
sys_chmod(collected, mode); ksys_chmod(collected, mode);
dir_add(collected, mtime); dir_add(collected, mtime);
} else if (S_ISBLK(mode) || S_ISCHR(mode) || } else if (S_ISBLK(mode) || S_ISCHR(mode) ||
S_ISFIFO(mode) || S_ISSOCK(mode)) { S_ISFIFO(mode) || S_ISSOCK(mode)) {
if (maybe_link() == 0) { if (maybe_link() == 0) {
sys_mknod(collected, mode, rdev); ksys_mknod(collected, mode, rdev);
sys_chown(collected, uid, gid); ksys_chown(collected, uid, gid);
sys_chmod(collected, mode); ksys_chmod(collected, mode);
do_utime(collected, mtime); do_utime(collected, mtime);
} }
} }
@ -373,7 +373,7 @@ static int __init do_copy(void)
if (byte_count >= body_len) { if (byte_count >= body_len) {
if (xwrite(wfd, victim, body_len) != body_len) if (xwrite(wfd, victim, body_len) != body_len)
error("write error"); error("write error");
sys_close(wfd); ksys_close(wfd);
do_utime(vcollected, mtime); do_utime(vcollected, mtime);
kfree(vcollected); kfree(vcollected);
eat(body_len); eat(body_len);
@ -392,8 +392,8 @@ static int __init do_symlink(void)
{ {
collected[N_ALIGN(name_len) + body_len] = '\0'; collected[N_ALIGN(name_len) + body_len] = '\0';
clean_path(collected, 0); clean_path(collected, 0);
sys_symlink(collected + N_ALIGN(name_len), collected); ksys_symlink(collected + N_ALIGN(name_len), collected);
sys_lchown(collected, uid, gid); ksys_lchown(collected, uid, gid);
do_utime(collected, mtime); do_utime(collected, mtime);
state = SkipIt; state = SkipIt;
next_state = Reset; next_state = Reset;
@ -567,19 +567,19 @@ static void __init clean_rootfs(void)
struct linux_dirent64 *dirp; struct linux_dirent64 *dirp;
int num; int num;
fd = sys_open("/", O_RDONLY, 0); fd = ksys_open("/", O_RDONLY, 0);
WARN_ON(fd < 0); WARN_ON(fd < 0);
if (fd < 0) if (fd < 0)
return; return;
buf = kzalloc(BUF_SIZE, GFP_KERNEL); buf = kzalloc(BUF_SIZE, GFP_KERNEL);
WARN_ON(!buf); WARN_ON(!buf);
if (!buf) { if (!buf) {
sys_close(fd); ksys_close(fd);
return; return;
} }
dirp = buf; dirp = buf;
num = sys_getdents64(fd, dirp, BUF_SIZE); num = ksys_getdents64(fd, dirp, BUF_SIZE);
while (num > 0) { while (num > 0) {
while (num > 0) { while (num > 0) {
struct kstat st; struct kstat st;
@ -589,9 +589,9 @@ static void __init clean_rootfs(void)
WARN_ON_ONCE(ret); WARN_ON_ONCE(ret);
if (!ret) { if (!ret) {
if (S_ISDIR(st.mode)) if (S_ISDIR(st.mode))
sys_rmdir(dirp->d_name); ksys_rmdir(dirp->d_name);
else else
sys_unlink(dirp->d_name); ksys_unlink(dirp->d_name);
} }
num -= dirp->d_reclen; num -= dirp->d_reclen;
@ -599,10 +599,10 @@ static void __init clean_rootfs(void)
} }
dirp = buf; dirp = buf;
memset(buf, 0, BUF_SIZE); memset(buf, 0, BUF_SIZE);
num = sys_getdents64(fd, dirp, BUF_SIZE); num = ksys_getdents64(fd, dirp, BUF_SIZE);
} }
sys_close(fd); ksys_close(fd);
kfree(buf); kfree(buf);
} }
#endif #endif
@ -629,7 +629,7 @@ static int __init populate_rootfs(void)
} }
printk(KERN_INFO "rootfs image is not initramfs (%s)" printk(KERN_INFO "rootfs image is not initramfs (%s)"
"; looks like an initrd\n", err); "; looks like an initrd\n", err);
fd = sys_open("/initrd.image", fd = ksys_open("/initrd.image",
O_WRONLY|O_CREAT, 0700); O_WRONLY|O_CREAT, 0700);
if (fd >= 0) { if (fd >= 0) {
ssize_t written = xwrite(fd, (char *)initrd_start, ssize_t written = xwrite(fd, (char *)initrd_start,
@ -639,7 +639,7 @@ static int __init populate_rootfs(void)
pr_err("/initrd.image: incomplete write (%zd != %ld)\n", pr_err("/initrd.image: incomplete write (%zd != %ld)\n",
written, initrd_end - initrd_start); written, initrd_end - initrd_start);
sys_close(fd); ksys_close(fd);
free_initrd(); free_initrd();
} }
done: done:

View File

@ -1074,11 +1074,11 @@ static noinline void __init kernel_init_freeable(void)
do_basic_setup(); do_basic_setup();
/* Open the /dev/console on the rootfs, this should never fail */ /* Open the /dev/console on the rootfs, this should never fail */
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0) if (ksys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
pr_err("Warning: unable to open an initial console.\n"); pr_err("Warning: unable to open an initial console.\n");
(void) sys_dup(0); (void) ksys_dup(0);
(void) sys_dup(0); (void) ksys_dup(0);
/* /*
* check if there is an early userspace init. If yes, let it do all * check if there is an early userspace init. If yes, let it do all
* the work * the work
@ -1087,7 +1087,8 @@ static noinline void __init kernel_init_freeable(void)
if (!ramdisk_execute_command) if (!ramdisk_execute_command)
ramdisk_execute_command = "/init"; ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { if (ksys_access((const char __user *)
ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL; ramdisk_execute_command = NULL;
prepare_namespace(); prepare_namespace();
} }

View File

@ -29,17 +29,17 @@ static int __init default_rootfs(void)
{ {
int err; int err;
err = sys_mkdir((const char __user __force *) "/dev", 0755); err = ksys_mkdir((const char __user __force *) "/dev", 0755);
if (err < 0) if (err < 0)
goto out; goto out;
err = sys_mknod((const char __user __force *) "/dev/console", err = ksys_mknod((const char __user __force *) "/dev/console",
S_IFCHR | S_IRUSR | S_IWUSR, S_IFCHR | S_IRUSR | S_IWUSR,
new_encode_dev(MKDEV(5, 1))); new_encode_dev(MKDEV(5, 1)));
if (err < 0) if (err < 0)
goto out; goto out;
err = sys_mkdir((const char __user __force *) "/root", 0700); err = ksys_mkdir((const char __user __force *) "/root", 0700);
if (err < 0) if (err < 0)
goto out; goto out;

View File

@ -263,7 +263,7 @@ static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
return security_msg_queue_associate(msq, msgflg); return security_msg_queue_associate(msq, msgflg);
} }
SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg) long ksys_msgget(key_t key, int msgflg)
{ {
struct ipc_namespace *ns; struct ipc_namespace *ns;
static const struct ipc_ops msg_ops = { static const struct ipc_ops msg_ops = {
@ -280,6 +280,11 @@ SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
return ipcget(ns, &msg_ids(ns), &msg_ops, &msg_params); return ipcget(ns, &msg_ids(ns), &msg_ops, &msg_params);
} }
SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
{
return ksys_msgget(key, msgflg);
}
static inline unsigned long static inline unsigned long
copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version) copy_msqid_to_user(void __user *buf, struct msqid64_ds *in, int version)
{ {
@ -533,7 +538,7 @@ out_unlock:
return err; return err;
} }
SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf) long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
{ {
int version; int version;
struct ipc_namespace *ns; struct ipc_namespace *ns;
@ -576,6 +581,11 @@ SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
} }
} }
SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
{
return ksys_msgctl(msqid, cmd, buf);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct compat_msqid_ds { struct compat_msqid_ds {
@ -646,7 +656,7 @@ static int copy_compat_msqid_to_user(void __user *buf, struct msqid64_ds *in,
} }
} }
COMPAT_SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, void __user *, uptr) long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr)
{ {
struct ipc_namespace *ns; struct ipc_namespace *ns;
int err; int err;
@ -687,6 +697,11 @@ COMPAT_SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, void __user *, uptr)
return -EINVAL; return -EINVAL;
} }
} }
COMPAT_SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, void __user *, uptr)
{
return compat_ksys_msgctl(msqid, cmd, uptr);
}
#endif #endif
static int testmsg(struct msg_msg *msg, long type, int mode) static int testmsg(struct msg_msg *msg, long type, int mode)
@ -852,8 +867,8 @@ out_unlock1:
return err; return err;
} }
SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz, long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
int, msgflg) int msgflg)
{ {
long mtype; long mtype;
@ -862,6 +877,12 @@ SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg); return do_msgsnd(msqid, mtype, msgp->mtext, msgsz, msgflg);
} }
SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
int, msgflg)
{
return ksys_msgsnd(msqid, msgp, msgsz, msgflg);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct compat_msgbuf { struct compat_msgbuf {
@ -869,8 +890,8 @@ struct compat_msgbuf {
char mtext[1]; char mtext[1];
}; };
COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp, long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
compat_ssize_t, msgsz, int, msgflg) compat_ssize_t msgsz, int msgflg)
{ {
struct compat_msgbuf __user *up = compat_ptr(msgp); struct compat_msgbuf __user *up = compat_ptr(msgp);
compat_long_t mtype; compat_long_t mtype;
@ -879,6 +900,12 @@ COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
return -EFAULT; return -EFAULT;
return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg); return do_msgsnd(msqid, mtype, up->mtext, (ssize_t)msgsz, msgflg);
} }
COMPAT_SYSCALL_DEFINE4(msgsnd, int, msqid, compat_uptr_t, msgp,
compat_ssize_t, msgsz, int, msgflg)
{
return compat_ksys_msgsnd(msqid, msgp, msgsz, msgflg);
}
#endif #endif
static inline int convert_mode(long *msgtyp, int msgflg) static inline int convert_mode(long *msgtyp, int msgflg)
@ -1135,10 +1162,16 @@ out_unlock1:
return bufsz; return bufsz;
} }
long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
long msgtyp, int msgflg)
{
return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill);
}
SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz, SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
long, msgtyp, int, msgflg) long, msgtyp, int, msgflg)
{ {
return do_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg, do_msg_fill); return ksys_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg);
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
@ -1156,12 +1189,19 @@ static long compat_do_msg_fill(void __user *dest, struct msg_msg *msg, size_t bu
return msgsz; return msgsz;
} }
COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp, long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
compat_ssize_t, msgsz, compat_long_t, msgtyp, int, msgflg) compat_long_t msgtyp, int msgflg)
{ {
return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp, return do_msgrcv(msqid, compat_ptr(msgp), (ssize_t)msgsz, (long)msgtyp,
msgflg, compat_do_msg_fill); msgflg, compat_do_msg_fill);
} }
COMPAT_SYSCALL_DEFINE5(msgrcv, int, msqid, compat_uptr_t, msgp,
compat_ssize_t, msgsz, compat_long_t, msgtyp,
int, msgflg)
{
return compat_ksys_msgrcv(msqid, msgp, msgsz, msgtyp, msgflg);
}
#endif #endif
int msg_init_ns(struct ipc_namespace *ns) int msg_init_ns(struct ipc_namespace *ns)

View File

@ -556,7 +556,7 @@ static inline int sem_more_checks(struct kern_ipc_perm *ipcp,
return 0; return 0;
} }
SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg) long ksys_semget(key_t key, int nsems, int semflg)
{ {
struct ipc_namespace *ns; struct ipc_namespace *ns;
static const struct ipc_ops sem_ops = { static const struct ipc_ops sem_ops = {
@ -578,6 +578,11 @@ SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
return ipcget(ns, &sem_ids(ns), &sem_ops, &sem_params); return ipcget(ns, &sem_ids(ns), &sem_ops, &sem_params);
} }
SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
{
return ksys_semget(key, nsems, semflg);
}
/** /**
* perform_atomic_semop[_slow] - Attempt to perform semaphore * perform_atomic_semop[_slow] - Attempt to perform semaphore
* operations on a given array. * operations on a given array.
@ -1576,7 +1581,7 @@ out_up:
return err; return err;
} }
SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg) long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
{ {
int version; int version;
struct ipc_namespace *ns; struct ipc_namespace *ns;
@ -1630,6 +1635,11 @@ SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
} }
} }
SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
{
return ksys_semctl(semid, semnum, cmd, arg);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct compat_semid_ds { struct compat_semid_ds {
@ -1678,7 +1688,7 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
} }
} }
COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg) long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
{ {
void __user *p = compat_ptr(arg); void __user *p = compat_ptr(arg);
struct ipc_namespace *ns; struct ipc_namespace *ns;
@ -1722,6 +1732,11 @@ COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
return -EINVAL; return -EINVAL;
} }
} }
COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
{
return compat_ksys_semctl(semid, semnum, cmd, arg);
}
#endif #endif
/* If the task doesn't already have a undo_list, then allocate one /* If the task doesn't already have a undo_list, then allocate one
@ -2120,8 +2135,8 @@ out_free:
return error; return error;
} }
SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, long ksys_semtimedop(int semid, struct sembuf __user *tsops,
unsigned, nsops, const struct timespec __user *, timeout) unsigned int nsops, const struct timespec __user *timeout)
{ {
if (timeout) { if (timeout) {
struct timespec64 ts; struct timespec64 ts;
@ -2132,10 +2147,16 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
return do_semtimedop(semid, tsops, nsops, NULL); return do_semtimedop(semid, tsops, nsops, NULL);
} }
SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
unsigned int, nsops, const struct timespec __user *, timeout)
{
return ksys_semtimedop(semid, tsops, nsops, timeout);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems, long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned, nsops, unsigned int nsops,
const struct compat_timespec __user *, timeout) const struct compat_timespec __user *timeout)
{ {
if (timeout) { if (timeout) {
struct timespec64 ts; struct timespec64 ts;
@ -2145,6 +2166,13 @@ COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
} }
return do_semtimedop(semid, tsems, nsops, NULL); return do_semtimedop(semid, tsems, nsops, NULL);
} }
COMPAT_SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsems,
unsigned int, nsops,
const struct compat_timespec __user *, timeout)
{
return compat_ksys_semtimedop(semid, tsems, nsops, timeout);
}
#endif #endif
SYSCALL_DEFINE3(semop, int, semid, struct sembuf __user *, tsops, SYSCALL_DEFINE3(semop, int, semid, struct sembuf __user *, tsops,

View File

@ -668,7 +668,7 @@ static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
return 0; return 0;
} }
SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg) long ksys_shmget(key_t key, size_t size, int shmflg)
{ {
struct ipc_namespace *ns; struct ipc_namespace *ns;
static const struct ipc_ops shm_ops = { static const struct ipc_ops shm_ops = {
@ -687,6 +687,11 @@ SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
return ipcget(ns, &shm_ids(ns), &shm_ops, &shm_params); return ipcget(ns, &shm_ids(ns), &shm_ops, &shm_params);
} }
SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
{
return ksys_shmget(key, size, shmflg);
}
static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_ds *in, int version) static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_ds *in, int version)
{ {
switch (version) { switch (version) {
@ -1052,7 +1057,7 @@ out_unlock1:
return err; return err;
} }
SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf) long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf)
{ {
int err, version; int err, version;
struct ipc_namespace *ns; struct ipc_namespace *ns;
@ -1106,6 +1111,11 @@ SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
} }
} }
SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
{
return ksys_shmctl(shmid, cmd, buf);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
struct compat_shmid_ds { struct compat_shmid_ds {
@ -1225,7 +1235,7 @@ static int copy_compat_shmid_from_user(struct shmid64_ds *out, void __user *buf,
} }
} }
COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr) long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr)
{ {
struct ipc_namespace *ns; struct ipc_namespace *ns;
struct shmid64_ds sem64; struct shmid64_ds sem64;
@ -1280,6 +1290,11 @@ COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr)
} }
return err; return err;
} }
COMPAT_SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, void __user *, uptr)
{
return compat_ksys_shmctl(shmid, cmd, uptr);
}
#endif #endif
/* /*
@ -1488,7 +1503,7 @@ COMPAT_SYSCALL_DEFINE3(shmat, int, shmid, compat_uptr_t, shmaddr, int, shmflg)
* detach and kill segment if marked destroyed. * detach and kill segment if marked destroyed.
* The work is done in shm_close. * The work is done in shm_close.
*/ */
SYSCALL_DEFINE1(shmdt, char __user *, shmaddr) long ksys_shmdt(char __user *shmaddr)
{ {
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
struct vm_area_struct *vma; struct vm_area_struct *vma;
@ -1595,6 +1610,11 @@ SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
return retval; return retval;
} }
SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
{
return ksys_shmdt(shmaddr);
}
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static int sysvipc_shm_proc_show(struct seq_file *s, void *it) static int sysvipc_shm_proc_show(struct seq_file *s, void *it)
{ {

View File

@ -7,6 +7,9 @@
*/ */
#include <linux/unistd.h> #include <linux/unistd.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/security.h>
#include <linux/ipc_namespace.h>
#include "util.h"
#ifdef __ARCH_WANT_SYS_IPC #ifdef __ARCH_WANT_SYS_IPC
#include <linux/errno.h> #include <linux/errno.h>
@ -24,26 +27,26 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
switch (call) { switch (call) {
case SEMOP: case SEMOP:
return sys_semtimedop(first, (struct sembuf __user *)ptr, return ksys_semtimedop(first, (struct sembuf __user *)ptr,
second, NULL); second, NULL);
case SEMTIMEDOP: case SEMTIMEDOP:
return sys_semtimedop(first, (struct sembuf __user *)ptr, return ksys_semtimedop(first, (struct sembuf __user *)ptr,
second, second,
(const struct timespec __user *)fifth); (const struct timespec __user *)fifth);
case SEMGET: case SEMGET:
return sys_semget(first, second, third); return ksys_semget(first, second, third);
case SEMCTL: { case SEMCTL: {
unsigned long arg; unsigned long arg;
if (!ptr) if (!ptr)
return -EINVAL; return -EINVAL;
if (get_user(arg, (unsigned long __user *) ptr)) if (get_user(arg, (unsigned long __user *) ptr))
return -EFAULT; return -EFAULT;
return sys_semctl(first, second, third, arg); return ksys_semctl(first, second, third, arg);
} }
case MSGSND: case MSGSND:
return sys_msgsnd(first, (struct msgbuf __user *) ptr, return ksys_msgsnd(first, (struct msgbuf __user *) ptr,
second, third); second, third);
case MSGRCV: case MSGRCV:
switch (version) { switch (version) {
@ -56,18 +59,19 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
(struct ipc_kludge __user *) ptr, (struct ipc_kludge __user *) ptr,
sizeof(tmp))) sizeof(tmp)))
return -EFAULT; return -EFAULT;
return sys_msgrcv(first, tmp.msgp, second, return ksys_msgrcv(first, tmp.msgp, second,
tmp.msgtyp, third); tmp.msgtyp, third);
} }
default: default:
return sys_msgrcv(first, return ksys_msgrcv(first,
(struct msgbuf __user *) ptr, (struct msgbuf __user *) ptr,
second, fifth, third); second, fifth, third);
} }
case MSGGET: case MSGGET:
return sys_msgget((key_t) first, second); return ksys_msgget((key_t) first, second);
case MSGCTL: case MSGCTL:
return sys_msgctl(first, second, (struct msqid_ds __user *)ptr); return ksys_msgctl(first, second,
(struct msqid_ds __user *)ptr);
case SHMAT: case SHMAT:
switch (version) { switch (version) {
@ -87,11 +91,11 @@ SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
return -EINVAL; return -EINVAL;
} }
case SHMDT: case SHMDT:
return sys_shmdt((char __user *)ptr); return ksys_shmdt((char __user *)ptr);
case SHMGET: case SHMGET:
return sys_shmget(first, second, third); return ksys_shmget(first, second, third);
case SHMCTL: case SHMCTL:
return sys_shmctl(first, second, return ksys_shmctl(first, second,
(struct shmid_ds __user *) ptr); (struct shmid_ds __user *) ptr);
default: default:
return -ENOSYS; return -ENOSYS;
@ -124,21 +128,21 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
switch (call) { switch (call) {
case SEMOP: case SEMOP:
/* struct sembuf is the same on 32 and 64bit :)) */ /* struct sembuf is the same on 32 and 64bit :)) */
return sys_semtimedop(first, compat_ptr(ptr), second, NULL); return ksys_semtimedop(first, compat_ptr(ptr), second, NULL);
case SEMTIMEDOP: case SEMTIMEDOP:
return compat_sys_semtimedop(first, compat_ptr(ptr), second, return compat_ksys_semtimedop(first, compat_ptr(ptr), second,
compat_ptr(fifth)); compat_ptr(fifth));
case SEMGET: case SEMGET:
return sys_semget(first, second, third); return ksys_semget(first, second, third);
case SEMCTL: case SEMCTL:
if (!ptr) if (!ptr)
return -EINVAL; return -EINVAL;
if (get_user(pad, (u32 __user *) compat_ptr(ptr))) if (get_user(pad, (u32 __user *) compat_ptr(ptr)))
return -EFAULT; return -EFAULT;
return compat_sys_semctl(first, second, third, pad); return compat_ksys_semctl(first, second, third, pad);
case MSGSND: case MSGSND:
return compat_sys_msgsnd(first, ptr, second, third); return compat_ksys_msgsnd(first, ptr, second, third);
case MSGRCV: { case MSGRCV: {
void __user *uptr = compat_ptr(ptr); void __user *uptr = compat_ptr(ptr);
@ -152,15 +156,15 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
return -EINVAL; return -EINVAL;
if (copy_from_user(&ipck, uptr, sizeof(ipck))) if (copy_from_user(&ipck, uptr, sizeof(ipck)))
return -EFAULT; return -EFAULT;
return compat_sys_msgrcv(first, ipck.msgp, second, return compat_ksys_msgrcv(first, ipck.msgp, second,
ipck.msgtyp, third); ipck.msgtyp, third);
} }
return compat_sys_msgrcv(first, ptr, second, fifth, third); return compat_ksys_msgrcv(first, ptr, second, fifth, third);
} }
case MSGGET: case MSGGET:
return sys_msgget(first, second); return ksys_msgget(first, second);
case MSGCTL: case MSGCTL:
return compat_sys_msgctl(first, second, compat_ptr(ptr)); return compat_ksys_msgctl(first, second, compat_ptr(ptr));
case SHMAT: { case SHMAT: {
int err; int err;
@ -175,11 +179,11 @@ COMPAT_SYSCALL_DEFINE6(ipc, u32, call, int, first, int, second,
return put_user(raddr, (compat_ulong_t __user *)compat_ptr(third)); return put_user(raddr, (compat_ulong_t __user *)compat_ptr(third));
} }
case SHMDT: case SHMDT:
return sys_shmdt(compat_ptr(ptr)); return ksys_shmdt(compat_ptr(ptr));
case SHMGET: case SHMGET:
return sys_shmget(first, (unsigned)second, third); return ksys_shmget(first, (unsigned int)second, third);
case SHMCTL: case SHMCTL:
return compat_sys_shmctl(first, second, compat_ptr(ptr)); return compat_ksys_shmctl(first, second, compat_ptr(ptr));
} }
return -ENOSYS; return -ENOSYS;

View File

@ -235,4 +235,35 @@ static inline int compat_ipc_parse_version(int *cmd)
#endif #endif
} }
#endif #endif
/* for __ARCH_WANT_SYS_IPC */
long ksys_semtimedop(int semid, struct sembuf __user *tsops,
unsigned int nsops,
const struct timespec __user *timeout);
long ksys_semget(key_t key, int nsems, int semflg);
long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg);
long ksys_msgget(key_t key, int msgflg);
long ksys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf);
long ksys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
long msgtyp, int msgflg);
long ksys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz,
int msgflg);
long ksys_shmget(key_t key, size_t size, int shmflg);
long ksys_shmdt(char __user *shmaddr);
long ksys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
/* for CONFIG_ARCH_WANT_OLD_COMPAT_IPC */
#ifdef CONFIG_COMPAT
long compat_ksys_semtimedop(int semid, struct sembuf __user *tsems,
unsigned int nsops,
const struct compat_timespec __user *timeout);
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg);
long compat_ksys_msgctl(int msqid, int cmd, void __user *uptr);
long compat_ksys_msgrcv(int msqid, compat_uptr_t msgp, compat_ssize_t msgsz,
compat_long_t msgtyp, int msgflg);
long compat_ksys_msgsnd(int msqid, compat_uptr_t msgp,
compat_ssize_t msgsz, int msgflg);
long compat_ksys_shmctl(int shmid, int cmd, void __user *uptr);
#endif /* CONFIG_COMPAT */
#endif #endif

View File

@ -488,61 +488,6 @@ get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat)
} }
EXPORT_SYMBOL_GPL(get_compat_sigset); EXPORT_SYMBOL_GPL(get_compat_sigset);
#ifdef CONFIG_NUMA
COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
compat_uptr_t __user *, pages32,
const int __user *, nodes,
int __user *, status,
int, flags)
{
const void __user * __user *pages;
int i;
pages = compat_alloc_user_space(nr_pages * sizeof(void *));
for (i = 0; i < nr_pages; i++) {
compat_uptr_t p;
if (get_user(p, pages32 + i) ||
put_user(compat_ptr(p), pages + i))
return -EFAULT;
}
return sys_move_pages(pid, nr_pages, pages, nodes, status, flags);
}
COMPAT_SYSCALL_DEFINE4(migrate_pages, compat_pid_t, pid,
compat_ulong_t, maxnode,
const compat_ulong_t __user *, old_nodes,
const compat_ulong_t __user *, new_nodes)
{
unsigned long __user *old = NULL;
unsigned long __user *new = NULL;
nodemask_t tmp_mask;
unsigned long nr_bits;
unsigned long size;
nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES);
size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
if (old_nodes) {
if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits))
return -EFAULT;
old = compat_alloc_user_space(new_nodes ? size * 2 : size);
if (new_nodes)
new = old + size / sizeof(unsigned long);
if (copy_to_user(old, nodes_addr(tmp_mask), size))
return -EFAULT;
}
if (new_nodes) {
if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits))
return -EFAULT;
if (new == NULL)
new = compat_alloc_user_space(size);
if (copy_to_user(new, nodes_addr(tmp_mask), size))
return -EFAULT;
}
return sys_migrate_pages(pid, nr_bits + 1, old, new);
}
#endif
/* /*
* Allocate user-space memory for the duration of a single system call, * Allocate user-space memory for the duration of a single system call,
* in order to marshall parameters inside a compat thunk. * in order to marshall parameters inside a compat thunk.

View File

@ -1691,7 +1691,7 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
*/ */
SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options) SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
{ {
return sys_wait4(pid, stat_addr, options, NULL); return kernel_wait4(pid, stat_addr, options, NULL);
} }
#endif #endif

View File

@ -1198,8 +1198,8 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
* not set up a proper pointer then tough luck. * not set up a proper pointer then tough luck.
*/ */
put_user(0, tsk->clear_child_tid); put_user(0, tsk->clear_child_tid);
sys_futex(tsk->clear_child_tid, FUTEX_WAKE, do_futex(tsk->clear_child_tid, FUTEX_WAKE,
1, NULL, NULL, 0); 1, NULL, NULL, 0, 0);
} }
tsk->clear_child_tid = NULL; tsk->clear_child_tid = NULL;
} }
@ -2354,7 +2354,7 @@ static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp
* constructed. Here we are modifying the current, active, * constructed. Here we are modifying the current, active,
* task_struct. * task_struct.
*/ */
SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) int ksys_unshare(unsigned long unshare_flags)
{ {
struct fs_struct *fs, *new_fs = NULL; struct fs_struct *fs, *new_fs = NULL;
struct files_struct *fd, *new_fd = NULL; struct files_struct *fd, *new_fd = NULL;
@ -2470,6 +2470,11 @@ bad_unshare_out:
return err; return err;
} }
SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
{
return ksys_unshare(unshare_flags);
}
/* /*
* Helper to unshare the files of the current task. * Helper to unshare the files of the current task.
* We don't want to expose copy_files internals to * We don't want to expose copy_files internals to

View File

@ -192,11 +192,9 @@ out:
* that to happen you need to do that yourself. * that to happen you need to do that yourself.
*/ */
SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments, static inline int kexec_load_check(unsigned long nr_segments,
struct kexec_segment __user *, segments, unsigned long, flags) unsigned long flags)
{ {
int result;
/* We only trust the superuser with rebooting the system. */ /* We only trust the superuser with rebooting the system. */
if (!capable(CAP_SYS_BOOT) || kexec_load_disabled) if (!capable(CAP_SYS_BOOT) || kexec_load_disabled)
return -EPERM; return -EPERM;
@ -208,17 +206,29 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
if ((flags & KEXEC_FLAGS) != (flags & ~KEXEC_ARCH_MASK)) if ((flags & KEXEC_FLAGS) != (flags & ~KEXEC_ARCH_MASK))
return -EINVAL; return -EINVAL;
/* Verify we are on the appropriate architecture */
if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH_DEFAULT))
return -EINVAL;
/* Put an artificial cap on the number /* Put an artificial cap on the number
* of segments passed to kexec_load. * of segments passed to kexec_load.
*/ */
if (nr_segments > KEXEC_SEGMENT_MAX) if (nr_segments > KEXEC_SEGMENT_MAX)
return -EINVAL; return -EINVAL;
return 0;
}
SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
struct kexec_segment __user *, segments, unsigned long, flags)
{
int result;
result = kexec_load_check(nr_segments, flags);
if (result)
return result;
/* Verify we are on the appropriate architecture */
if (((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH) &&
((flags & KEXEC_ARCH_MASK) != KEXEC_ARCH_DEFAULT))
return -EINVAL;
/* Because we write directly to the reserved memory /* Because we write directly to the reserved memory
* region when loading crash kernels we need a mutex here to * region when loading crash kernels we need a mutex here to
* prevent multiple crash kernels from attempting to load * prevent multiple crash kernels from attempting to load
@ -247,15 +257,16 @@ COMPAT_SYSCALL_DEFINE4(kexec_load, compat_ulong_t, entry,
struct kexec_segment out, __user *ksegments; struct kexec_segment out, __user *ksegments;
unsigned long i, result; unsigned long i, result;
result = kexec_load_check(nr_segments, flags);
if (result)
return result;
/* Don't allow clients that don't understand the native /* Don't allow clients that don't understand the native
* architecture to do anything. * architecture to do anything.
*/ */
if ((flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_DEFAULT) if ((flags & KEXEC_ARCH_MASK) == KEXEC_ARCH_DEFAULT)
return -EINVAL; return -EINVAL;
if (nr_segments > KEXEC_SEGMENT_MAX)
return -EINVAL;
ksegments = compat_alloc_user_space(nr_segments * sizeof(out)); ksegments = compat_alloc_user_space(nr_segments * sizeof(out));
for (i = 0; i < nr_segments; i++) { for (i = 0; i < nr_segments; i++) {
result = copy_from_user(&in, &segments[i], sizeof(in)); result = copy_from_user(&in, &segments[i], sizeof(in));
@ -272,6 +283,21 @@ COMPAT_SYSCALL_DEFINE4(kexec_load, compat_ulong_t, entry,
return -EFAULT; return -EFAULT;
} }
return sys_kexec_load(entry, nr_segments, ksegments, flags); /* Because we write directly to the reserved memory
* region when loading crash kernels we need a mutex here to
* prevent multiple crash kernels from attempting to load
* simultaneously, and to prevent a crash kernel from loading
* over the top of a in use crash kernel.
*
* KISS: always take the mutex.
*/
if (!mutex_trylock(&kexec_mutex))
return -EBUSY;
result = do_kexec_load(entry, nr_segments, ksegments, flags);
mutex_unlock(&kexec_mutex);
return result;
} }
#endif #endif

View File

@ -242,16 +242,16 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
/* /*
* Reap the EXIT_ZOMBIE children we had before we ignored SIGCHLD. * Reap the EXIT_ZOMBIE children we had before we ignored SIGCHLD.
* sys_wait4() will also block until our children traced from the * kernel_wait4() will also block until our children traced from the
* parent namespace are detached and become EXIT_DEAD. * parent namespace are detached and become EXIT_DEAD.
*/ */
do { do {
clear_thread_flag(TIF_SIGPENDING); clear_thread_flag(TIF_SIGPENDING);
rc = sys_wait4(-1, NULL, __WALL, NULL); rc = kernel_wait4(-1, NULL, __WALL, NULL);
} while (rc != -ECHILD); } while (rc != -ECHILD);
/* /*
* sys_wait4() above can't reap the EXIT_DEAD children but we do not * kernel_wait4() above can't reap the EXIT_DEAD children but we do not
* really care, we could reparent them to the global init. We could * really care, we could reparent them to the global init. We could
* exit and reap ->child_reaper even if it is not the last thread in * exit and reap ->child_reaper even if it is not the last thread in
* this pid_ns, free_pid(pid_allocated == 0) calls proc_cleanup_work(), * this pid_ns, free_pid(pid_allocated == 0) calls proc_cleanup_work(),

View File

@ -701,7 +701,7 @@ int hibernate(void)
} }
pr_info("Syncing filesystems ... \n"); pr_info("Syncing filesystems ... \n");
sys_sync(); ksys_sync();
pr_info("done.\n"); pr_info("done.\n");
error = freeze_processes(); error = freeze_processes();

View File

@ -560,7 +560,7 @@ static int enter_state(suspend_state_t state)
#ifndef CONFIG_SUSPEND_SKIP_SYNC #ifndef CONFIG_SUSPEND_SKIP_SYNC
trace_suspend_resume(TPS("sync_filesystems"), 0, true); trace_suspend_resume(TPS("sync_filesystems"), 0, true);
pr_info("Syncing filesystems ... "); pr_info("Syncing filesystems ... ");
sys_sync(); ksys_sync();
pr_cont("done.\n"); pr_cont("done.\n");
trace_suspend_resume(TPS("sync_filesystems"), 0, false); trace_suspend_resume(TPS("sync_filesystems"), 0, false);
#endif #endif

View File

@ -224,7 +224,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
break; break;
printk("Syncing filesystems ... "); printk("Syncing filesystems ... ");
sys_sync(); ksys_sync();
printk("done.\n"); printk("done.\n");
error = freeze_processes(); error = freeze_processes();

View File

@ -4942,7 +4942,7 @@ SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
* *
* Return: 0. * Return: 0.
*/ */
SYSCALL_DEFINE0(sched_yield) static void do_sched_yield(void)
{ {
struct rq_flags rf; struct rq_flags rf;
struct rq *rq; struct rq *rq;
@ -4963,7 +4963,11 @@ SYSCALL_DEFINE0(sched_yield)
sched_preempt_enable_no_resched(); sched_preempt_enable_no_resched();
schedule(); schedule();
}
SYSCALL_DEFINE0(sched_yield)
{
do_sched_yield();
return 0; return 0;
} }
@ -5047,7 +5051,7 @@ EXPORT_SYMBOL(__cond_resched_softirq);
void __sched yield(void) void __sched yield(void)
{ {
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
sys_sched_yield(); do_sched_yield();
} }
EXPORT_SYMBOL(yield); EXPORT_SYMBOL(yield);

View File

@ -3573,9 +3573,8 @@ int __save_altstack(stack_t __user *uss, unsigned long sp)
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(sigaltstack, static int do_compat_sigaltstack(const compat_stack_t __user *uss_ptr,
const compat_stack_t __user *, uss_ptr, compat_stack_t __user *uoss_ptr)
compat_stack_t __user *, uoss_ptr)
{ {
stack_t uss, uoss; stack_t uss, uoss;
int ret; int ret;
@ -3602,9 +3601,16 @@ COMPAT_SYSCALL_DEFINE2(sigaltstack,
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE2(sigaltstack,
const compat_stack_t __user *, uss_ptr,
compat_stack_t __user *, uoss_ptr)
{
return do_compat_sigaltstack(uss_ptr, uoss_ptr);
}
int compat_restore_altstack(const compat_stack_t __user *uss) int compat_restore_altstack(const compat_stack_t __user *uss)
{ {
int err = compat_sys_sigaltstack(uss, NULL); int err = do_compat_sigaltstack(uss, NULL);
/* squash all but -EFAULT for now */ /* squash all but -EFAULT for now */
return err == -EFAULT ? err : 0; return err == -EFAULT ? err : 0;
} }
@ -3629,11 +3635,20 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp)
/** /**
* sys_sigpending - examine pending signals * sys_sigpending - examine pending signals
* @set: where mask of pending signal is returned * @uset: where mask of pending signal is returned
*/ */
SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, uset)
{ {
return sys_rt_sigpending((sigset_t __user *)set, sizeof(old_sigset_t)); sigset_t set;
int err;
if (sizeof(old_sigset_t) > sizeof(*uset))
return -EINVAL;
err = do_sigpending(&set);
if (!err && copy_to_user(uset, &set, sizeof(old_sigset_t)))
err = -EFAULT;
return err;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT

View File

@ -69,6 +69,8 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include "uid16.h"
#ifndef SET_UNALIGN_CTL #ifndef SET_UNALIGN_CTL
# define SET_UNALIGN_CTL(a, b) (-EINVAL) # define SET_UNALIGN_CTL(a, b) (-EINVAL)
#endif #endif
@ -340,7 +342,7 @@ out_unlock:
* operations (as far as semantic preservation is concerned). * operations (as far as semantic preservation is concerned).
*/ */
#ifdef CONFIG_MULTIUSER #ifdef CONFIG_MULTIUSER
SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) long __sys_setregid(gid_t rgid, gid_t egid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -392,12 +394,17 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
{
return __sys_setregid(rgid, egid);
}
/* /*
* setgid() is implemented like SysV w/ SAVED_IDS * setgid() is implemented like SysV w/ SAVED_IDS
* *
* SMP: Same implicit races as above. * SMP: Same implicit races as above.
*/ */
SYSCALL_DEFINE1(setgid, gid_t, gid) long __sys_setgid(gid_t gid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -429,6 +436,11 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE1(setgid, gid_t, gid)
{
return __sys_setgid(gid);
}
/* /*
* change the user struct in a credentials set to match the new UID * change the user struct in a credentials set to match the new UID
*/ */
@ -473,7 +485,7 @@ static int set_user(struct cred *new)
* 100% compatible with BSD. A program which uses just setuid() will be * 100% compatible with BSD. A program which uses just setuid() will be
* 100% compatible with POSIX with saved IDs. * 100% compatible with POSIX with saved IDs.
*/ */
SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid) long __sys_setreuid(uid_t ruid, uid_t euid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -533,6 +545,11 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
{
return __sys_setreuid(ruid, euid);
}
/* /*
* setuid() is implemented like SysV with SAVED_IDS * setuid() is implemented like SysV with SAVED_IDS
* *
@ -544,7 +561,7 @@ error:
* will allow a root program to temporarily drop privileges and be able to * will allow a root program to temporarily drop privileges and be able to
* regain them by swapping the real and effective uid. * regain them by swapping the real and effective uid.
*/ */
SYSCALL_DEFINE1(setuid, uid_t, uid) long __sys_setuid(uid_t uid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -586,12 +603,17 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE1(setuid, uid_t, uid)
{
return __sys_setuid(uid);
}
/* /*
* This function implements a generic ability to update ruid, euid, * This function implements a generic ability to update ruid, euid,
* and suid. This allows you to implement the 4.4 compatible seteuid(). * and suid. This allows you to implement the 4.4 compatible seteuid().
*/ */
SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid) long __sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -656,6 +678,11 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
{
return __sys_setresuid(ruid, euid, suid);
}
SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t __user *, suidp) SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t __user *, suidp)
{ {
const struct cred *cred = current_cred(); const struct cred *cred = current_cred();
@ -678,7 +705,7 @@ SYSCALL_DEFINE3(getresuid, uid_t __user *, ruidp, uid_t __user *, euidp, uid_t _
/* /*
* Same as above, but for rgid, egid, sgid. * Same as above, but for rgid, egid, sgid.
*/ */
SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid) long __sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
{ {
struct user_namespace *ns = current_user_ns(); struct user_namespace *ns = current_user_ns();
const struct cred *old; const struct cred *old;
@ -730,6 +757,11 @@ error:
return retval; return retval;
} }
SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
{
return __sys_setresgid(rgid, egid, sgid);
}
SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t __user *, sgidp) SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t __user *, sgidp)
{ {
const struct cred *cred = current_cred(); const struct cred *cred = current_cred();
@ -757,7 +789,7 @@ SYSCALL_DEFINE3(getresgid, gid_t __user *, rgidp, gid_t __user *, egidp, gid_t _
* whatever uid it wants to). It normally shadows "euid", except when * whatever uid it wants to). It normally shadows "euid", except when
* explicitly set by setfsuid() or for access.. * explicitly set by setfsuid() or for access..
*/ */
SYSCALL_DEFINE1(setfsuid, uid_t, uid) long __sys_setfsuid(uid_t uid)
{ {
const struct cred *old; const struct cred *old;
struct cred *new; struct cred *new;
@ -793,10 +825,15 @@ change_okay:
return old_fsuid; return old_fsuid;
} }
SYSCALL_DEFINE1(setfsuid, uid_t, uid)
{
return __sys_setfsuid(uid);
}
/* /*
* Samma svenska.. * Samma svenska..
*/ */
SYSCALL_DEFINE1(setfsgid, gid_t, gid) long __sys_setfsgid(gid_t gid)
{ {
const struct cred *old; const struct cred *old;
struct cred *new; struct cred *new;
@ -830,6 +867,11 @@ change_okay:
commit_creds(new); commit_creds(new);
return old_fsgid; return old_fsgid;
} }
SYSCALL_DEFINE1(setfsgid, gid_t, gid)
{
return __sys_setfsgid(gid);
}
#endif /* CONFIG_MULTIUSER */ #endif /* CONFIG_MULTIUSER */
/** /**
@ -1027,7 +1069,7 @@ out:
return err; return err;
} }
SYSCALL_DEFINE1(getpgid, pid_t, pid) static int do_getpgid(pid_t pid)
{ {
struct task_struct *p; struct task_struct *p;
struct pid *grp; struct pid *grp;
@ -1055,11 +1097,16 @@ out:
return retval; return retval;
} }
SYSCALL_DEFINE1(getpgid, pid_t, pid)
{
return do_getpgid(pid);
}
#ifdef __ARCH_WANT_SYS_GETPGRP #ifdef __ARCH_WANT_SYS_GETPGRP
SYSCALL_DEFINE0(getpgrp) SYSCALL_DEFINE0(getpgrp)
{ {
return sys_getpgid(0); return do_getpgid(0);
} }
#endif #endif
@ -1103,7 +1150,7 @@ static void set_special_pids(struct pid *pid)
change_pid(curr, PIDTYPE_PGID, pid); change_pid(curr, PIDTYPE_PGID, pid);
} }
SYSCALL_DEFINE0(setsid) int ksys_setsid(void)
{ {
struct task_struct *group_leader = current->group_leader; struct task_struct *group_leader = current->group_leader;
struct pid *sid = task_pid(group_leader); struct pid *sid = task_pid(group_leader);
@ -1136,6 +1183,11 @@ out:
return err; return err;
} }
SYSCALL_DEFINE0(setsid)
{
return ksys_setsid();
}
DECLARE_RWSEM(uts_sem); DECLARE_RWSEM(uts_sem);
#ifdef COMPAT_UTS_MACHINE #ifdef COMPAT_UTS_MACHINE

View File

@ -17,245 +17,406 @@ asmlinkage long sys_ni_syscall(void)
return -ENOSYS; return -ENOSYS;
} }
cond_syscall(sys_quotactl); #define COND_SYSCALL(name) cond_syscall(sys_##name)
cond_syscall(sys32_quotactl); #define COND_SYSCALL_COMPAT(name) cond_syscall(compat_sys_##name)
cond_syscall(sys_acct);
cond_syscall(sys_lookup_dcookie);
cond_syscall(compat_sys_lookup_dcookie);
cond_syscall(sys_swapon);
cond_syscall(sys_swapoff);
cond_syscall(sys_kexec_load);
cond_syscall(compat_sys_kexec_load);
cond_syscall(sys_kexec_file_load);
cond_syscall(sys_init_module);
cond_syscall(sys_finit_module);
cond_syscall(sys_delete_module);
cond_syscall(sys_socketpair);
cond_syscall(sys_bind);
cond_syscall(sys_listen);
cond_syscall(sys_accept);
cond_syscall(sys_accept4);
cond_syscall(sys_connect);
cond_syscall(sys_getsockname);
cond_syscall(sys_getpeername);
cond_syscall(sys_sendto);
cond_syscall(sys_send);
cond_syscall(sys_recvfrom);
cond_syscall(sys_recv);
cond_syscall(sys_socket);
cond_syscall(sys_setsockopt);
cond_syscall(compat_sys_setsockopt);
cond_syscall(sys_getsockopt);
cond_syscall(compat_sys_getsockopt);
cond_syscall(sys_shutdown);
cond_syscall(sys_sendmsg);
cond_syscall(sys_sendmmsg);
cond_syscall(compat_sys_sendmsg);
cond_syscall(compat_sys_sendmmsg);
cond_syscall(sys_recvmsg);
cond_syscall(sys_recvmmsg);
cond_syscall(compat_sys_recvmsg);
cond_syscall(compat_sys_recv);
cond_syscall(compat_sys_recvfrom);
cond_syscall(compat_sys_recvmmsg);
cond_syscall(sys_socketcall);
cond_syscall(sys_futex);
cond_syscall(compat_sys_futex);
cond_syscall(sys_set_robust_list);
cond_syscall(compat_sys_set_robust_list);
cond_syscall(sys_get_robust_list);
cond_syscall(compat_sys_get_robust_list);
cond_syscall(sys_epoll_create);
cond_syscall(sys_epoll_create1);
cond_syscall(sys_epoll_ctl);
cond_syscall(sys_epoll_wait);
cond_syscall(sys_epoll_pwait);
cond_syscall(compat_sys_epoll_pwait);
cond_syscall(sys_semget);
cond_syscall(sys_semop);
cond_syscall(sys_semtimedop);
cond_syscall(compat_sys_semtimedop);
cond_syscall(sys_semctl);
cond_syscall(compat_sys_semctl);
cond_syscall(sys_msgget);
cond_syscall(sys_msgsnd);
cond_syscall(compat_sys_msgsnd);
cond_syscall(sys_msgrcv);
cond_syscall(compat_sys_msgrcv);
cond_syscall(sys_msgctl);
cond_syscall(compat_sys_msgctl);
cond_syscall(sys_shmget);
cond_syscall(sys_shmat);
cond_syscall(compat_sys_shmat);
cond_syscall(sys_shmdt);
cond_syscall(sys_shmctl);
cond_syscall(compat_sys_shmctl);
cond_syscall(sys_mq_open);
cond_syscall(sys_mq_unlink);
cond_syscall(sys_mq_timedsend);
cond_syscall(sys_mq_timedreceive);
cond_syscall(sys_mq_notify);
cond_syscall(sys_mq_getsetattr);
cond_syscall(compat_sys_mq_open);
cond_syscall(compat_sys_mq_timedsend);
cond_syscall(compat_sys_mq_timedreceive);
cond_syscall(compat_sys_mq_notify);
cond_syscall(compat_sys_mq_getsetattr);
cond_syscall(sys_mbind);
cond_syscall(sys_get_mempolicy);
cond_syscall(sys_set_mempolicy);
cond_syscall(compat_sys_mbind);
cond_syscall(compat_sys_get_mempolicy);
cond_syscall(compat_sys_set_mempolicy);
cond_syscall(sys_add_key);
cond_syscall(sys_request_key);
cond_syscall(sys_keyctl);
cond_syscall(compat_sys_keyctl);
cond_syscall(compat_sys_socketcall);
cond_syscall(sys_inotify_init);
cond_syscall(sys_inotify_init1);
cond_syscall(sys_inotify_add_watch);
cond_syscall(sys_inotify_rm_watch);
cond_syscall(sys_migrate_pages);
cond_syscall(sys_move_pages);
cond_syscall(sys_chown16);
cond_syscall(sys_fchown16);
cond_syscall(sys_getegid16);
cond_syscall(sys_geteuid16);
cond_syscall(sys_getgid16);
cond_syscall(sys_getgroups16);
cond_syscall(sys_getresgid16);
cond_syscall(sys_getresuid16);
cond_syscall(sys_getuid16);
cond_syscall(sys_lchown16);
cond_syscall(sys_setfsgid16);
cond_syscall(sys_setfsuid16);
cond_syscall(sys_setgid16);
cond_syscall(sys_setgroups16);
cond_syscall(sys_setregid16);
cond_syscall(sys_setresgid16);
cond_syscall(sys_setresuid16);
cond_syscall(sys_setreuid16);
cond_syscall(sys_setuid16);
cond_syscall(sys_sgetmask);
cond_syscall(sys_ssetmask);
cond_syscall(sys_vm86old);
cond_syscall(sys_vm86);
cond_syscall(sys_modify_ldt);
cond_syscall(sys_ipc);
cond_syscall(compat_sys_ipc);
cond_syscall(compat_sys_sysctl);
cond_syscall(sys_flock);
cond_syscall(sys_io_setup);
cond_syscall(sys_io_destroy);
cond_syscall(sys_io_submit);
cond_syscall(sys_io_cancel);
cond_syscall(sys_io_getevents);
cond_syscall(compat_sys_io_setup);
cond_syscall(compat_sys_io_submit);
cond_syscall(compat_sys_io_getevents);
cond_syscall(sys_sysfs);
cond_syscall(sys_syslog);
cond_syscall(sys_process_vm_readv);
cond_syscall(sys_process_vm_writev);
cond_syscall(compat_sys_process_vm_readv);
cond_syscall(compat_sys_process_vm_writev);
cond_syscall(sys_uselib);
cond_syscall(sys_fadvise64);
cond_syscall(sys_fadvise64_64);
cond_syscall(sys_madvise);
cond_syscall(sys_setuid);
cond_syscall(sys_setregid);
cond_syscall(sys_setgid);
cond_syscall(sys_setreuid);
cond_syscall(sys_setresuid);
cond_syscall(sys_getresuid);
cond_syscall(sys_setresgid);
cond_syscall(sys_getresgid);
cond_syscall(sys_setgroups);
cond_syscall(sys_getgroups);
cond_syscall(sys_setfsuid);
cond_syscall(sys_setfsgid);
cond_syscall(sys_capget);
cond_syscall(sys_capset);
cond_syscall(sys_copy_file_range);
/* arch-specific weak syscall entries */ /*
cond_syscall(sys_pciconfig_read); * This list is kept in the same order as include/uapi/asm-generic/unistd.h.
cond_syscall(sys_pciconfig_write); * Architecture specific entries go below, followed by deprecated or obsolete
cond_syscall(sys_pciconfig_iobase); * system calls.
cond_syscall(compat_sys_s390_ipc); */
cond_syscall(ppc_rtas);
cond_syscall(sys_spu_run);
cond_syscall(sys_spu_create);
cond_syscall(sys_subpage_prot);
cond_syscall(sys_s390_pci_mmio_read);
cond_syscall(sys_s390_pci_mmio_write);
/* mmu depending weak syscall entries */ COND_SYSCALL(io_setup);
cond_syscall(sys_mprotect); COND_SYSCALL_COMPAT(io_setup);
cond_syscall(sys_msync); COND_SYSCALL(io_destroy);
cond_syscall(sys_mlock); COND_SYSCALL(io_submit);
cond_syscall(sys_munlock); COND_SYSCALL_COMPAT(io_submit);
cond_syscall(sys_mlockall); COND_SYSCALL(io_cancel);
cond_syscall(sys_munlockall); COND_SYSCALL(io_getevents);
cond_syscall(sys_mlock2); COND_SYSCALL_COMPAT(io_getevents);
cond_syscall(sys_mincore);
cond_syscall(sys_madvise);
cond_syscall(sys_mremap);
cond_syscall(sys_remap_file_pages);
cond_syscall(compat_sys_move_pages);
cond_syscall(compat_sys_migrate_pages);
/* block-layer dependent */ /* fs/xattr.c */
cond_syscall(sys_bdflush);
cond_syscall(sys_ioprio_set);
cond_syscall(sys_ioprio_get);
/* New file descriptors */ /* fs/dcache.c */
cond_syscall(sys_signalfd);
cond_syscall(sys_signalfd4);
cond_syscall(compat_sys_signalfd);
cond_syscall(compat_sys_signalfd4);
cond_syscall(sys_timerfd_create);
cond_syscall(sys_timerfd_settime);
cond_syscall(sys_timerfd_gettime);
cond_syscall(compat_sys_timerfd_settime);
cond_syscall(compat_sys_timerfd_gettime);
cond_syscall(sys_eventfd);
cond_syscall(sys_eventfd2);
cond_syscall(sys_memfd_create);
cond_syscall(sys_userfaultfd);
/* performance counters: */ /* fs/cookies.c */
cond_syscall(sys_perf_event_open); COND_SYSCALL(lookup_dcookie);
COND_SYSCALL_COMPAT(lookup_dcookie);
/* fanotify! */ /* fs/eventfd.c */
cond_syscall(sys_fanotify_init); COND_SYSCALL(eventfd2);
cond_syscall(sys_fanotify_mark);
cond_syscall(compat_sys_fanotify_mark); /* fs/eventfd.c */
COND_SYSCALL(epoll_create1);
COND_SYSCALL(epoll_ctl);
COND_SYSCALL(epoll_pwait);
COND_SYSCALL_COMPAT(epoll_pwait);
/* fs/fcntl.c */
/* fs/inotify_user.c */
COND_SYSCALL(inotify_init1);
COND_SYSCALL(inotify_add_watch);
COND_SYSCALL(inotify_rm_watch);
/* fs/ioctl.c */
/* fs/ioprio.c */
COND_SYSCALL(ioprio_set);
COND_SYSCALL(ioprio_get);
/* fs/locks.c */
COND_SYSCALL(flock);
/* fs/namei.c */
/* fs/namespace.c */
/* fs/nfsctl.c */
/* fs/open.c */
/* fs/pipe.c */
/* fs/quota.c */
COND_SYSCALL(quotactl);
/* fs/readdir.c */
/* fs/read_write.c */
/* fs/sendfile.c */
/* fs/select.c */
/* fs/signalfd.c */
COND_SYSCALL(signalfd4);
COND_SYSCALL_COMPAT(signalfd4);
/* fs/splice.c */
/* fs/stat.c */
/* fs/sync.c */
/* fs/timerfd.c */
COND_SYSCALL(timerfd_create);
COND_SYSCALL(timerfd_settime);
COND_SYSCALL_COMPAT(timerfd_settime);
COND_SYSCALL(timerfd_gettime);
COND_SYSCALL_COMPAT(timerfd_gettime);
/* fs/utimes.c */
/* kernel/acct.c */
COND_SYSCALL(acct);
/* kernel/capability.c */
COND_SYSCALL(capget);
COND_SYSCALL(capset);
/* kernel/exec_domain.c */
/* kernel/exit.c */
/* kernel/fork.c */
/* kernel/futex.c */
COND_SYSCALL(futex);
COND_SYSCALL_COMPAT(futex);
COND_SYSCALL(set_robust_list);
COND_SYSCALL_COMPAT(set_robust_list);
COND_SYSCALL(get_robust_list);
COND_SYSCALL_COMPAT(get_robust_list);
/* kernel/hrtimer.c */
/* kernel/itimer.c */
/* kernel/kexec.c */
COND_SYSCALL(kexec_load);
COND_SYSCALL_COMPAT(kexec_load);
/* kernel/module.c */
COND_SYSCALL(init_module);
COND_SYSCALL(delete_module);
/* kernel/posix-timers.c */
/* kernel/printk.c */
COND_SYSCALL(syslog);
/* kernel/ptrace.c */
/* kernel/sched/core.c */
/* kernel/signal.c */
/* kernel/sys.c */
COND_SYSCALL(setregid);
COND_SYSCALL(setgid);
COND_SYSCALL(setreuid);
COND_SYSCALL(setuid);
COND_SYSCALL(setresuid);
COND_SYSCALL(getresuid);
COND_SYSCALL(setresgid);
COND_SYSCALL(getresgid);
COND_SYSCALL(setfsuid);
COND_SYSCALL(setfsgid);
COND_SYSCALL(setgroups);
COND_SYSCALL(getgroups);
/* kernel/time.c */
/* kernel/timer.c */
/* ipc/mqueue.c */
COND_SYSCALL(mq_open);
COND_SYSCALL_COMPAT(mq_open);
COND_SYSCALL(mq_unlink);
COND_SYSCALL(mq_timedsend);
COND_SYSCALL_COMPAT(mq_timedsend);
COND_SYSCALL(mq_timedreceive);
COND_SYSCALL_COMPAT(mq_timedreceive);
COND_SYSCALL(mq_notify);
COND_SYSCALL_COMPAT(mq_notify);
COND_SYSCALL(mq_getsetattr);
COND_SYSCALL_COMPAT(mq_getsetattr);
/* ipc/msg.c */
COND_SYSCALL(msgget);
COND_SYSCALL(msgctl);
COND_SYSCALL_COMPAT(msgctl);
COND_SYSCALL(msgrcv);
COND_SYSCALL_COMPAT(msgrcv);
COND_SYSCALL(msgsnd);
COND_SYSCALL_COMPAT(msgsnd);
/* ipc/sem.c */
COND_SYSCALL(semget);
COND_SYSCALL(semctl);
COND_SYSCALL_COMPAT(semctl);
COND_SYSCALL(semtimedop);
COND_SYSCALL_COMPAT(semtimedop);
COND_SYSCALL(semop);
/* ipc/shm.c */
COND_SYSCALL(shmget);
COND_SYSCALL(shmctl);
COND_SYSCALL_COMPAT(shmctl);
COND_SYSCALL(shmat);
COND_SYSCALL_COMPAT(shmat);
COND_SYSCALL(shmdt);
/* net/socket.c */
COND_SYSCALL(socket);
COND_SYSCALL(socketpair);
COND_SYSCALL(bind);
COND_SYSCALL(listen);
COND_SYSCALL(accept);
COND_SYSCALL(connect);
COND_SYSCALL(getsockname);
COND_SYSCALL(getpeername);
COND_SYSCALL(setsockopt);
COND_SYSCALL_COMPAT(setsockopt);
COND_SYSCALL(getsockopt);
COND_SYSCALL_COMPAT(getsockopt);
COND_SYSCALL(sendto);
COND_SYSCALL(shutdown);
COND_SYSCALL(recvfrom);
COND_SYSCALL_COMPAT(recvfrom);
COND_SYSCALL(sendmsg);
COND_SYSCALL_COMPAT(sendmsg);
COND_SYSCALL(recvmsg);
COND_SYSCALL_COMPAT(recvmsg);
/* mm/filemap.c */
/* mm/nommu.c, also with MMU */
COND_SYSCALL(mremap);
/* security/keys/keyctl.c */
COND_SYSCALL(add_key);
COND_SYSCALL(request_key);
COND_SYSCALL(keyctl);
COND_SYSCALL_COMPAT(keyctl);
/* arch/example/kernel/sys_example.c */
/* mm/fadvise.c */
COND_SYSCALL(fadvise64_64);
/* mm/, CONFIG_MMU only */
COND_SYSCALL(swapon);
COND_SYSCALL(swapoff);
COND_SYSCALL(mprotect);
COND_SYSCALL(msync);
COND_SYSCALL(mlock);
COND_SYSCALL(munlock);
COND_SYSCALL(mlockall);
COND_SYSCALL(munlockall);
COND_SYSCALL(mincore);
COND_SYSCALL(madvise);
COND_SYSCALL(remap_file_pages);
COND_SYSCALL(mbind);
COND_SYSCALL_COMPAT(mbind);
COND_SYSCALL(get_mempolicy);
COND_SYSCALL_COMPAT(get_mempolicy);
COND_SYSCALL(set_mempolicy);
COND_SYSCALL_COMPAT(set_mempolicy);
COND_SYSCALL(migrate_pages);
COND_SYSCALL_COMPAT(migrate_pages);
COND_SYSCALL(move_pages);
COND_SYSCALL_COMPAT(move_pages);
COND_SYSCALL(perf_event_open);
COND_SYSCALL(accept4);
COND_SYSCALL(recvmmsg);
COND_SYSCALL_COMPAT(recvmmsg);
/*
* Architecture specific syscalls: see further below
*/
/* fanotify */
COND_SYSCALL(fanotify_init);
COND_SYSCALL(fanotify_mark);
/* open by handle */ /* open by handle */
cond_syscall(sys_name_to_handle_at); COND_SYSCALL(name_to_handle_at);
cond_syscall(sys_open_by_handle_at); COND_SYSCALL(open_by_handle_at);
cond_syscall(compat_sys_open_by_handle_at); COND_SYSCALL_COMPAT(open_by_handle_at);
COND_SYSCALL(sendmmsg);
COND_SYSCALL_COMPAT(sendmmsg);
COND_SYSCALL(process_vm_readv);
COND_SYSCALL_COMPAT(process_vm_readv);
COND_SYSCALL(process_vm_writev);
COND_SYSCALL_COMPAT(process_vm_writev);
/* compare kernel pointers */ /* compare kernel pointers */
cond_syscall(sys_kcmp); COND_SYSCALL(kcmp);
COND_SYSCALL(finit_module);
/* operate on Secure Computing state */ /* operate on Secure Computing state */
cond_syscall(sys_seccomp); COND_SYSCALL(seccomp);
COND_SYSCALL(memfd_create);
/* access BPF programs and maps */ /* access BPF programs and maps */
cond_syscall(sys_bpf); COND_SYSCALL(bpf);
/* execveat */ /* execveat */
cond_syscall(sys_execveat); COND_SYSCALL(execveat);
COND_SYSCALL(userfaultfd);
/* membarrier */ /* membarrier */
cond_syscall(sys_membarrier); COND_SYSCALL(membarrier);
COND_SYSCALL(mlock2);
COND_SYSCALL(copy_file_range);
/* memory protection keys */ /* memory protection keys */
cond_syscall(sys_pkey_mprotect); COND_SYSCALL(pkey_mprotect);
cond_syscall(sys_pkey_alloc); COND_SYSCALL(pkey_alloc);
cond_syscall(sys_pkey_free); COND_SYSCALL(pkey_free);
/*
* Architecture specific weak syscall entries.
*/
/* pciconfig: alpha, arm, arm64, ia64, sparc */
COND_SYSCALL(pciconfig_read);
COND_SYSCALL(pciconfig_write);
COND_SYSCALL(pciconfig_iobase);
/* sys_socketcall: arm, mips, x86, ... */
COND_SYSCALL(socketcall);
COND_SYSCALL_COMPAT(socketcall);
/* compat syscalls for arm64, x86, ... */
COND_SYSCALL_COMPAT(sysctl);
COND_SYSCALL_COMPAT(fanotify_mark);
/* x86 */
COND_SYSCALL(vm86old);
COND_SYSCALL(modify_ldt);
COND_SYSCALL_COMPAT(quotactl32);
COND_SYSCALL(vm86);
COND_SYSCALL(kexec_file_load);
/* s390 */
COND_SYSCALL(s390_pci_mmio_read);
COND_SYSCALL(s390_pci_mmio_write);
COND_SYSCALL_COMPAT(s390_ipc);
/* powerpc */
cond_syscall(ppc_rtas);
COND_SYSCALL(spu_run);
COND_SYSCALL(spu_create);
COND_SYSCALL(subpage_prot);
/*
* Deprecated system calls which are still defined in
* include/uapi/asm-generic/unistd.h and wanted by >= 1 arch
*/
/* __ARCH_WANT_SYSCALL_NO_FLAGS */
COND_SYSCALL(epoll_create);
COND_SYSCALL(inotify_init);
COND_SYSCALL(eventfd);
COND_SYSCALL(signalfd);
COND_SYSCALL_COMPAT(signalfd);
/* __ARCH_WANT_SYSCALL_OFF_T */
COND_SYSCALL(fadvise64);
/* __ARCH_WANT_SYSCALL_DEPRECATED */
COND_SYSCALL(epoll_wait);
COND_SYSCALL(recv);
COND_SYSCALL_COMPAT(recv);
COND_SYSCALL(send);
COND_SYSCALL(bdflush);
COND_SYSCALL(uselib);
/*
* The syscalls below are not found in include/uapi/asm-generic/unistd.h
*/
/* obsolete: SGETMASK_SYSCALL */
COND_SYSCALL(sgetmask);
COND_SYSCALL(ssetmask);
/* obsolete: SYSFS_SYSCALL */
COND_SYSCALL(sysfs);
/* obsolete: __ARCH_WANT_SYS_IPC */
COND_SYSCALL(ipc);
COND_SYSCALL_COMPAT(ipc);
/* obsolete: UID16 */
COND_SYSCALL(chown16);
COND_SYSCALL(fchown16);
COND_SYSCALL(getegid16);
COND_SYSCALL(geteuid16);
COND_SYSCALL(getgid16);
COND_SYSCALL(getgroups16);
COND_SYSCALL(getresgid16);
COND_SYSCALL(getresuid16);
COND_SYSCALL(getuid16);
COND_SYSCALL(lchown16);
COND_SYSCALL(setfsgid16);
COND_SYSCALL(setfsuid16);
COND_SYSCALL(setgid16);
COND_SYSCALL(setgroups16);
COND_SYSCALL(setregid16);
COND_SYSCALL(setresgid16);
COND_SYSCALL(setresuid16);
COND_SYSCALL(setreuid16);
COND_SYSCALL(setuid16);

View File

@ -18,44 +18,46 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include "uid16.h"
SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
{ {
return sys_chown(filename, low2highuid(user), low2highgid(group)); return ksys_chown(filename, low2highuid(user), low2highgid(group));
} }
SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group) SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
{ {
return sys_lchown(filename, low2highuid(user), low2highgid(group)); return ksys_lchown(filename, low2highuid(user), low2highgid(group));
} }
SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group) SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
{ {
return sys_fchown(fd, low2highuid(user), low2highgid(group)); return ksys_fchown(fd, low2highuid(user), low2highgid(group));
} }
SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid) SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
{ {
return sys_setregid(low2highgid(rgid), low2highgid(egid)); return __sys_setregid(low2highgid(rgid), low2highgid(egid));
} }
SYSCALL_DEFINE1(setgid16, old_gid_t, gid) SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
{ {
return sys_setgid(low2highgid(gid)); return __sys_setgid(low2highgid(gid));
} }
SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid) SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
{ {
return sys_setreuid(low2highuid(ruid), low2highuid(euid)); return __sys_setreuid(low2highuid(ruid), low2highuid(euid));
} }
SYSCALL_DEFINE1(setuid16, old_uid_t, uid) SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
{ {
return sys_setuid(low2highuid(uid)); return __sys_setuid(low2highuid(uid));
} }
SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid) SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
{ {
return sys_setresuid(low2highuid(ruid), low2highuid(euid), return __sys_setresuid(low2highuid(ruid), low2highuid(euid),
low2highuid(suid)); low2highuid(suid));
} }
@ -78,11 +80,10 @@ SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruidp, old_uid_t __user *, euid
SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid) SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
{ {
return sys_setresgid(low2highgid(rgid), low2highgid(egid), return __sys_setresgid(low2highgid(rgid), low2highgid(egid),
low2highgid(sgid)); low2highgid(sgid));
} }
SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp) SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egidp, old_gid_t __user *, sgidp)
{ {
const struct cred *cred = current_cred(); const struct cred *cred = current_cred();
@ -102,12 +103,12 @@ SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgidp, old_gid_t __user *, egid
SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid) SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
{ {
return sys_setfsuid(low2highuid(uid)); return __sys_setfsuid(low2highuid(uid));
} }
SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid) SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
{ {
return sys_setfsgid(low2highgid(gid)); return __sys_setfsgid(low2highgid(gid));
} }
static int groups16_to_user(old_gid_t __user *grouplist, static int groups16_to_user(old_gid_t __user *grouplist,

14
kernel/uid16.h Normal file
View File

@ -0,0 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef LINUX_UID16_H
#define LINUX_UID16_H
long __sys_setuid(uid_t uid);
long __sys_setgid(gid_t gid);
long __sys_setreuid(uid_t ruid, uid_t euid);
long __sys_setregid(gid_t rgid, gid_t egid);
long __sys_setresuid(uid_t ruid, uid_t euid, uid_t suid);
long __sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid);
long __sys_setfsuid(uid_t uid);
long __sys_setfsgid(gid_t gid);
#endif /* LINUX_UID16_H */

View File

@ -118,7 +118,7 @@ static void call_usermodehelper_exec_sync(struct subprocess_info *sub_info)
{ {
pid_t pid; pid_t pid;
/* If SIGCLD is ignored sys_wait4 won't populate the status. */ /* If SIGCLD is ignored kernel_wait4 won't populate the status. */
kernel_sigaction(SIGCHLD, SIG_DFL); kernel_sigaction(SIGCHLD, SIG_DFL);
pid = kernel_thread(call_usermodehelper_exec_async, sub_info, SIGCHLD); pid = kernel_thread(call_usermodehelper_exec_async, sub_info, SIGCHLD);
if (pid < 0) { if (pid < 0) {
@ -135,7 +135,7 @@ static void call_usermodehelper_exec_sync(struct subprocess_info *sub_info)
* *
* Thus the __user pointer cast is valid here. * Thus the __user pointer cast is valid here.
*/ */
sys_wait4(pid, (int __user *)&ret, 0, NULL); kernel_wait4(pid, (int __user *)&ret, 0, NULL);
/* /*
* If ret is 0, either call_usermodehelper_exec_async failed and * If ret is 0, either call_usermodehelper_exec_async failed and

View File

@ -26,7 +26,8 @@
* POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could
* deactivate the pages and clear PG_Referenced. * deactivate the pages and clear PG_Referenced.
*/ */
SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
int ksys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
{ {
struct fd f = fdget(fd); struct fd f = fdget(fd);
struct inode *inode; struct inode *inode;
@ -185,11 +186,16 @@ out:
return ret; return ret;
} }
SYSCALL_DEFINE4(fadvise64_64, int, fd, loff_t, offset, loff_t, len, int, advice)
{
return ksys_fadvise64_64(fd, offset, len, advice);
}
#ifdef __ARCH_WANT_SYS_FADVISE64 #ifdef __ARCH_WANT_SYS_FADVISE64
SYSCALL_DEFINE4(fadvise64, int, fd, loff_t, offset, size_t, len, int, advice) SYSCALL_DEFINE4(fadvise64, int, fd, loff_t, offset, size_t, len, int, advice)
{ {
return sys_fadvise64_64(fd, offset, len, advice); return ksys_fadvise64_64(fd, offset, len, advice);
} }
#endif #endif

View File

@ -1336,9 +1336,9 @@ static int copy_nodes_to_user(unsigned long __user *mask, unsigned long maxnode,
return copy_to_user(mask, nodes_addr(*nodes), copy) ? -EFAULT : 0; return copy_to_user(mask, nodes_addr(*nodes), copy) ? -EFAULT : 0;
} }
SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len, static long kernel_mbind(unsigned long start, unsigned long len,
unsigned long, mode, const unsigned long __user *, nmask, unsigned long mode, const unsigned long __user *nmask,
unsigned long, maxnode, unsigned, flags) unsigned long maxnode, unsigned int flags)
{ {
nodemask_t nodes; nodemask_t nodes;
int err; int err;
@ -1357,9 +1357,16 @@ SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
return do_mbind(start, len, mode, mode_flags, &nodes, flags); return do_mbind(start, len, mode, mode_flags, &nodes, flags);
} }
SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
unsigned long, mode, const unsigned long __user *, nmask,
unsigned long, maxnode, unsigned int, flags)
{
return kernel_mbind(start, len, mode, nmask, maxnode, flags);
}
/* Set the process memory policy */ /* Set the process memory policy */
SYSCALL_DEFINE3(set_mempolicy, int, mode, const unsigned long __user *, nmask, static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask,
unsigned long, maxnode) unsigned long maxnode)
{ {
int err; int err;
nodemask_t nodes; nodemask_t nodes;
@ -1377,9 +1384,15 @@ SYSCALL_DEFINE3(set_mempolicy, int, mode, const unsigned long __user *, nmask,
return do_set_mempolicy(mode, flags, &nodes); return do_set_mempolicy(mode, flags, &nodes);
} }
SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode, SYSCALL_DEFINE3(set_mempolicy, int, mode, const unsigned long __user *, nmask,
const unsigned long __user *, old_nodes, unsigned long, maxnode)
const unsigned long __user *, new_nodes) {
return kernel_set_mempolicy(mode, nmask, maxnode);
}
static int kernel_migrate_pages(pid_t pid, unsigned long maxnode,
const unsigned long __user *old_nodes,
const unsigned long __user *new_nodes)
{ {
struct mm_struct *mm = NULL; struct mm_struct *mm = NULL;
struct task_struct *task; struct task_struct *task;
@ -1469,11 +1482,20 @@ out_put:
} }
SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
const unsigned long __user *, old_nodes,
const unsigned long __user *, new_nodes)
{
return kernel_migrate_pages(pid, maxnode, old_nodes, new_nodes);
}
/* Retrieve NUMA policy */ /* Retrieve NUMA policy */
SYSCALL_DEFINE5(get_mempolicy, int __user *, policy, static int kernel_get_mempolicy(int __user *policy,
unsigned long __user *, nmask, unsigned long, maxnode, unsigned long __user *nmask,
unsigned long, addr, unsigned long, flags) unsigned long maxnode,
unsigned long addr,
unsigned long flags)
{ {
int err; int err;
int uninitialized_var(pval); int uninitialized_var(pval);
@ -1496,6 +1518,13 @@ SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
return err; return err;
} }
SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
unsigned long __user *, nmask, unsigned long, maxnode,
unsigned long, addr, unsigned long, flags)
{
return kernel_get_mempolicy(policy, nmask, maxnode, addr, flags);
}
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE5(get_mempolicy, int __user *, policy, COMPAT_SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
@ -1514,7 +1543,7 @@ COMPAT_SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
if (nmask) if (nmask)
nm = compat_alloc_user_space(alloc_size); nm = compat_alloc_user_space(alloc_size);
err = sys_get_mempolicy(policy, nm, nr_bits+1, addr, flags); err = kernel_get_mempolicy(policy, nm, nr_bits+1, addr, flags);
if (!err && nmask) { if (!err && nmask) {
unsigned long copy_size; unsigned long copy_size;
@ -1546,7 +1575,7 @@ COMPAT_SYSCALL_DEFINE3(set_mempolicy, int, mode, compat_ulong_t __user *, nmask,
return -EFAULT; return -EFAULT;
} }
return sys_set_mempolicy(mode, nm, nr_bits+1); return kernel_set_mempolicy(mode, nm, nr_bits+1);
} }
COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len, COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len,
@ -1568,10 +1597,43 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len,
return -EFAULT; return -EFAULT;
} }
return sys_mbind(start, len, mode, nm, nr_bits+1, flags); return kernel_mbind(start, len, mode, nm, nr_bits+1, flags);
} }
#endif COMPAT_SYSCALL_DEFINE4(migrate_pages, compat_pid_t, pid,
compat_ulong_t, maxnode,
const compat_ulong_t __user *, old_nodes,
const compat_ulong_t __user *, new_nodes)
{
unsigned long __user *old = NULL;
unsigned long __user *new = NULL;
nodemask_t tmp_mask;
unsigned long nr_bits;
unsigned long size;
nr_bits = min_t(unsigned long, maxnode - 1, MAX_NUMNODES);
size = ALIGN(nr_bits, BITS_PER_LONG) / 8;
if (old_nodes) {
if (compat_get_bitmap(nodes_addr(tmp_mask), old_nodes, nr_bits))
return -EFAULT;
old = compat_alloc_user_space(new_nodes ? size * 2 : size);
if (new_nodes)
new = old + size / sizeof(unsigned long);
if (copy_to_user(old, nodes_addr(tmp_mask), size))
return -EFAULT;
}
if (new_nodes) {
if (compat_get_bitmap(nodes_addr(tmp_mask), new_nodes, nr_bits))
return -EFAULT;
if (new == NULL)
new = compat_alloc_user_space(size);
if (copy_to_user(new, nodes_addr(tmp_mask), size))
return -EFAULT;
}
return kernel_migrate_pages(pid, nr_bits + 1, old, new);
}
#endif /* CONFIG_COMPAT */
struct mempolicy *__get_vma_policy(struct vm_area_struct *vma, struct mempolicy *__get_vma_policy(struct vm_area_struct *vma,
unsigned long addr) unsigned long addr)

View File

@ -34,6 +34,7 @@
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/compaction.h> #include <linux/compaction.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/compat.h>
#include <linux/hugetlb.h> #include <linux/hugetlb.h>
#include <linux/hugetlb_cgroup.h> #include <linux/hugetlb_cgroup.h>
#include <linux/gfp.h> #include <linux/gfp.h>
@ -1745,10 +1746,10 @@ static int do_pages_stat(struct mm_struct *mm, unsigned long nr_pages,
* Move a list of pages in the address space of the currently executing * Move a list of pages in the address space of the currently executing
* process. * process.
*/ */
SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, static int kernel_move_pages(pid_t pid, unsigned long nr_pages,
const void __user * __user *, pages, const void __user * __user *pages,
const int __user *, nodes, const int __user *nodes,
int __user *, status, int, flags) int __user *status, int flags)
{ {
struct task_struct *task; struct task_struct *task;
struct mm_struct *mm; struct mm_struct *mm;
@ -1807,6 +1808,36 @@ out:
return err; return err;
} }
SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
const void __user * __user *, pages,
const int __user *, nodes,
int __user *, status, int, flags)
{
return kernel_move_pages(pid, nr_pages, pages, nodes, status, flags);
}
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
compat_uptr_t __user *, pages32,
const int __user *, nodes,
int __user *, status,
int, flags)
{
const void __user * __user *pages;
int i;
pages = compat_alloc_user_space(nr_pages * sizeof(void *));
for (i = 0; i < nr_pages; i++) {
compat_uptr_t p;
if (get_user(p, pages32 + i) ||
put_user(compat_ptr(p), pages + i))
return -EFAULT;
}
return kernel_move_pages(pid, nr_pages, pages, nodes, status, flags);
}
#endif /* CONFIG_COMPAT */
#ifdef CONFIG_NUMA_BALANCING #ifdef CONFIG_NUMA_BALANCING
/* /*
* Returns true if this is a safe migration target node for misplaced NUMA * Returns true if this is a safe migration target node for misplaced NUMA

Some files were not shown because too many files have changed in this diff Show More