Commit 0d964934 authored by Al Viro's avatar Al Viro

splice: stop abusing iov_iter_advance() to flush a pipe

Use pipe_discard_from() explicitly in generic_file_read_iter(); don't bother
with rather non-obvious use of iov_iter_advance() in there.
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarChristian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 3e20a751
...@@ -301,11 +301,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, ...@@ -301,11 +301,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
{ {
struct iov_iter to; struct iov_iter to;
struct kiocb kiocb; struct kiocb kiocb;
unsigned int i_head;
int ret; int ret;
iov_iter_pipe(&to, READ, pipe, len); iov_iter_pipe(&to, READ, pipe, len);
i_head = to.head;
init_sync_kiocb(&kiocb, in); init_sync_kiocb(&kiocb, in);
kiocb.ki_pos = *ppos; kiocb.ki_pos = *ppos;
ret = call_read_iter(in, &kiocb, &to); ret = call_read_iter(in, &kiocb, &to);
...@@ -313,9 +311,8 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, ...@@ -313,9 +311,8 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
*ppos = kiocb.ki_pos; *ppos = kiocb.ki_pos;
file_accessed(in); file_accessed(in);
} else if (ret < 0) { } else if (ret < 0) {
to.head = i_head; /* free what was emitted */
to.iov_offset = 0; pipe_discard_from(pipe, to.start_head);
iov_iter_advance(&to, 0); /* to free what was emitted */
/* /*
* callers of ->splice_read() expect -EAGAIN on * callers of ->splice_read() expect -EAGAIN on
* "can't put anything in there", rather than -EFAULT. * "can't put anything in there", rather than -EFAULT.
......
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