Skip to content

Commit

Permalink
fix iov_iter_advance() for ITER_PIPE
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Abhi Das authored and Al Viro committed Nov 17, 2016
1 parent 4a59015 commit 680bb94
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/iov_iter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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)
Expand Down

0 comments on commit 680bb94

Please sign in to comment.