Merge tag 'f2fs-for-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeu...
[sfrench/cifs-2.6.git] / fs / f2fs / inode.c
index b401f08569f7004dfa728bb76b732105810e44bb..9141147b5bb00eb12649a6e5766ec511b2bb9ef1 100644 (file)
 
 #include <trace/events/f2fs.h>
 
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+extern const struct address_space_operations f2fs_compress_aops;
+#endif
+
 void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)
 {
        if (is_inode_flag_set(inode, FI_NEW_INODE))
@@ -494,6 +498,11 @@ struct inode *f2fs_iget(struct super_block *sb, unsigned long ino)
        if (ino == F2FS_NODE_INO(sbi) || ino == F2FS_META_INO(sbi))
                goto make_now;
 
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+       if (ino == F2FS_COMPRESS_INO(sbi))
+               goto make_now;
+#endif
+
        ret = do_read_inode(inode);
        if (ret)
                goto bad_inode;
@@ -504,6 +513,12 @@ make_now:
        } else if (ino == F2FS_META_INO(sbi)) {
                inode->i_mapping->a_ops = &f2fs_meta_aops;
                mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
+       } else if (ino == F2FS_COMPRESS_INO(sbi)) {
+#ifdef CONFIG_F2FS_FS_COMPRESSION
+               inode->i_mapping->a_ops = &f2fs_compress_aops;
+#endif
+               mapping_set_gfp_mask(inode->i_mapping,
+                       GFP_NOFS | __GFP_HIGHMEM | __GFP_MOVABLE);
        } else if (S_ISREG(inode->i_mode)) {
                inode->i_op = &f2fs_file_inode_operations;
                inode->i_fop = &f2fs_file_operations;
@@ -646,7 +661,7 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page)
 
        /* deleted inode */
        if (inode->i_nlink == 0)
-               clear_inline_node(node_page);
+               clear_page_private_inline(node_page);
 
        F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
        F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
@@ -723,8 +738,12 @@ void f2fs_evict_inode(struct inode *inode)
        trace_f2fs_evict_inode(inode);
        truncate_inode_pages_final(&inode->i_data);
 
+       if (test_opt(sbi, COMPRESS_CACHE) && f2fs_compressed_file(inode))
+               f2fs_invalidate_compress_pages(sbi, inode->i_ino);
+
        if (inode->i_ino == F2FS_NODE_INO(sbi) ||
-                       inode->i_ino == F2FS_META_INO(sbi))
+                       inode->i_ino == F2FS_META_INO(sbi) ||
+                       inode->i_ino == F2FS_COMPRESS_INO(sbi))
                goto out_clear;
 
        f2fs_bug_on(sbi, get_dirty_pages(inode));