orangefs: Convert orangefs to read_folio

This is a full conversion which should be large folio ready, although
I have not tested it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2022-04-29 11:12:16 -04:00
parent bb9263fc14
commit 1a6417885b

View File

@ -288,40 +288,39 @@ static void orangefs_readahead(struct readahead_control *rac)
}
}
static int orangefs_readpage(struct file *file, struct page *page)
static int orangefs_read_folio(struct file *file, struct folio *folio)
{
struct folio *folio = page_folio(page);
struct inode *inode = page->mapping->host;
struct inode *inode = folio->mapping->host;
struct iov_iter iter;
struct bio_vec bv;
ssize_t ret;
loff_t off; /* offset into this page */
loff_t off; /* offset of this folio in the file */
if (folio_test_dirty(folio))
orangefs_launder_folio(folio);
off = page_offset(page);
bv.bv_page = page;
bv.bv_len = PAGE_SIZE;
off = folio_pos(folio);
bv.bv_page = &folio->page;
bv.bv_len = folio_size(folio);
bv.bv_offset = 0;
iov_iter_bvec(&iter, READ, &bv, 1, PAGE_SIZE);
iov_iter_bvec(&iter, READ, &bv, 1, folio_size(folio));
ret = wait_for_direct_io(ORANGEFS_IO_READ, inode, &off, &iter,
PAGE_SIZE, inode->i_size, NULL, NULL, file);
folio_size(folio), inode->i_size, NULL, NULL, file);
/* this will only zero remaining unread portions of the page data */
iov_iter_zero(~0U, &iter);
/* takes care of potential aliasing */
flush_dcache_page(page);
flush_dcache_folio(folio);
if (ret < 0) {
SetPageError(page);
folio_set_error(folio);
} else {
SetPageUptodate(page);
if (PageError(page))
ClearPageError(page);
folio_mark_uptodate(folio);
if (folio_test_error(folio))
folio_clear_error(folio);
ret = 0;
}
/* unlock the page after the ->readpage() routine completes */
unlock_page(page);
/* unlock the folio after the ->read_folio() routine completes */
folio_unlock(folio);
return ret;
}
@ -631,7 +630,7 @@ out:
static const struct address_space_operations orangefs_address_operations = {
.writepage = orangefs_writepage,
.readahead = orangefs_readahead,
.readpage = orangefs_readpage,
.read_folio = orangefs_read_folio,
.writepages = orangefs_writepages,
.dirty_folio = filemap_dirty_folio,
.write_begin = orangefs_write_begin,