Merge tag 'f2fs-for-5.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeu...
[sfrench/cifs-2.6.git] / fs / f2fs / inode.c
index 4c11254a07d41ae7584ab7f6bb110544fa340e91..0ec8e32a00b47a11448e92d57d6475a4877e4888 100644 (file)
@@ -516,6 +516,11 @@ make_now:
        } else if (ino == F2FS_COMPRESS_INO(sbi)) {
 #ifdef CONFIG_F2FS_FS_COMPRESSION
                inode->i_mapping->a_ops = &f2fs_compress_aops;
+               /*
+                * generic_error_remove_page only truncates pages of regular
+                * inode
+                */
+               inode->i_mode |= S_IFREG;
 #endif
                mapping_set_gfp_mask(inode->i_mapping,
                        GFP_NOFS | __GFP_HIGHMEM | __GFP_MOVABLE);
@@ -544,6 +549,14 @@ make_now:
                goto bad_inode;
        }
        f2fs_set_inode_flags(inode);
+
+       if (file_should_truncate(inode)) {
+               ret = f2fs_truncate(inode);
+               if (ret)
+                       goto bad_inode;
+               file_dont_truncate(inode);
+       }
+
        unlock_new_inode(inode);
        trace_f2fs_iget(inode);
        return inode;
@@ -738,7 +751,8 @@ 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))
+       if ((inode->i_nlink || is_bad_inode(inode)) &&
+               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) ||
@@ -868,7 +882,7 @@ void f2fs_handle_failed_inode(struct inode *inode)
         * so we can prevent losing this orphan when encoutering checkpoint
         * and following suddenly power-off.
         */
-       err = f2fs_get_node_info(sbi, inode->i_ino, &ni);
+       err = f2fs_get_node_info(sbi, inode->i_ino, &ni, false);
        if (err) {
                set_sbi_flag(sbi, SBI_NEED_FSCK);
                f2fs_warn(sbi, "May loss orphan inode, run fsck to fix.");