mirror of https://gitee.com/openkylin/linux.git
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: Abhi Das <adas@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
4a59015372
commit
680bb946a1
|
@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size)
|
|||
struct pipe_inode_info *pipe = i->pipe;
|
||||
struct pipe_buffer *buf;
|
||||
int idx = i->idx;
|
||||
size_t off = i->iov_offset;
|
||||
size_t off = i->iov_offset, orig_sz;
|
||||
|
||||
if (unlikely(i->count < size))
|
||||
size = i->count;
|
||||
orig_sz = size;
|
||||
|
||||
if (size) {
|
||||
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)
|
|||
pipe->nrbufs--;
|
||||
}
|
||||
}
|
||||
i->count -= orig_sz;
|
||||
}
|
||||
|
||||
void iov_iter_advance(struct iov_iter *i, size_t size)
|
||||
|
|
Loading…
Reference in New Issue