filemap: Convert filemap_read() to use a folio

We know the pagevec always contains folios, but use page_folio() anyway
instead of casting.  Removes a few calls to legacy functions.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
This commit is contained in:
Matthew Wilcox (Oracle) 2021-10-31 22:22:19 -04:00
parent 78f426608f
commit d996fc7f61

View File

@ -2668,30 +2668,26 @@ ssize_t filemap_read(struct kiocb *iocb, struct iov_iter *iter,
mark_page_accessed(pvec.pages[0]); mark_page_accessed(pvec.pages[0]);
for (i = 0; i < pagevec_count(&pvec); i++) { for (i = 0; i < pagevec_count(&pvec); i++) {
struct page *page = pvec.pages[i]; struct folio *folio = page_folio(pvec.pages[i]);
size_t page_size = thp_size(page); size_t fsize = folio_size(folio);
size_t offset = iocb->ki_pos & (page_size - 1); size_t offset = iocb->ki_pos & (fsize - 1);
size_t bytes = min_t(loff_t, end_offset - iocb->ki_pos, size_t bytes = min_t(loff_t, end_offset - iocb->ki_pos,
page_size - offset); fsize - offset);
size_t copied; size_t copied;
if (end_offset < page_offset(page)) if (end_offset < folio_pos(folio))
break; break;
if (i > 0) if (i > 0)
mark_page_accessed(page); folio_mark_accessed(folio);
/* /*
* If users can be writing to this page using arbitrary * If users can be writing to this folio using arbitrary
* virtual addresses, take care about potential aliasing * virtual addresses, take care of potential aliasing
* before reading the page on the kernel side. * before reading the folio on the kernel side.
*/ */
if (writably_mapped) { if (writably_mapped)
int j; flush_dcache_folio(folio);
for (j = 0; j < thp_nr_pages(page); j++) copied = copy_folio_to_iter(folio, offset, bytes, iter);
flush_dcache_page(page + j);
}
copied = copy_page_to_iter(page, offset, bytes, iter);
already_read += copied; already_read += copied;
iocb->ki_pos += copied; iocb->ki_pos += copied;