splice: lift checks from do_splice_from() into callers
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
68d70d03f8
commit
18c67cb9f0
1 changed files with 20 additions and 11 deletions
31
fs/splice.c
31
fs/splice.c
|
@ -1098,17 +1098,6 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
|
|||
{
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
|
||||
loff_t *, size_t, unsigned int);
|
||||
int ret;
|
||||
|
||||
if (unlikely(!(out->f_mode & FMODE_WRITE)))
|
||||
return -EBADF;
|
||||
|
||||
if (unlikely(out->f_flags & O_APPEND))
|
||||
return -EINVAL;
|
||||
|
||||
ret = rw_verify_area(WRITE, out, ppos, len);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
if (out->f_op && out->f_op->splice_write)
|
||||
splice_write = out->f_op->splice_write;
|
||||
|
@ -1303,6 +1292,16 @@ long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
|
|||
};
|
||||
long ret;
|
||||
|
||||
if (unlikely(!(out->f_mode & FMODE_WRITE)))
|
||||
return -EBADF;
|
||||
|
||||
if (unlikely(out->f_flags & O_APPEND))
|
||||
return -EINVAL;
|
||||
|
||||
ret = rw_verify_area(WRITE, out, opos, len);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
ret = splice_direct_to_actor(in, &sd, direct_splice_actor);
|
||||
if (ret > 0)
|
||||
*ppos = sd.pos;
|
||||
|
@ -1358,6 +1357,16 @@ static long do_splice(struct file *in, loff_t __user *off_in,
|
|||
offset = out->f_pos;
|
||||
}
|
||||
|
||||
if (unlikely(!(out->f_mode & FMODE_WRITE)))
|
||||
return -EBADF;
|
||||
|
||||
if (unlikely(out->f_flags & O_APPEND))
|
||||
return -EINVAL;
|
||||
|
||||
ret = rw_verify_area(WRITE, out, &offset, len);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
file_start_write(out);
|
||||
ret = do_splice_from(ipipe, out, &offset, len, flags);
|
||||
file_end_write(out);
|
||||
|
|
Loading…
Reference in a new issue