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:
Родитель
bb9263fc14
Коммит
1a6417885b
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче