Skip to content

Commit

Permalink
mm: Pass info, not iter, into filemap_get_pages()
Browse files Browse the repository at this point in the history
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: David Howells <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Jens Axboe <[email protected]>
cc: Christoph Hellwig <[email protected]>
cc: Matthew Wilcox <[email protected]>
cc: Al Viro <[email protected]>
cc: David Hildenbrand <[email protected]>
cc: John Hubbard <[email protected]>
cc: [email protected]
cc: [email protected]
cc: [email protected]
Signed-off-by: Steve French <[email protected]>
  • Loading branch information
dhowells authored and Steve French committed Feb 20, 2023
1 parent eb3e28c commit dd5b9d0
Showing 1 changed file with 14 additions and 13 deletions.
27 changes: 14 additions & 13 deletions mm/filemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2440,21 +2440,19 @@ static int filemap_read_folio(struct file *file, filler_t filler,
}

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))
return true;
/* pipes can't handle partially uptodate pages */
if (iov_iter_is_pipe(iter))
if (need_uptodate)
return false;
if (!mapping->a_ops->is_partially_uptodate)
return false;
if (mapping->host->i_blkbits >= folio_shift(folio))
return false;

count = iter->count;
if (folio_pos(folio) > pos) {
count -= folio_pos(folio) - pos;
pos = 0;
Expand All @@ -2466,8 +2464,8 @@ static bool filemap_range_uptodate(struct address_space *mapping,
}

static int filemap_update_page(struct kiocb *iocb,
struct address_space *mapping, struct iov_iter *iter,
struct folio *folio)
struct address_space *mapping, size_t count,
struct folio *folio, bool need_uptodate)
{
int error;

Expand Down Expand Up @@ -2501,7 +2499,8 @@ static int filemap_update_page(struct kiocb *iocb,
goto unlock;

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;

error = -EAGAIN;
Expand Down Expand Up @@ -2577,8 +2576,8 @@ static int filemap_readahead(struct kiocb *iocb, struct file *file,
return 0;
}

static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
struct folio_batch *fbatch)
static int filemap_get_pages(struct kiocb *iocb, size_t count,
struct folio_batch *fbatch, bool need_uptodate)
{
struct file *filp = iocb->ki_filp;
struct address_space *mapping = filp->f_mapping;
Expand All @@ -2589,7 +2588,7 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
int err = 0;

/* "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:
if (fatal_signal_pending(current))
return -EINTR;
Expand Down Expand Up @@ -2622,7 +2621,8 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
if ((iocb->ki_flags & IOCB_WAITQ) &&
folio_batch_count(fbatch) > 1)
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)
goto err;
}
Expand Down Expand Up @@ -2692,7 +2692,8 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter,
if (unlikely(iocb->ki_pos >= i_size_read(inode)))
break;

error = filemap_get_pages(iocb, iter, &fbatch);
error = filemap_get_pages(iocb, iter->count, &fbatch,
iov_iter_is_pipe(iter));
if (error < 0)
break;

Expand Down

0 comments on commit dd5b9d0

Please sign in to comment.