diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-11-26 20:05:42 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-11-26 20:05:42 -0500 |
commit | 8e54cadab447dae779f80f79c87cbeaea9594f60 (patch) | |
tree | f4b4b68d40369757544c9000349bbb0ec5de38e7 /fs/splice.c | |
parent | 3ad0e83cf86bcaeb6ca3c37060a3ce866b25fb42 (diff) | |
download | linux-8e54cadab447dae779f80f79c87cbeaea9594f60.tar.gz linux-8e54cadab447dae779f80f79c87cbeaea9594f60.tar.bz2 linux-8e54cadab447dae779f80f79c87cbeaea9594f60.zip |
fix default_file_splice_read()
Botched calculation of number of pages. As the result,
we were dropping pieces when doing splice to pipe from
e.g. 9p.
Reported-by: Alexei Starovoitov <ast@kernel.org>
Tested-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/splice.c')
-rw-r--r-- | fs/splice.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/splice.c b/fs/splice.c index dcaf185a5731..5a7750bd2eea 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -408,7 +408,8 @@ static ssize_t default_file_splice_read(struct file *in, loff_t *ppos, if (res <= 0) return -ENOMEM; - nr_pages = res / PAGE_SIZE; + BUG_ON(dummy); + nr_pages = DIV_ROUND_UP(res, PAGE_SIZE); vec = __vec; if (nr_pages > PIPE_DEF_BUFFERS) { |