From 99f519f595d5f986eb53038d94f14e81b8939d32 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Mon, 1 May 2006 12:15:48 -0700 Subject: [PATCH] --- yaml --- r: 26391 b: refs/heads/master c: d2610202290b4924b71747314a0f88f28807702e h: refs/heads/master i: 26389: 4c97f2d89392d8abc46e57141b49993bb1ea91a9 26387: 77d39bae450ea025af2d86ba154fc4d741686b47 26383: 9decdb53ede4edf49a85d4565bbea5e3ffd0ee4f v: v3 --- [refs] | 2 +- trunk/arch/x86_64/ia32/ia32entry.S | 1 + trunk/fs/compat.c | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 3274a3d1aaf9..dca9d1c12838 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5e7dd2ab6b9bdfa60e19b8739e6b2a204fd4f477 +refs/heads/master: d2610202290b4924b71747314a0f88f28807702e diff --git a/trunk/arch/x86_64/ia32/ia32entry.S b/trunk/arch/x86_64/ia32/ia32entry.S index 57fc37e0fb9c..5a92fed2d1d5 100644 --- a/trunk/arch/x86_64/ia32/ia32entry.S +++ b/trunk/arch/x86_64/ia32/ia32entry.S @@ -695,4 +695,5 @@ ia32_sys_call_table: .quad sys_splice .quad sys_sync_file_range .quad sys_tee + .quad compat_sys_vmsplice ia32_syscall_end: diff --git a/trunk/fs/compat.c b/trunk/fs/compat.c index 2e32bd340474..3f3e8f4d43d6 100644 --- a/trunk/fs/compat.c +++ b/trunk/fs/compat.c @@ -1317,6 +1317,26 @@ compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec, unsig return ret; } +asmlinkage long +compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, + unsigned int nr_segs, unsigned int flags) +{ + unsigned i; + struct iovec *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 * O_LARGEFILE flag.