fs: aio: use a folio in aio_setup_ring()
authorKefeng Wang <wangkefeng.wang@huawei.com>
Thu, 21 Mar 2024 13:16:38 +0000 (21:16 +0800)
committerChristian Brauner <brauner@kernel.org>
Fri, 5 Apr 2024 13:53:46 +0000 (15:53 +0200)
Use a folio throughout aio_setup_ring() to remove calls to compound_head(),
also use folio_end_read() to simultaneously mark the folio uptodate and
unlock it.

Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Link: https://lore.kernel.org/r/20240321131640.948634-2-wangkefeng.wang@huawei.com
Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/aio.c

index 9cdaa2faa5363333627e0cba54a4efe75b45b144..60da236ad57507e79ec8eee319e15d3873b1802e 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -527,17 +527,19 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events)
        }
 
        for (i = 0; i < nr_pages; i++) {
-               struct page *page;
-               page = find_or_create_page(file->f_mapping,
-                                          i, GFP_USER | __GFP_ZERO);
-               if (!page)
+               struct folio *folio;
+
+               folio = __filemap_get_folio(file->f_mapping, i,
+                                           FGP_LOCK | FGP_ACCESSED | FGP_CREAT,
+                                           GFP_USER | __GFP_ZERO);
+               if (IS_ERR(folio))
                        break;
-               pr_debug("pid(%d) page[%d]->count=%d\n",
-                        current->pid, i, page_count(page));
-               SetPageUptodate(page);
-               unlock_page(page);
 
-               ctx->ring_pages[i] = page;
+               pr_debug("pid(%d) [%d] folio->count=%d\n", current->pid, i,
+                        folio_ref_count(folio));
+               folio_end_read(folio, true);
+
+               ctx->ring_pages[i] = &folio->page;
        }
        ctx->nr_pages = i;