Commit dd5b9d00 authored by David Howells's avatar David Howells Committed by Steve French

mm: Pass info, not iter, into filemap_get_pages()

filemap_get_pages() and a number of functions that it calls take an
iterator to provide two things: the number of bytes to be got from the file
specified and whether partially uptodate pages are allowed.  Change these
functions so that this information is passed in directly.  This allows it
to be called without having an iterator to hand.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
cc: Christoph Hellwig <hch@lst.de>
cc: Matthew Wilcox <willy@infradead.org>
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
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent eb3e28c1
...@@ -2440,21 +2440,19 @@ static int filemap_read_folio(struct file *file, filler_t filler, ...@@ -2440,21 +2440,19 @@ static int filemap_read_folio(struct file *file, filler_t filler,
} }
static bool filemap_range_uptodate(struct address_space *mapping, static bool filemap_range_uptodate(struct address_space *mapping,
loff_t pos, struct iov_iter *iter, struct folio *folio) loff_t pos, size_t count, struct folio *folio,
bool need_uptodate)
{ {
int count;
if (folio_test_uptodate(folio)) if (folio_test_uptodate(folio))
return true; return true;
/* pipes can't handle partially uptodate pages */ /* pipes can't handle partially uptodate pages */
if (iov_iter_is_pipe(iter)) if (need_uptodate)
return false; return false;
if (!mapping->a_ops->is_partially_uptodate) if (!mapping->a_ops->is_partially_uptodate)
return false; return false;
if (mapping->host->i_blkbits >= folio_shift(folio)) if (mapping->host->i_blkbits >= folio_shift(folio))
return false; return false;
count = iter->count;
if (folio_pos(folio) > pos) { if (folio_pos(folio) > pos) {
count -= folio_pos(folio) - pos; count -= folio_pos(folio) - pos;
pos = 0; pos = 0;
...@@ -2466,8 +2464,8 @@ static bool filemap_range_uptodate(struct address_space *mapping, ...@@ -2466,8 +2464,8 @@ static bool filemap_range_uptodate(struct address_space *mapping,
} }
static int filemap_update_page(struct kiocb *iocb, static int filemap_update_page(struct kiocb *iocb,
struct address_space *mapping, struct iov_iter *iter, struct address_space *mapping, size_t count,
struct folio *folio) struct folio *folio, bool need_uptodate)
{ {
int error; int error;
...@@ -2501,7 +2499,8 @@ static int filemap_update_page(struct kiocb *iocb, ...@@ -2501,7 +2499,8 @@ static int filemap_update_page(struct kiocb *iocb,
goto unlock; goto unlock;
error = 0; error = 0;
if (filemap_range_uptodate(mapping, iocb->ki_pos, iter, folio)) if (filemap_range_uptodate(mapping, iocb->ki_pos, count, folio,
need_uptodate))
goto unlock; goto unlock;
error = -EAGAIN; error = -EAGAIN;
...@@ -2577,8 +2576,8 @@ static int filemap_readahead(struct kiocb *iocb, struct file *file, ...@@ -2577,8 +2576,8 @@ static int filemap_readahead(struct kiocb *iocb, struct file *file,
return 0; return 0;
} }
static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter, static int filemap_get_pages(struct kiocb *iocb, size_t count,
struct folio_batch *fbatch) struct folio_batch *fbatch, bool need_uptodate)
{ {
struct file *filp = iocb->ki_filp; struct file *filp = iocb->ki_filp;
struct address_space *mapping = filp->f_mapping; struct address_space *mapping = filp->f_mapping;
...@@ -2589,7 +2588,7 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter, ...@@ -2589,7 +2588,7 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
int err = 0; int err = 0;
/* "last_index" is the index of the page beyond the end of the read */ /* "last_index" is the index of the page beyond the end of the read */
last_index = DIV_ROUND_UP(iocb->ki_pos + iter->count, PAGE_SIZE); last_index = DIV_ROUND_UP(iocb->ki_pos + count, PAGE_SIZE);
retry: retry:
if (fatal_signal_pending(current)) if (fatal_signal_pending(current))
return -EINTR; return -EINTR;
...@@ -2622,7 +2621,8 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter, ...@@ -2622,7 +2621,8 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
if ((iocb->ki_flags & IOCB_WAITQ) && if ((iocb->ki_flags & IOCB_WAITQ) &&
folio_batch_count(fbatch) > 1) folio_batch_count(fbatch) > 1)
iocb->ki_flags |= IOCB_NOWAIT; iocb->ki_flags |= IOCB_NOWAIT;
err = filemap_update_page(iocb, mapping, iter, folio); err = filemap_update_page(iocb, mapping, count, folio,
need_uptodate);
if (err) if (err)
goto err; goto err;
} }
...@@ -2692,7 +2692,8 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter, ...@@ -2692,7 +2692,8 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter,
if (unlikely(iocb->ki_pos >= i_size_read(inode))) if (unlikely(iocb->ki_pos >= i_size_read(inode)))
break; break;
error = filemap_get_pages(iocb, iter, &fbatch); error = filemap_get_pages(iocb, iter->count, &fbatch,
iov_iter_is_pipe(iter));
if (error < 0) if (error < 0)
break; break;
......
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