On Tue, May 27, 2014 at 7:41 AM, Miklos Szeredi <[email protected]> wrote:
>
> This patch fixes two bugs:

Mind if I change it to avoid the "goto"? I don't think goto is evil,
but in this case it doesn't seem to buy anything, except to perhaps
make the patch a bit smaller at the expense of making the result a bit
harder to read.

Replacing the

   if (ret <= 0)
      goto out;

with

   if (ret > 0) {
       ...
   }

also allows moving the various variable declarations closer to their use.

So something like the attached..

             Linus
 fs/splice.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/fs/splice.c b/fs/splice.c
index 9bc07d2b53cf..6b1115005150 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1532,12 +1532,9 @@ static long vmsplice_to_user(struct file *file, const 
struct iovec __user *uiov,
                             unsigned long nr_segs, unsigned int flags)
 {
        struct pipe_inode_info *pipe;
-       struct splice_desc sd;
-       long ret;
        struct iovec iovstack[UIO_FASTIOV];
        struct iovec *iov = iovstack;
-       struct iov_iter iter;
-       ssize_t count = 0;
+       long ret;
 
        pipe = get_pipe_info(file);
        if (!pipe)
@@ -1545,20 +1542,23 @@ static long vmsplice_to_user(struct file *file, const 
struct iovec __user *uiov,
 
        ret = rw_copy_check_uvector(READ, uiov, nr_segs,
                                    ARRAY_SIZE(iovstack), iovstack, &iov);
-       if (ret <= 0)
-               return ret;
+       if (ret > 0) {
+               struct splice_desc sd;
+               struct iov_iter iter;
+               ssize_t count = ret;
 
-       iov_iter_init(&iter, iov, nr_segs, count, 0);
+               iov_iter_init(&iter, iov, nr_segs, count, 0);
 
-       sd.len = 0;
-       sd.total_len = count;
-       sd.flags = flags;
-       sd.u.data = &iter;
-       sd.pos = 0;
+               sd.len = 0;
+               sd.total_len = count;
+               sd.flags = flags;
+               sd.u.data = &iter;
+               sd.pos = 0;
 
-       pipe_lock(pipe);
-       ret = __splice_from_pipe(pipe, &sd, pipe_to_user);
-       pipe_unlock(pipe);
+               pipe_lock(pipe);
+               ret = __splice_from_pipe(pipe, &sd, pipe_to_user);
+               pipe_unlock(pipe);
+       }
 
        if (iov != iovstack)
                kfree(iov);

Reply via email to