convert vmsplice to COMPAT_SYSCALL_DEFINE
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
8d2d5c4a25
Коммит
76b021d053
|
@ -1252,13 +1252,6 @@ ENTRY(sys_tee_wrapper)
|
||||||
llgfr %r5,%r5 # unsigned int
|
llgfr %r5,%r5 # unsigned int
|
||||||
jg sys_tee
|
jg sys_tee
|
||||||
|
|
||||||
ENTRY(compat_sys_vmsplice_wrapper)
|
|
||||||
lgfr %r2,%r2 # int
|
|
||||||
llgtr %r3,%r3 # compat_iovec *
|
|
||||||
llgfr %r4,%r4 # unsigned int
|
|
||||||
llgfr %r5,%r5 # unsigned int
|
|
||||||
jg compat_sys_vmsplice
|
|
||||||
|
|
||||||
ENTRY(sys_getcpu_wrapper)
|
ENTRY(sys_getcpu_wrapper)
|
||||||
llgtr %r2,%r2 # unsigned *
|
llgtr %r2,%r2 # unsigned *
|
||||||
llgtr %r3,%r3 # unsigned *
|
llgtr %r3,%r3 # unsigned *
|
||||||
|
|
|
@ -317,7 +317,7 @@ SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list)
|
||||||
SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)
|
SYSCALL(sys_splice,sys_splice,sys_splice_wrapper)
|
||||||
SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)
|
SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper)
|
||||||
SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
|
SYSCALL(sys_tee,sys_tee,sys_tee_wrapper)
|
||||||
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice_wrapper)
|
SYSCALL(sys_vmsplice,sys_vmsplice,compat_sys_vmsplice)
|
||||||
NI_SYSCALL /* 310 sys_move_pages */
|
NI_SYSCALL /* 310 sys_move_pages */
|
||||||
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
|
SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
|
||||||
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)
|
SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait)
|
||||||
|
|
|
@ -49,7 +49,6 @@ SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)
|
||||||
SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
|
SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)
|
||||||
SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
|
SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0)
|
||||||
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
|
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
|
||||||
SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
|
|
||||||
|
|
||||||
.globl sys32_mmap2
|
.globl sys32_mmap2
|
||||||
sys32_mmap2:
|
sys32_mmap2:
|
||||||
|
|
|
@ -23,7 +23,7 @@ sys_call_table32:
|
||||||
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
|
/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod
|
||||||
/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek
|
/*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek
|
||||||
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
|
||||||
/*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
|
/*25*/ .word compat_sys_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause
|
||||||
/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
|
/*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
|
||||||
.word sys_chown, sys_sync, sys_kill, compat_sys_newstat, compat_sys_sendfile
|
.word sys_chown, sys_sync, sys_kill, compat_sys_newstat, compat_sys_sendfile
|
||||||
/*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
|
/*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
|
||||||
|
|
20
fs/compat.c
20
fs/compat.c
|
@ -1253,26 +1253,6 @@ compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,
|
||||||
return compat_sys_pwritev64(fd, vec, vlen, pos);
|
return compat_sys_pwritev64(fd, vec, vlen, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage long
|
|
||||||
compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32,
|
|
||||||
unsigned int nr_segs, unsigned int flags)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
struct iovec __user *iov;
|
|
||||||
if (nr_segs > UIO_MAXIOV)
|
|
||||||
return -EINVAL;
|
|
||||||
iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
|
|
||||||
for (i = 0; i < nr_segs; i++) {
|
|
||||||
struct compat_iovec v;
|
|
||||||
if (get_user(v.iov_base, &iov32[i].iov_base) ||
|
|
||||||
get_user(v.iov_len, &iov32[i].iov_len) ||
|
|
||||||
put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
|
|
||||||
put_user(v.iov_len, &iov[i].iov_len))
|
|
||||||
return -EFAULT;
|
|
||||||
}
|
|
||||||
return sys_vmsplice(fd, iov, nr_segs, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exactly like fs/open.c:sys_open(), except that it doesn't set the
|
* Exactly like fs/open.c:sys_open(), except that it doesn't set the
|
||||||
* O_LARGEFILE flag.
|
* O_LARGEFILE flag.
|
||||||
|
|
22
fs/splice.c
22
fs/splice.c
|
@ -31,6 +31,7 @@
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <linux/socket.h>
|
#include <linux/socket.h>
|
||||||
|
#include <linux/compat.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to steal a page from a pipe buffer. This should perhaps go into
|
* Attempt to steal a page from a pipe buffer. This should perhaps go into
|
||||||
|
@ -1688,6 +1689,27 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
|
||||||
|
unsigned int, nr_segs, unsigned int, flags)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
struct iovec __user *iov;
|
||||||
|
if (nr_segs > UIO_MAXIOV)
|
||||||
|
return -EINVAL;
|
||||||
|
iov = compat_alloc_user_space(nr_segs * sizeof(struct iovec));
|
||||||
|
for (i = 0; i < nr_segs; i++) {
|
||||||
|
struct compat_iovec v;
|
||||||
|
if (get_user(v.iov_base, &iov32[i].iov_base) ||
|
||||||
|
get_user(v.iov_len, &iov32[i].iov_len) ||
|
||||||
|
put_user(compat_ptr(v.iov_base), &iov[i].iov_base) ||
|
||||||
|
put_user(v.iov_len, &iov[i].iov_len))
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
|
return sys_vmsplice(fd, iov, nr_segs, flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
|
SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
|
||||||
int, fd_out, loff_t __user *, off_out,
|
int, fd_out, loff_t __user *, off_out,
|
||||||
size_t, len, unsigned int, flags)
|
size_t, len, unsigned int, flags)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче