Commit 680bb946 authored by Abhi Das's avatar Abhi Das Committed by Al Viro

fix iov_iter_advance() for ITER_PIPE

iov_iter_advance() needs to decrement iter->count by the number of
bytes we'd moved beyond.  Normal flavours do that, but ITER_PIPE
doesn't and ITER_PIPE generic_file_read_iter() for O_DIRECT files
ends up with a bogus fallback to page cache read, resulting in incorrect
values for file offset and bytes read.
Signed-off-by: default avatarAbhi Das <adas@redhat.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 4a590153
...@@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size) ...@@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size)
struct pipe_inode_info *pipe = i->pipe; struct pipe_inode_info *pipe = i->pipe;
struct pipe_buffer *buf; struct pipe_buffer *buf;
int idx = i->idx; int idx = i->idx;
size_t off = i->iov_offset; size_t off = i->iov_offset, orig_sz;
if (unlikely(i->count < size)) if (unlikely(i->count < size))
size = i->count; size = i->count;
orig_sz = size;
if (size) { if (size) {
if (off) /* make it relative to the beginning of buffer */ if (off) /* make it relative to the beginning of buffer */
...@@ -713,6 +714,7 @@ static void pipe_advance(struct iov_iter *i, size_t size) ...@@ -713,6 +714,7 @@ static void pipe_advance(struct iov_iter *i, size_t size)
pipe->nrbufs--; pipe->nrbufs--;
} }
} }
i->count -= orig_sz;
} }
void iov_iter_advance(struct iov_iter *i, size_t size) void iov_iter_advance(struct iov_iter *i, size_t size)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment