|
@@ -1317,6 +1317,26 @@ out:
|
|
|
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.
|