]> git.ipfire.org Git - people/ms/linux.git/commitdiff
gfs2: Convert gfs2_jhead_process_page() to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 14 May 2022 01:21:11 +0000 (21:21 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Tue, 2 Aug 2022 16:34:03 +0000 (12:34 -0400)
Use folio_put_refs() to perform only one atomic operation instead of two.
The other changes are straightforward conversions from page APIs to
their folio equivalents.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
fs/gfs2/lops.c

index 6ba51cbb94cf2049ebae4fe6cf0fbd0ed8c99a6f..1f67d37cd225c8d73a72f3da8fe145eebc064677 100644 (file)
@@ -452,36 +452,36 @@ static bool gfs2_jhead_pg_srch(struct gfs2_jdesc *jd,
  * @head: The journal head to start from
  * @done: If set, perform only cleanup, else search and set if found.
  *
- * Find the page with 'index' in the journal's mapping. Search the page for
+ * Find the folio with 'index' in the journal's mapping. Search the folio for
  * the journal head if requested (cleanup == false). Release refs on the
- * page so the page cache can reclaim it (put_page() twice). We grabbed a
- * reference on this page two times, first when we did a find_or_create_page()
- * to obtain the page to add it to the bio and second when we do a
- * find_get_page() here to get the page to wait on while I/O on it is being
+ * folio so the page cache can reclaim it. We grabbed a
+ * reference on this folio twice, first when we did a find_or_create_page()
+ * to obtain the folio to add it to the bio and second when we do a
+ * filemap_get_folio() here to get the folio to wait on while I/O on it is being
  * completed.
- * This function is also used to free up a page we might've grabbed but not
+ * This function is also used to free up a folio we might've grabbed but not
  * used. Maybe we added it to a bio, but not submitted it for I/O. Or we
  * submitted the I/O, but we already found the jhead so we only need to drop
- * our references to the page.
+ * our references to the folio.
  */
 
 static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, unsigned long index,
                                    struct gfs2_log_header_host *head,
                                    bool *done)
 {
-       struct page *page;
+       struct folio *folio;
 
-       page = find_get_page(jd->jd_inode->i_mapping, index);
-       wait_on_page_locked(page);
+       folio = filemap_get_folio(jd->jd_inode->i_mapping, index);
 
-       if (PageError(page))
+       folio_wait_locked(folio);
+       if (folio_test_error(folio))
                *done = true;
 
        if (!*done)
-               *done = gfs2_jhead_pg_srch(jd, head, page);
+               *done = gfs2_jhead_pg_srch(jd, head, &folio->page);
 
-       put_page(page); /* Once for find_get_page */
-       put_page(page); /* Once more for find_or_create_page */
+       /* filemap_get_folio() and the earlier find_or_create_page() */
+       folio_put_refs(folio, 2);
 }
 
 static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs)