ceph: Use a folio in ceph_page_mkwrite()

Convert the passed page to a folio and use it
throughout ceph_page_mkwrite().  Removes the last call to
page_mkwrite_check_truncate(), the last call to offset_in_thp() and one
of the last calls to thp_size().  Saves a few calls to compound_head().

Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Link: https://lore.kernel.org/r/20250217185119.430193-3-willy@infradead.org
Tested-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2025-02-17 18:51:10 +00:00 committed by Christian Brauner
parent 19a2881104
commit 88a59bda3f
No known key found for this signature in database
GPG Key ID: 91C61BC06578DCA2

View File

@ -2042,8 +2042,8 @@ static vm_fault_t ceph_page_mkwrite(struct vm_fault *vmf)
struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_file_info *fi = vma->vm_file->private_data;
struct ceph_cap_flush *prealloc_cf;
struct page *page = vmf->page;
loff_t off = page_offset(page);
struct folio *folio = page_folio(vmf->page);
loff_t off = folio_pos(folio);
loff_t size = i_size_read(inode);
size_t len;
int want, got, err;
@ -2060,10 +2060,10 @@ static vm_fault_t ceph_page_mkwrite(struct vm_fault *vmf)
sb_start_pagefault(inode->i_sb);
ceph_block_sigs(&oldset);
if (off + thp_size(page) <= size)
len = thp_size(page);
if (off + folio_size(folio) <= size)
len = folio_size(folio);
else
len = offset_in_thp(page, size);
len = offset_in_folio(folio, size);
doutc(cl, "%llx.%llx %llu~%zd getting caps i_size %llu\n",
ceph_vinop(inode), off, len, size);
@ -2080,30 +2080,30 @@ static vm_fault_t ceph_page_mkwrite(struct vm_fault *vmf)
doutc(cl, "%llx.%llx %llu~%zd got cap refs on %s\n", ceph_vinop(inode),
off, len, ceph_cap_string(got));
/* Update time before taking page lock */
/* Update time before taking folio lock */
file_update_time(vma->vm_file);
inode_inc_iversion_raw(inode);
do {
struct ceph_snap_context *snapc;
lock_page(page);
folio_lock(folio);
if (page_mkwrite_check_truncate(page, inode) < 0) {
unlock_page(page);
if (folio_mkwrite_check_truncate(folio, inode) < 0) {
folio_unlock(folio);
ret = VM_FAULT_NOPAGE;
break;
}
snapc = ceph_find_incompatible(page);
snapc = ceph_find_incompatible(&folio->page);
if (!snapc) {
/* success. we'll keep the page locked. */
set_page_dirty(page);
/* success. we'll keep the folio locked. */
folio_mark_dirty(folio);
ret = VM_FAULT_LOCKED;
break;
}
unlock_page(page);
folio_unlock(folio);
if (IS_ERR(snapc)) {
ret = VM_FAULT_SIGBUS;