Previously, compressed page cache drop when clean page cache, but POSIX_FADV_DONTNEED can't clean compressed page cache, this commit try to support it.
Signed-off-by: Fengnan Chang <[email protected]> --- fs/f2fs/compress.c | 10 ++++++++-- fs/f2fs/f2fs.h | 7 ++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index fb9e5149af5d..7ec5e3c2590b 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -842,7 +842,7 @@ void f2fs_end_read_compressed_page(struct page *page, bool failed, WRITE_ONCE(dic->failed, true); else if (blkaddr) f2fs_cache_compressed_page(sbi, page, - dic->inode->i_ino, blkaddr); + dic, blkaddr); if (atomic_dec_and_test(&dic->remaining_pages)) f2fs_decompress_cluster(dic); @@ -1659,6 +1659,7 @@ static void f2fs_put_dic(struct decompress_io_ctx *dic) static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) { int i; + nid_t ino = dic->inode->i_ino; for (i = 0; i < dic->cluster_size; i++) { struct page *rpage = dic->rpages[i]; @@ -1666,6 +1667,9 @@ static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) if (!rpage) continue; + if (dic->cpage_cached) + set_page_private_data(rpage, ino); + /* PG_error was set if verity failed. */ if (failed || PageError(rpage)) { ClearPageUptodate(rpage); @@ -1772,10 +1776,11 @@ void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi, block_t blkaddr) } void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page, - nid_t ino, block_t blkaddr) + struct decompress_io_ctx *dic, block_t blkaddr) { struct page *cpage; int ret; + nid_t ino = dic->inode->i_ino; if (!test_opt(sbi, COMPRESS_CACHE)) return; @@ -1804,6 +1809,7 @@ void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page, } set_page_private_data(cpage, ino); + dic->cpage_cached = true; if (!f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE_READ)) goto out; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index ac6dda6c4c5a..128190b0c737 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1551,6 +1551,7 @@ struct decompress_io_ctx { */ refcount_t refcnt; + bool cpage_cached; /* indicate cpages cached in compress mapping*/ bool failed; /* IO error occurred before decompression? */ bool need_verity; /* need fs-verity verification after decompression? */ void *private; /* payload buffer for specified decompression algorithm */ @@ -4085,7 +4086,7 @@ void f2fs_destroy_compress_cache(void); struct address_space *COMPRESS_MAPPING(struct f2fs_sb_info *sbi); void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi, block_t blkaddr); void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page, - nid_t ino, block_t blkaddr); + struct decompress_io_ctx *dic, block_t blkaddr); bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi, struct page *page, block_t blkaddr); void f2fs_invalidate_compress_pages(struct f2fs_sb_info *sbi, nid_t ino); @@ -4137,8 +4138,8 @@ static inline int __init f2fs_init_compress_cache(void) { return 0; } static inline void f2fs_destroy_compress_cache(void) { } static inline void f2fs_invalidate_compress_page(struct f2fs_sb_info *sbi, block_t blkaddr) { } -static inline void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, - struct page *page, nid_t ino, block_t blkaddr) { } +static inline void f2fs_cache_compressed_page(struct f2fs_sb_info *sbi, struct page *page, + struct decompress_io_ctx *dic, block_t blkaddr) { } static inline bool f2fs_load_compressed_page(struct f2fs_sb_info *sbi, struct page *page, block_t blkaddr) { return false; } static inline void f2fs_invalidate_compress_pages(struct f2fs_sb_info *sbi, -- 2.32.0 _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
