提交 378a10f3 编写于 作者: H Heiko Carstens

fs/compat: optional preadv64/pwrite64 compat system calls

The preadv64/pwrite64 have been implemented for the x32 ABI, in order
to allow passing 64 bit arguments from user space without splitting
them into two 32 bit parameters, like it would be necessary for usual
compat tasks.
Howevert these two system calls are only being used for the x32 ABI,
so add __ARCH_WANT_COMPAT defines for these two compat syscalls and
make these two only visible for x86.
Signed-off-by: NHeiko Carstens <heiko.carstens@de.ibm.com>
上级 291fdb0b
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
# include <asm/unistd_64_x32.h> # include <asm/unistd_64_x32.h>
# define __ARCH_WANT_COMPAT_SYS_TIME # define __ARCH_WANT_COMPAT_SYS_TIME
# define __ARCH_WANT_COMPAT_SYS_GETDENTS64 # define __ARCH_WANT_COMPAT_SYS_GETDENTS64
# define __ARCH_WANT_COMPAT_SYS_PREADV64
# define __ARCH_WANT_COMPAT_SYS_PWRITEV64
# endif # endif
......
...@@ -982,9 +982,9 @@ COMPAT_SYSCALL_DEFINE3(readv, compat_ulong_t, fd, ...@@ -982,9 +982,9 @@ COMPAT_SYSCALL_DEFINE3(readv, compat_ulong_t, fd,
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd, static long __compat_sys_preadv64(unsigned long fd,
const struct compat_iovec __user *,vec, const struct compat_iovec __user *vec,
unsigned long, vlen, loff_t, pos) unsigned long vlen, loff_t pos)
{ {
struct fd f; struct fd f;
ssize_t ret; ssize_t ret;
...@@ -1001,12 +1001,22 @@ COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd, ...@@ -1001,12 +1001,22 @@ COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
return ret; return ret;
} }
#ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
const struct compat_iovec __user *,vec,
unsigned long, vlen, loff_t, pos)
{
return __compat_sys_preadv64(fd, vec, vlen, pos);
}
#endif
COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd, COMPAT_SYSCALL_DEFINE5(preadv, compat_ulong_t, fd,
const struct compat_iovec __user *,vec, const struct compat_iovec __user *,vec,
compat_ulong_t, vlen, u32, pos_low, u32, pos_high) compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
{ {
loff_t pos = ((loff_t)pos_high << 32) | pos_low; loff_t pos = ((loff_t)pos_high << 32) | pos_low;
return compat_sys_preadv64(fd, vec, vlen, pos);
return __compat_sys_preadv64(fd, vec, vlen, pos);
} }
static size_t compat_writev(struct file *file, static size_t compat_writev(struct file *file,
...@@ -1049,9 +1059,9 @@ COMPAT_SYSCALL_DEFINE3(writev, compat_ulong_t, fd, ...@@ -1049,9 +1059,9 @@ COMPAT_SYSCALL_DEFINE3(writev, compat_ulong_t, fd,
return ret; return ret;
} }
COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd, static long __compat_sys_pwritev64(unsigned long fd,
const struct compat_iovec __user *,vec, const struct compat_iovec __user *vec,
unsigned long, vlen, loff_t, pos) unsigned long vlen, loff_t pos)
{ {
struct fd f; struct fd f;
ssize_t ret; ssize_t ret;
...@@ -1068,12 +1078,22 @@ COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd, ...@@ -1068,12 +1078,22 @@ COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
return ret; return ret;
} }
#ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
const struct compat_iovec __user *,vec,
unsigned long, vlen, loff_t, pos)
{
return __compat_sys_pwritev64(fd, vec, vlen, pos);
}
#endif
COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd, COMPAT_SYSCALL_DEFINE5(pwritev, compat_ulong_t, fd,
const struct compat_iovec __user *,vec, const struct compat_iovec __user *,vec,
compat_ulong_t, vlen, u32, pos_low, u32, pos_high) compat_ulong_t, vlen, u32, pos_low, u32, pos_high)
{ {
loff_t pos = ((loff_t)pos_high << 32) | pos_low; loff_t pos = ((loff_t)pos_high << 32) | pos_low;
return compat_sys_pwritev64(fd, vec, vlen, pos);
return __compat_sys_pwritev64(fd, vec, vlen, pos);
} }
#endif #endif
......
...@@ -340,6 +340,19 @@ asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd, ...@@ -340,6 +340,19 @@ asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd, asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
const struct compat_iovec __user *vec, const struct compat_iovec __user *vec,
compat_ulong_t vlen, u32 pos_low, u32 pos_high); 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
asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int); 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, asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册