mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
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:
parent
19a2881104
commit
88a59bda3f
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user