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;
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,