make nr_pages calculation in default_file_splice_read() a bit less ugly
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 10 Dec 2016 18:20:53 +0000 (13:20 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 27 Dec 2016 04:53:52 +0000 (23:53 -0500)
It's an artifact of lousy calling conventions of iov_iter_get_pages_alloc().
Hopefully, we'll get something saner come next cycle; for now that'll
do.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/splice.c

index 1af65632c371fa27407fc556812d105a336681d7..712bc902e4149e5b28912044ff2a38a0af727c24 100644 (file)
@@ -385,7 +385,7 @@ static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
        struct iov_iter to;
        struct page **pages;
        unsigned int nr_pages;
-       size_t offset, dummy, copied = 0;
+       size_t offset, base, copied = 0;
        ssize_t res;
        int i;
 
@@ -400,12 +400,11 @@ static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
 
        iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len + offset);
 
-       res = iov_iter_get_pages_alloc(&to, &pages, len + offset, &dummy);
+       res = iov_iter_get_pages_alloc(&to, &pages, len + offset, &base);
        if (res <= 0)
                return -ENOMEM;
 
-       BUG_ON(dummy);
-       nr_pages = DIV_ROUND_UP(res, PAGE_SIZE);
+       nr_pages = DIV_ROUND_UP(res + base, PAGE_SIZE);
 
        vec = __vec;
        if (nr_pages > PIPE_DEF_BUFFERS) {