orangefs: Convert launder_page to launder_folio

OrangeFS launders its pages from a number of locations, so add a
small amount of folio usage to its callers where it makes sense.
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Tested-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Acked-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Tested-by: Mike Marshall <hubcap@omnibond.com> # orangefs
Tested-by: David Howells <dhowells@redhat.com> # afs
parent 15a30ab2
...@@ -243,7 +243,7 @@ static int orangefs_writepages(struct address_space *mapping, ...@@ -243,7 +243,7 @@ static int orangefs_writepages(struct address_space *mapping,
return ret; return ret;
} }
static int orangefs_launder_page(struct page *); static int orangefs_launder_folio(struct folio *);
static void orangefs_readahead(struct readahead_control *rac) static void orangefs_readahead(struct readahead_control *rac)
{ {
...@@ -290,14 +290,15 @@ static void orangefs_readahead(struct readahead_control *rac) ...@@ -290,14 +290,15 @@ static void orangefs_readahead(struct readahead_control *rac)
static int orangefs_readpage(struct file *file, struct page *page) static int orangefs_readpage(struct file *file, struct page *page)
{ {
struct folio *folio = page_folio(page);
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct iov_iter iter; struct iov_iter iter;
struct bio_vec bv; struct bio_vec bv;
ssize_t ret; ssize_t ret;
loff_t off; /* offset into this page */ loff_t off; /* offset into this page */
if (PageDirty(page)) if (folio_test_dirty(folio))
orangefs_launder_page(page); orangefs_launder_folio(folio);
off = page_offset(page); off = page_offset(page);
bv.bv_page = page; bv.bv_page = page;
...@@ -330,6 +331,7 @@ static int orangefs_write_begin(struct file *file, ...@@ -330,6 +331,7 @@ static int orangefs_write_begin(struct file *file,
void **fsdata) void **fsdata)
{ {
struct orangefs_write_range *wr; struct orangefs_write_range *wr;
struct folio *folio;
struct page *page; struct page *page;
pgoff_t index; pgoff_t index;
int ret; int ret;
...@@ -341,27 +343,28 @@ static int orangefs_write_begin(struct file *file, ...@@ -341,27 +343,28 @@ static int orangefs_write_begin(struct file *file,
return -ENOMEM; return -ENOMEM;
*pagep = page; *pagep = page;
folio = page_folio(page);
if (PageDirty(page) && !PagePrivate(page)) { if (folio_test_dirty(folio) && !folio_test_private(folio)) {
/* /*
* Should be impossible. If it happens, launder the page * Should be impossible. If it happens, launder the page
* since we don't know what's dirty. This will WARN in * since we don't know what's dirty. This will WARN in
* orangefs_writepage_locked. * orangefs_writepage_locked.
*/ */
ret = orangefs_launder_page(page); ret = orangefs_launder_folio(folio);
if (ret) if (ret)
return ret; return ret;
} }
if (PagePrivate(page)) { if (folio_test_private(folio)) {
struct orangefs_write_range *wr; struct orangefs_write_range *wr;
wr = (struct orangefs_write_range *)page_private(page); wr = folio_get_private(folio);
if (wr->pos + wr->len == pos && if (wr->pos + wr->len == pos &&
uid_eq(wr->uid, current_fsuid()) && uid_eq(wr->uid, current_fsuid()) &&
gid_eq(wr->gid, current_fsgid())) { gid_eq(wr->gid, current_fsgid())) {
wr->len += len; wr->len += len;
goto okay; goto okay;
} else { } else {
ret = orangefs_launder_page(page); ret = orangefs_launder_folio(folio);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -375,7 +378,7 @@ static int orangefs_write_begin(struct file *file, ...@@ -375,7 +378,7 @@ static int orangefs_write_begin(struct file *file,
wr->len = len; wr->len = len;
wr->uid = current_fsuid(); wr->uid = current_fsuid();
wr->gid = current_fsgid(); wr->gid = current_fsgid();
attach_page_private(page, wr); folio_attach_private(folio, wr);
okay: okay:
return 0; return 0;
} }
...@@ -481,7 +484,7 @@ static void orangefs_invalidate_folio(struct folio *folio, ...@@ -481,7 +484,7 @@ static void orangefs_invalidate_folio(struct folio *folio,
* Thus the following runs if wr was modified above. * Thus the following runs if wr was modified above.
*/ */
orangefs_launder_page(&folio->page); orangefs_launder_folio(folio);
} }
static int orangefs_releasepage(struct page *page, gfp_t foo) static int orangefs_releasepage(struct page *page, gfp_t foo)
...@@ -494,17 +497,17 @@ static void orangefs_freepage(struct page *page) ...@@ -494,17 +497,17 @@ static void orangefs_freepage(struct page *page)
kfree(detach_page_private(page)); kfree(detach_page_private(page));
} }
static int orangefs_launder_page(struct page *page) static int orangefs_launder_folio(struct folio *folio)
{ {
int r = 0; int r = 0;
struct writeback_control wbc = { struct writeback_control wbc = {
.sync_mode = WB_SYNC_ALL, .sync_mode = WB_SYNC_ALL,
.nr_to_write = 0, .nr_to_write = 0,
}; };
wait_on_page_writeback(page); folio_wait_writeback(folio);
if (clear_page_dirty_for_io(page)) { if (folio_clear_dirty_for_io(folio)) {
r = orangefs_writepage_locked(page, &wbc); r = orangefs_writepage_locked(&folio->page, &wbc);
end_page_writeback(page); folio_end_writeback(folio);
} }
return r; return r;
} }
...@@ -637,13 +640,13 @@ static const struct address_space_operations orangefs_address_operations = { ...@@ -637,13 +640,13 @@ static const struct address_space_operations orangefs_address_operations = {
.invalidate_folio = orangefs_invalidate_folio, .invalidate_folio = orangefs_invalidate_folio,
.releasepage = orangefs_releasepage, .releasepage = orangefs_releasepage,
.freepage = orangefs_freepage, .freepage = orangefs_freepage,
.launder_page = orangefs_launder_page, .launder_folio = orangefs_launder_folio,
.direct_IO = orangefs_direct_IO, .direct_IO = orangefs_direct_IO,
}; };
vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf) vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf)
{ {
struct page *page = vmf->page; struct folio *folio = page_folio(vmf->page);
struct inode *inode = file_inode(vmf->vma->vm_file); struct inode *inode = file_inode(vmf->vma->vm_file);
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode); struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
unsigned long *bitlock = &orangefs_inode->bitlock; unsigned long *bitlock = &orangefs_inode->bitlock;
...@@ -657,27 +660,27 @@ vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf) ...@@ -657,27 +660,27 @@ vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf)
goto out; goto out;
} }
lock_page(page); folio_lock(folio);
if (PageDirty(page) && !PagePrivate(page)) { if (folio_test_dirty(folio) && !folio_test_private(folio)) {
/* /*
* Should be impossible. If it happens, launder the page * Should be impossible. If it happens, launder the folio
* since we don't know what's dirty. This will WARN in * since we don't know what's dirty. This will WARN in
* orangefs_writepage_locked. * orangefs_writepage_locked.
*/ */
if (orangefs_launder_page(page)) { if (orangefs_launder_folio(folio)) {
ret = VM_FAULT_LOCKED|VM_FAULT_RETRY; ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
goto out; goto out;
} }
} }
if (PagePrivate(page)) { if (folio_test_private(folio)) {
wr = (struct orangefs_write_range *)page_private(page); wr = folio_get_private(folio);
if (uid_eq(wr->uid, current_fsuid()) && if (uid_eq(wr->uid, current_fsuid()) &&
gid_eq(wr->gid, current_fsgid())) { gid_eq(wr->gid, current_fsgid())) {
wr->pos = page_offset(page); wr->pos = page_offset(vmf->page);
wr->len = PAGE_SIZE; wr->len = PAGE_SIZE;
goto okay; goto okay;
} else { } else {
if (orangefs_launder_page(page)) { if (orangefs_launder_folio(folio)) {
ret = VM_FAULT_LOCKED|VM_FAULT_RETRY; ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
goto out; goto out;
} }
...@@ -688,27 +691,27 @@ vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf) ...@@ -688,27 +691,27 @@ vm_fault_t orangefs_page_mkwrite(struct vm_fault *vmf)
ret = VM_FAULT_LOCKED|VM_FAULT_RETRY; ret = VM_FAULT_LOCKED|VM_FAULT_RETRY;
goto out; goto out;
} }
wr->pos = page_offset(page); wr->pos = page_offset(vmf->page);
wr->len = PAGE_SIZE; wr->len = PAGE_SIZE;
wr->uid = current_fsuid(); wr->uid = current_fsuid();
wr->gid = current_fsgid(); wr->gid = current_fsgid();
attach_page_private(page, wr); folio_attach_private(folio, wr);
okay: okay:
file_update_time(vmf->vma->vm_file); file_update_time(vmf->vma->vm_file);
if (page->mapping != inode->i_mapping) { if (folio->mapping != inode->i_mapping) {
unlock_page(page); folio_unlock(folio);
ret = VM_FAULT_LOCKED|VM_FAULT_NOPAGE; ret = VM_FAULT_LOCKED|VM_FAULT_NOPAGE;
goto out; goto out;
} }
/* /*
* We mark the page dirty already here so that when freeze is in * We mark the folio dirty already here so that when freeze is in
* progress, we are guaranteed that writeback during freezing will * progress, we are guaranteed that writeback during freezing will
* see the dirty page and writeprotect it again. * see the dirty folio and writeprotect it again.
*/ */
set_page_dirty(page); folio_mark_dirty(folio);
wait_for_stable_page(page); folio_wait_stable(folio);
ret = VM_FAULT_LOCKED; ret = VM_FAULT_LOCKED;
out: out:
sb_end_pagefault(inode->i_sb); sb_end_pagefault(inode->i_sb);
......
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