Message ID | 1770755.1681894451@warthog.procyon.org.uk (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | splice: Fix filemap of a blockdev | expand |
Hello David, This resolves the Fio-test issue that i reported in Link: https://lore.kernel.org/r/0c6b661c-f7ff-cf12-b7f0-00b6b2f1317b@amd.com/ On 4/19/2023 2:24 PM, David Howells wrote: > Fix the new filemap_splice_read() function to get i_size from > in->f_mapping->host, not in->f_inode so that it works with block devices > too (in->f_inode points to the device file, which is typically zero size). > > Fixes: 07073eb01c5f ("splice: Add a func to do a splice from a buffered file without ITER_PIPE") > Link: https://lore.kernel.org/r/0c6b661c-f7ff-cf12-b7f0-00b6b2f1317b@amd.com/ > Reported-by: Ayush Jain <ayush.jain3@amd.com> Tested-by: Ayush Jain <ayush.jain3@amd.com> > cc: Jens Axboe <axboe@kernel.dk> > cc: Christoph Hellwig <hch@lst.de> > cc: Al Viro <viro@zeniv.linux.org.uk> > cc: David Hildenbrand <david@redhat.com> > cc: John Hubbard <jhubbard@nvidia.com> > cc: Steve French <stfrench@microsoft.com> > cc: linux-mm@kvack.org > cc: linux-block@vger.kernel.org > cc: linux-fsdevel@vger.kernel.org > --- > mm/filemap.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/mm/filemap.c b/mm/filemap.c > index 470be06b6096..f86cc8acf33a 100644 > --- a/mm/filemap.c > +++ b/mm/filemap.c > @@ -2902,7 +2902,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; > @@ -2918,7 +2918,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); > Regards, Ayush Jain
On Wed, 19 Apr 2023 09:54:11 +0100, David Howells wrote: > Fix the new filemap_splice_read() function to get i_size from > in->f_mapping->host, not in->f_inode so that it works with block devices > too (in->f_inode points to the device file, which is typically zero size). > > Applied, thanks! [1/1] splice: Fix filemap of a blockdev commit: 5a9515a407d1aec1dd76c24fe99d9981730b74fb Best regards,
Jens Axboe <axboe@kernel.dk> wrote:
> [1/1] splice: Fix filemap of a blockdev
Actually, would you be able to fix the subject? I left a word out:
splice: Fix filemap splice of a blockdev
or maybe:
splice: Fix buffered splice of a blockdev
Sorry about that,
David
Note that this shouldn't affect direct_splice_read() as that doesn't look at the size of the file, but rather just keeps reading from it until the requested amount is read, the pipe is full or ->read_iter() indicates EOF by returning 0 (so it could work for copy-splicing from a pipe/socket/chardev too). David
On 4/19/23 6:57 AM, David Howells wrote: > Jens Axboe <axboe@kernel.dk> wrote: > >> [1/1] splice: Fix filemap of a blockdev > > Actually, would you be able to fix the subject? I left a word out: > > splice: Fix filemap splice of a blockdev > > or maybe: > > splice: Fix buffered splice of a blockdev Fixed it up.
diff --git a/mm/filemap.c b/mm/filemap.c index 470be06b6096..f86cc8acf33a 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2902,7 +2902,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; @@ -2918,7 +2918,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);