Message ID | 20230520000049.2226926-2-dhowells@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | splice: Kill ITER_PIPE | expand |
Just noticed this now, but filemap of a blockdev sounds weird. Maybe something like: splice: use the correct inode in filemap_splice_read might be better.
On Sat, May 20, 2023 at 01:00:20AM +0100, David Howells wrote: > Fix filemap_splice_read() to use file->f_mapping->host, not file->f_inode, > as the source of the file size because in the case of a block device, > file->f_inode points to the block-special file (which is typically 0 > length) and not the backing store. > > Fixes: 07073eb01c5f ("splice: Add a func to do a splice from a buffered file without ITER_PIPE") > Signed-off-by: David Howells <dhowells@redhat.com> > Reviewed-by: Christoph Hellwig <hch@lst.de> > cc: Steve French <stfrench@microsoft.com> > cc: Jens Axboe <axboe@kernel.dk> > cc: Al Viro <viro@zeniv.linux.org.uk> > cc: David Hildenbrand <david@redhat.com> > cc: John Hubbard <jhubbard@nvidia.com> > cc: linux-mm@kvack.org > cc: linux-block@vger.kernel.org > cc: linux-fsdevel@vger.kernel.org > --- Reviewed-by: Christian Brauner <brauner@kernel.org>
diff --git a/mm/filemap.c b/mm/filemap.c index b4c9bd368b7e..a2006936a6ae 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2900,7 +2900,7 @@ ssize_t filemap_splice_read(struct file *in, loff_t *ppos, do { cond_resched(); - if (*ppos >= i_size_read(file_inode(in))) + if (*ppos >= i_size_read(in->f_mapping->host)) break; iocb.ki_pos = *ppos; @@ -2916,7 +2916,7 @@ ssize_t filemap_splice_read(struct file *in, loff_t *ppos, * part of the page is not copied back to userspace (unless * another truncate extends the file - this is desired though). */ - isize = i_size_read(file_inode(in)); + isize = i_size_read(in->f_mapping->host); if (unlikely(*ppos >= isize)) break; end_offset = min_t(loff_t, isize, *ppos + len);