diff --git a/fs/iomap.c b/fs/iomap.c index 89e97817518b49273716f1b5e3ee580a6446f7f1..1a51bbc1d6c50b7d0d204ced68c0f367d7c100e1 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -1903,8 +1903,15 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, } pos += ret; - if (iov_iter_rw(iter) == READ && pos >= dio->i_size) + if (iov_iter_rw(iter) == READ && pos >= dio->i_size) { + /* + * We only report that we've read data up to i_size. + * Revert iter to a state corresponding to that as + * some callers (such as splice code) rely on it. + */ + iov_iter_revert(iter, pos - dio->i_size); break; + } } while ((count = iov_iter_count(iter)) > 0); blk_finish_plug(&plug);