splice: lift checks from do_splice_from() into callers
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 19 Jun 2013 11:41:54 +0000 (15:41 +0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 29 Jun 2013 08:57:35 +0000 (12:57 +0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/splice.c

index 78b3d12..cc53bd0 100644 (file)
@@ -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);