Skip to content

Commit 62171c1

Browse files
Matthew Wilcox (Oracle)brauner
authored andcommitted
ceph: Convert writepage_nounlock() to write_folio_nounlock()
Remove references to page->index, page->mapping, thp_size(), page_offset() and other page APIs in favour of their more efficient folio replacements. Signed-off-by: "Matthew Wilcox (Oracle)" <willy@infradead.org> Link: https://lore.kernel.org/r/20250217185119.430193-6-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>
1 parent baff974 commit 62171c1

1 file changed

Lines changed: 34 additions & 33 deletions

File tree

fs/ceph/addr.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -698,50 +698,51 @@ static u64 get_writepages_data_length(struct inode *inode,
698698
}
699699

700700
/*
701-
* Write a single page, but leave the page locked.
701+
* Write a folio, but leave it locked.
702702
*
703703
* If we get a write error, mark the mapping for error, but still adjust the
704-
* dirty page accounting (i.e., page is no longer dirty).
704+
* dirty page accounting (i.e., folio is no longer dirty).
705705
*/
706-
static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
706+
static int write_folio_nounlock(struct folio *folio,
707+
struct writeback_control *wbc)
707708
{
708-
struct folio *folio = page_folio(page);
709-
struct inode *inode = page->mapping->host;
709+
struct page *page = &folio->page;
710+
struct inode *inode = folio->mapping->host;
710711
struct ceph_inode_info *ci = ceph_inode(inode);
711712
struct ceph_fs_client *fsc = ceph_inode_to_fs_client(inode);
712713
struct ceph_client *cl = fsc->client;
713714
struct ceph_snap_context *snapc, *oldest;
714-
loff_t page_off = page_offset(page);
715+
loff_t page_off = folio_pos(folio);
715716
int err;
716-
loff_t len = thp_size(page);
717+
loff_t len = folio_size(folio);
717718
loff_t wlen;
718719
struct ceph_writeback_ctl ceph_wbc;
719720
struct ceph_osd_client *osdc = &fsc->client->osdc;
720721
struct ceph_osd_request *req;
721722
bool caching = ceph_is_cache_enabled(inode);
722723
struct page *bounce_page = NULL;
723724

724-
doutc(cl, "%llx.%llx page %p idx %lu\n", ceph_vinop(inode), page,
725-
page->index);
725+
doutc(cl, "%llx.%llx folio %p idx %lu\n", ceph_vinop(inode), folio,
726+
folio->index);
726727

727728
if (ceph_inode_is_shutdown(inode))
728729
return -EIO;
729730

730731
/* verify this is a writeable snap context */
731-
snapc = page_snap_context(page);
732+
snapc = page_snap_context(&folio->page);
732733
if (!snapc) {
733-
doutc(cl, "%llx.%llx page %p not dirty?\n", ceph_vinop(inode),
734-
page);
734+
doutc(cl, "%llx.%llx folio %p not dirty?\n", ceph_vinop(inode),
735+
folio);
735736
return 0;
736737
}
737738
oldest = get_oldest_context(inode, &ceph_wbc, snapc);
738739
if (snapc->seq > oldest->seq) {
739-
doutc(cl, "%llx.%llx page %p snapc %p not writeable - noop\n",
740-
ceph_vinop(inode), page, snapc);
740+
doutc(cl, "%llx.%llx folio %p snapc %p not writeable - noop\n",
741+
ceph_vinop(inode), folio, snapc);
741742
/* we should only noop if called by kswapd */
742743
WARN_ON(!(current->flags & PF_MEMALLOC));
743744
ceph_put_snap_context(oldest);
744-
redirty_page_for_writepage(wbc, page);
745+
folio_redirty_for_writepage(wbc, folio);
745746
return 0;
746747
}
747748
ceph_put_snap_context(oldest);
@@ -758,8 +759,8 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
758759
len = ceph_wbc.i_size - page_off;
759760

760761
wlen = IS_ENCRYPTED(inode) ? round_up(len, CEPH_FSCRYPT_BLOCK_SIZE) : len;
761-
doutc(cl, "%llx.%llx page %p index %lu on %llu~%llu snapc %p seq %lld\n",
762-
ceph_vinop(inode), page, page->index, page_off, wlen, snapc,
762+
doutc(cl, "%llx.%llx folio %p index %lu on %llu~%llu snapc %p seq %lld\n",
763+
ceph_vinop(inode), folio, folio->index, page_off, wlen, snapc,
763764
snapc->seq);
764765

765766
if (atomic_long_inc_return(&fsc->writeback_count) >
@@ -772,32 +773,32 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
772773
ceph_wbc.truncate_seq,
773774
ceph_wbc.truncate_size, true);
774775
if (IS_ERR(req)) {
775-
redirty_page_for_writepage(wbc, page);
776+
folio_redirty_for_writepage(wbc, folio);
776777
return PTR_ERR(req);
777778
}
778779

779780
if (wlen < len)
780781
len = wlen;
781782

782-
set_page_writeback(page);
783+
folio_start_writeback(folio);
783784
if (caching)
784-
ceph_set_page_fscache(page);
785+
ceph_set_page_fscache(&folio->page);
785786
ceph_fscache_write_to_cache(inode, page_off, len, caching);
786787

787788
if (IS_ENCRYPTED(inode)) {
788-
bounce_page = fscrypt_encrypt_pagecache_blocks(page,
789+
bounce_page = fscrypt_encrypt_pagecache_blocks(&folio->page,
789790
CEPH_FSCRYPT_BLOCK_SIZE, 0,
790791
GFP_NOFS);
791792
if (IS_ERR(bounce_page)) {
792-
redirty_page_for_writepage(wbc, page);
793-
end_page_writeback(page);
793+
folio_redirty_for_writepage(wbc, folio);
794+
folio_end_writeback(folio);
794795
ceph_osdc_put_request(req);
795796
return PTR_ERR(bounce_page);
796797
}
797798
}
798799

799800
/* it may be a short write due to an object boundary */
800-
WARN_ON_ONCE(len > thp_size(page));
801+
WARN_ON_ONCE(len > folio_size(folio));
801802
osd_req_op_extent_osd_data_pages(req, 0,
802803
bounce_page ? &bounce_page : &page, wlen, 0,
803804
false, false);
@@ -823,25 +824,25 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
823824
if (err == -ERESTARTSYS) {
824825
/* killed by SIGKILL */
825826
doutc(cl, "%llx.%llx interrupted page %p\n",
826-
ceph_vinop(inode), page);
827-
redirty_page_for_writepage(wbc, page);
828-
end_page_writeback(page);
827+
ceph_vinop(inode), folio);
828+
folio_redirty_for_writepage(wbc, folio);
829+
folio_end_writeback(folio);
829830
return err;
830831
}
831832
if (err == -EBLOCKLISTED)
832833
fsc->blocklisted = true;
833-
doutc(cl, "%llx.%llx setting page/mapping error %d %p\n",
834-
ceph_vinop(inode), err, page);
834+
doutc(cl, "%llx.%llx setting mapping error %d %p\n",
835+
ceph_vinop(inode), err, folio);
835836
mapping_set_error(&inode->i_data, err);
836837
wbc->pages_skipped++;
837838
} else {
838839
doutc(cl, "%llx.%llx cleaned page %p\n",
839-
ceph_vinop(inode), page);
840+
ceph_vinop(inode), folio);
840841
err = 0; /* vfs expects us to return 0 */
841842
}
842-
oldest = detach_page_private(page);
843+
oldest = folio_detach_private(folio);
843844
WARN_ON_ONCE(oldest != snapc);
844-
end_page_writeback(page);
845+
folio_end_writeback(folio);
845846
ceph_put_wrbuffer_cap_refs(ci, 1, snapc);
846847
ceph_put_snap_context(snapc); /* page's reference */
847848

@@ -1820,7 +1821,7 @@ ceph_find_incompatible(struct folio *folio)
18201821
doutc(cl, " %llx.%llx folio %p snapc %p not current, but oldest\n",
18211822
ceph_vinop(inode), folio, snapc);
18221823
if (folio_clear_dirty_for_io(folio)) {
1823-
int r = writepage_nounlock(&folio->page, NULL);
1824+
int r = write_folio_nounlock(folio, NULL);
18241825
if (r < 0)
18251826
return ERR_PTR(r);
18261827
}

0 commit comments

Comments
 (0)