ocfs2: Convert ocfs2_read_folio() to use a folio

Use the folio API throughout.  There are a few places where we convert
back to a page to call into the rest of the filesystem, so folio usage
needs to be pushed down to those functions later.
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
parent 36a43502
...@@ -277,16 +277,14 @@ static int ocfs2_readpage_inline(struct inode *inode, struct page *page) ...@@ -277,16 +277,14 @@ static int ocfs2_readpage_inline(struct inode *inode, struct page *page)
static int ocfs2_read_folio(struct file *file, struct folio *folio) static int ocfs2_read_folio(struct file *file, struct folio *folio)
{ {
struct page *page = &folio->page; struct inode *inode = folio->mapping->host;
struct inode *inode = page->mapping->host;
struct ocfs2_inode_info *oi = OCFS2_I(inode); struct ocfs2_inode_info *oi = OCFS2_I(inode);
loff_t start = (loff_t)page->index << PAGE_SHIFT; loff_t start = folio_pos(folio);
int ret, unlock = 1; int ret, unlock = 1;
trace_ocfs2_readpage((unsigned long long)oi->ip_blkno, trace_ocfs2_readpage((unsigned long long)oi->ip_blkno, folio->index);
(page ? page->index : 0));
ret = ocfs2_inode_lock_with_page(inode, NULL, 0, page); ret = ocfs2_inode_lock_with_page(inode, NULL, 0, &folio->page);
if (ret != 0) { if (ret != 0) {
if (ret == AOP_TRUNCATED_PAGE) if (ret == AOP_TRUNCATED_PAGE)
unlock = 0; unlock = 0;
...@@ -296,11 +294,11 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) ...@@ -296,11 +294,11 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio)
if (down_read_trylock(&oi->ip_alloc_sem) == 0) { if (down_read_trylock(&oi->ip_alloc_sem) == 0) {
/* /*
* Unlock the page and cycle ip_alloc_sem so that we don't * Unlock the folio and cycle ip_alloc_sem so that we don't
* busyloop waiting for ip_alloc_sem to unlock * busyloop waiting for ip_alloc_sem to unlock
*/ */
ret = AOP_TRUNCATED_PAGE; ret = AOP_TRUNCATED_PAGE;
unlock_page(page); folio_unlock(folio);
unlock = 0; unlock = 0;
down_read(&oi->ip_alloc_sem); down_read(&oi->ip_alloc_sem);
up_read(&oi->ip_alloc_sem); up_read(&oi->ip_alloc_sem);
...@@ -313,21 +311,21 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) ...@@ -313,21 +311,21 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio)
* block_read_full_folio->get_block freaks out if it is asked to read * block_read_full_folio->get_block freaks out if it is asked to read
* beyond the end of a file, so we check here. Callers * beyond the end of a file, so we check here. Callers
* (generic_file_read, vm_ops->fault) are clever enough to check i_size * (generic_file_read, vm_ops->fault) are clever enough to check i_size
* and notice that the page they just read isn't needed. * and notice that the folio they just read isn't needed.
* *
* XXX sys_readahead() seems to get that wrong? * XXX sys_readahead() seems to get that wrong?
*/ */
if (start >= i_size_read(inode)) { if (start >= i_size_read(inode)) {
zero_user(page, 0, PAGE_SIZE); folio_zero_segment(folio, 0, folio_size(folio));
SetPageUptodate(page); folio_mark_uptodate(folio);
ret = 0; ret = 0;
goto out_alloc; goto out_alloc;
} }
if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) if (oi->ip_dyn_features & OCFS2_INLINE_DATA_FL)
ret = ocfs2_readpage_inline(inode, page); ret = ocfs2_readpage_inline(inode, &folio->page);
else else
ret = block_read_full_folio(page_folio(page), ocfs2_get_block); ret = block_read_full_folio(folio, ocfs2_get_block);
unlock = 0; unlock = 0;
out_alloc: out_alloc:
...@@ -336,7 +334,7 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio) ...@@ -336,7 +334,7 @@ static int ocfs2_read_folio(struct file *file, struct folio *folio)
ocfs2_inode_unlock(inode, 0); ocfs2_inode_unlock(inode, 0);
out: out:
if (unlock) if (unlock)
unlock_page(page); folio_unlock(folio);
return ret; return ret;
} }
......
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