On 2021/11/24 16:39, Fengnan Chang wrote:
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);

I didn't get the point, why should we set ino into raw page's private field?

Thanks,

+
                /* 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,



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to