Merge branch 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull compat iovec cleanups from Al Viro: "Christoph's series around import_iovec() and compat variant thereof" * 'work.iov_iter' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: security/keys: remove compat_keyctl_instantiate_key_iov mm: remove compat_process_vm_{readv,writev} fs: remove compat_sys_vmsplice fs: remove the compat readv/writev syscalls fs: remove various compat readv/writev helpers iov_iter: transparently handle compat iovecs in import_iovec iov_iter: refactor rw_copy_check_uvector and import_iovec iov_iter: move rw_copy_check_uvector() into lib/iov_iter.c compat.h: fix a spelling error in <linux/compat.h>
This commit is contained in:
61
fs/splice.c
61
fs/splice.c
@@ -33,7 +33,6 @@
|
||||
#include <linux/security.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/compat.h>
|
||||
#include <linux/sched/signal.h>
|
||||
|
||||
#include "internal.h"
|
||||
@@ -1352,20 +1351,6 @@ static int vmsplice_type(struct fd f, int *type)
|
||||
* Currently we punt and implement it as a normal copy, see pipe_to_user().
|
||||
*
|
||||
*/
|
||||
static long do_vmsplice(struct file *f, struct iov_iter *iter, unsigned int flags)
|
||||
{
|
||||
if (unlikely(flags & ~SPLICE_F_ALL))
|
||||
return -EINVAL;
|
||||
|
||||
if (!iov_iter_count(iter))
|
||||
return 0;
|
||||
|
||||
if (iov_iter_rw(iter) == WRITE)
|
||||
return vmsplice_to_pipe(f, iter, flags);
|
||||
else
|
||||
return vmsplice_to_user(f, iter, flags);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, uiov,
|
||||
unsigned long, nr_segs, unsigned int, flags)
|
||||
{
|
||||
@@ -1376,6 +1361,9 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, uiov,
|
||||
struct fd f;
|
||||
int type;
|
||||
|
||||
if (unlikely(flags & ~SPLICE_F_ALL))
|
||||
return -EINVAL;
|
||||
|
||||
f = fdget(fd);
|
||||
error = vmsplice_type(f, &type);
|
||||
if (error)
|
||||
@@ -1383,41 +1371,22 @@ SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, uiov,
|
||||
|
||||
error = import_iovec(type, uiov, nr_segs,
|
||||
ARRAY_SIZE(iovstack), &iov, &iter);
|
||||
if (error >= 0) {
|
||||
error = do_vmsplice(f.file, &iter, flags);
|
||||
kfree(iov);
|
||||
}
|
||||
if (error < 0)
|
||||
goto out_fdput;
|
||||
|
||||
if (!iov_iter_count(&iter))
|
||||
error = 0;
|
||||
else if (iov_iter_rw(&iter) == WRITE)
|
||||
error = vmsplice_to_pipe(f.file, &iter, flags);
|
||||
else
|
||||
error = vmsplice_to_user(f.file, &iter, flags);
|
||||
|
||||
kfree(iov);
|
||||
out_fdput:
|
||||
fdput(f);
|
||||
return error;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYSCALL_DEFINE4(vmsplice, int, fd, const struct compat_iovec __user *, iov32,
|
||||
unsigned int, nr_segs, unsigned int, flags)
|
||||
{
|
||||
struct iovec iovstack[UIO_FASTIOV];
|
||||
struct iovec *iov = iovstack;
|
||||
struct iov_iter iter;
|
||||
ssize_t error;
|
||||
struct fd f;
|
||||
int type;
|
||||
|
||||
f = fdget(fd);
|
||||
error = vmsplice_type(f, &type);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = compat_import_iovec(type, iov32, nr_segs,
|
||||
ARRAY_SIZE(iovstack), &iov, &iter);
|
||||
if (error >= 0) {
|
||||
error = do_vmsplice(f.file, &iter, flags);
|
||||
kfree(iov);
|
||||
}
|
||||
fdput(f);
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
|
||||
int, fd_out, loff_t __user *, off_out,
|
||||
size_t, len, unsigned int, flags)
|
||||
|
Reference in New Issue
Block a user