f2fs: support POSIX_FADV_DONTNEED drop compressed page cache
authorFengnan Chang <changfengnan@vivo.com>
Mon, 29 Nov 2021 02:13:41 +0000 (10:13 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 10 Dec 2021 23:48:32 +0000 (15:48 -0800)
Previously, compressed page cache drop when clean page cache, but
POSIX_FADV_DONTNEED can't clean compressed page cache because raw page
don't have private data, and won't call f2fs_invalidate_compress_pages.
This commit call f2fs_invalidate_compress_pages() directly in
f2fs_file_fadvise() for POSIX_FADV_DONTNEED case.

Signed-off-by: Fengnan Chang <changfengnan@vivo.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 0802a10a651ffc998fcbeb1b9e09649305ea6752..a15f8ba239f0b5e66a4f61f4fa7d0422a366ab72 100644 (file)
@@ -4663,12 +4663,12 @@ out:
 static int f2fs_file_fadvise(struct file *filp, loff_t offset, loff_t len,
                int advice)
 {
-       struct inode *inode;
        struct address_space *mapping;
        struct backing_dev_info *bdi;
+       struct inode *inode = file_inode(filp);
+       int err;
 
        if (advice == POSIX_FADV_SEQUENTIAL) {
-               inode = file_inode(filp);
                if (S_ISFIFO(inode->i_mode))
                        return -ESPIPE;
 
@@ -4685,7 +4685,13 @@ static int f2fs_file_fadvise(struct file *filp, loff_t offset, loff_t len,
                return 0;
        }
 
-       return generic_fadvise(filp, offset, len, advice);
+       err = generic_fadvise(filp, offset, len, advice);
+       if (!err && advice == POSIX_FADV_DONTNEED &&
+               test_opt(F2FS_I_SB(inode), COMPRESS_CACHE) &&
+               f2fs_compressed_file(inode))
+               f2fs_invalidate_compress_pages(F2FS_I_SB(inode), inode->i_ino);
+
+       return err;
 }
 
 #ifdef CONFIG_COMPAT