]> www.infradead.org Git - users/hch/block.git/commitdiff
f2fs: use read_cache_folio in f2fs_cache_compressed_page
authorChristoph Hellwig <hch@lst.de>
Thu, 31 Mar 2022 05:01:20 +0000 (07:01 +0200)
committerChristoph Hellwig <hch@lst.de>
Thu, 31 Mar 2022 12:03:08 +0000 (14:03 +0200)
Use read_cache_folio instead of duplicating the page cache logic
in f2fs_cache_compressed_page.

Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/f2fs/compress.c

index 12a56f9e15722db10f2d0adbeaae61fcfb471ca7..cd4a6ecc5500159b5bc5e1c01d5fcf0ed052fac9 100644 (file)
@@ -1762,11 +1762,29 @@ void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi, block_t blkaddr)
        invalidate_mapping_pages(COMPRESS_MAPPING(sbi), blkaddr, blkaddr);
 }
 
+struct f2fs_compressed_fill_data {
+       struct page *page;
+       nid_t ino;
+};
+
+static int f2fs_fill_compressed_page(void *data, struct page *cpage)
+{
+       struct f2fs_compressed_fill_data *cd = data;
+
+       set_page_private_data(cpage, cd->ino);
+       memcpy(page_address(cpage), page_address(cd->page), PAGE_SIZE);
+       SetPageUptodate(cpage);
+       return 0;
+}
+
 void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page,
                                                nid_t ino, block_t blkaddr)
 {
-       struct page *cpage;
-       int ret;
+       struct f2fs_compressed_fill_data cd = {
+               .page = page,
+               .ino = ino,
+       };
+       struct folio *cfolio;
 
        if (!test_opt(sbi, COMPRESS_CACHE))
                return;
@@ -1777,32 +1795,10 @@ void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page,
        if (!f2fs_available_free_memory(sbi, COMPRESS_PAGE))
                return;
 
-       cpage = find_get_page(COMPRESS_MAPPING(sbi), blkaddr);
-       if (cpage) {
-               f2fs_put_page(cpage, 0);
-               return;
-       }
-
-       cpage = alloc_page(__GFP_NOWARN | __GFP_IO);
-       if (!cpage)
-               return;
-
-       ret = add_to_page_cache_lru(cpage, COMPRESS_MAPPING(sbi),
-                                               blkaddr, GFP_NOFS);
-       if (ret) {
-               f2fs_put_page(cpage, 0);
-               return;
-       }
-
-       set_page_private_data(cpage, ino);
-
-       if (!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE_READ))
-               goto out;
-
-       memcpy(page_address(cpage), page_address(page), PAGE_SIZE);
-       SetPageUptodate(cpage);
-out:
-       f2fs_put_page(cpage, 1);
+       cfolio = read_cache_folio(COMPRESS_MAPPING(sbi), blkaddr,
+                                f2fs_fill_compressed_page, &cd);
+       if (!IS_ERR(cfolio))
+               folio_put(cfolio);
 }
 
 bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi, struct page *page,