do_splice_to(): move the logics for limiting the read length in
[sfrench/cifs-2.6.git] / fs / splice.c
index 866d5c2367b233091e98e372b2ab25c04c93fef3..c1ca2cc63b43fc525d7807163a5b2cb7ad2d74ea 100644 (file)
@@ -771,11 +771,16 @@ static long do_splice_to(struct file *in, loff_t *ppos,
                         struct pipe_inode_info *pipe, size_t len,
                         unsigned int flags)
 {
+       unsigned int p_space;
        int ret;
 
        if (unlikely(!(in->f_mode & FMODE_READ)))
                return -EBADF;
 
+       /* Don't try to read more the pipe has space for. */
+       p_space = pipe->max_usage - pipe_occupancy(pipe->head, pipe->tail);
+       len = min_t(size_t, len, p_space << PAGE_SHIFT);
+
        ret = rw_verify_area(READ, in, ppos, len);
        if (unlikely(ret < 0))
                return ret;
@@ -856,15 +861,10 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
        WARN_ON_ONCE(!pipe_empty(pipe->head, pipe->tail));
 
        while (len) {
-               unsigned int p_space;
                size_t read_len;
                loff_t pos = sd->pos, prev_pos = pos;
 
-               /* Don't try to read more the pipe has space for. */
-               p_space = pipe->max_usage -
-                       pipe_occupancy(pipe->head, pipe->tail);
-               read_len = min_t(size_t, len, p_space << PAGE_SHIFT);
-               ret = do_splice_to(in, &pos, pipe, read_len, flags);
+               ret = do_splice_to(in, &pos, pipe, len, flags);
                if (unlikely(ret <= 0))
                        goto out_release;
 
@@ -1083,15 +1083,8 @@ long do_splice(struct file *in, loff_t *off_in, struct file *out,
 
                pipe_lock(opipe);
                ret = wait_for_space(opipe, flags);
-               if (!ret) {
-                       unsigned int p_space;
-
-                       /* Don't try to read more the pipe has space for. */
-                       p_space = opipe->max_usage - pipe_occupancy(opipe->head, opipe->tail);
-                       len = min_t(size_t, len, p_space << PAGE_SHIFT);
-
+               if (!ret)
                        ret = do_splice_to(in, &offset, opipe, len, flags);
-               }
                pipe_unlock(opipe);
                if (ret > 0)
                        wakeup_pipe_readers(opipe);