The functions that call page_snap_context() either passes in 1) &folio->page, which is the common case; or 2) ceph_fscrypt_pagecache_page(page), which only happens in get_writepages_data_length(). We separate the handling of the call to page_snap_context for the two cases. For the first case, we remove the use of &folio->page by introducing an equivalent function folio_snap_context() which consumes struct folio directly. For the second case, it involves more changes to convert, we leave it unchanged for now. Signed-off-by: Fan Ni <fan.ni@xxxxxxxxxxx> --- fs/ceph/addr.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index 29be367905a1..aa0ad730059a 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -67,6 +67,13 @@ static int ceph_netfs_check_write_begin(struct file *file, loff_t pos, unsigned int len, struct folio **foliop, void **_fsdata); +static inline struct ceph_snap_context *folio_snap_context(struct folio *folio) +{ + if (folio_test_private(folio)) + return (void *)folio->private; + return NULL; +} + static inline struct ceph_snap_context *page_snap_context(struct page *page) { if (PagePrivate(page)) @@ -729,7 +736,7 @@ static int write_folio_nounlock(struct folio *folio, return -EIO; /* verify this is a writeable snap context */ - snapc = page_snap_context(&folio->page); + snapc = folio_snap_context(folio); if (!snapc) { doutc(cl, "%llx.%llx folio %p not dirty?\n", ceph_vinop(inode), folio); @@ -1140,7 +1147,7 @@ int ceph_check_page_before_write(struct address_space *mapping, } /* only if matching snap context */ - pgsnapc = page_snap_context(&folio->page); + pgsnapc = folio_snap_context(folio); if (pgsnapc != ceph_wbc->snapc) { doutc(cl, "folio snapc %p %lld != oldest %p %lld\n", pgsnapc, pgsnapc->seq, @@ -1586,7 +1593,7 @@ void ceph_wait_until_current_writes_complete(struct address_space *mapping, struct writeback_control *wbc, struct ceph_writeback_ctl *ceph_wbc) { - struct page *page; + struct folio *folio; unsigned i, nr; if (wbc->sync_mode != WB_SYNC_NONE && @@ -1601,10 +1608,10 @@ void ceph_wait_until_current_writes_complete(struct address_space *mapping, PAGECACHE_TAG_WRITEBACK, &ceph_wbc->fbatch))) { for (i = 0; i < nr; i++) { - page = &ceph_wbc->fbatch.folios[i]->page; - if (page_snap_context(page) != ceph_wbc->snapc) + folio = ceph_wbc->fbatch.folios[i]; + if (folio_snap_context(folio) != ceph_wbc->snapc) continue; - wait_on_page_writeback(page); + folio_wait_writeback(folio); } folio_batch_release(&ceph_wbc->fbatch); @@ -1793,7 +1800,7 @@ ceph_find_incompatible(struct folio *folio) folio_wait_writeback(folio); - snapc = page_snap_context(&folio->page); + snapc = folio_snap_context(folio); if (!snapc || snapc == ci->i_head_snapc) break; -- 2.47.2