]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ceph: Use a folio in ceph_page_mkwrite()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 17 Feb 2025 18:51:10 +0000 (18:51 +0000)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Feb 2025 10:21:30 +0000 (11:21 +0100)
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>
fs/ceph/addr.c

index 9503cae079292608132978465eaa8e82535a7c17..98902989523fac2230025fd967bcfc1412c19dfe 100644 (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;