]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/f2fs/inode.c
Merge tag 'drm-misc-fixes-2020-02-07' of git://anongit.freedesktop.org/drm/drm-misc...
[linux.git] / fs / f2fs / inode.c
index 502bd491336a8200861232e9b3ba60ccc94965c3..78c3f1d70f1dca4430813f2108b8f8186eeb7b95 100644 (file)
@@ -200,6 +200,7 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
 {
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        struct f2fs_inode_info *fi = F2FS_I(inode);
+       struct f2fs_inode *ri = F2FS_INODE(node_page);
        unsigned long long iblocks;
 
        iblocks = le64_to_cpu(F2FS_INODE(node_page)->i_blocks);
@@ -286,6 +287,19 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
                return false;
        }
 
+       if (f2fs_has_extra_attr(inode) && f2fs_sb_has_compression(sbi) &&
+                       fi->i_flags & F2FS_COMPR_FL &&
+                       F2FS_FITS_IN_INODE(ri, fi->i_extra_isize,
+                                               i_log_cluster_size)) {
+               if (ri->i_compress_algorithm >= COMPRESS_MAX)
+                       return false;
+               if (le64_to_cpu(ri->i_compr_blocks) > inode->i_blocks)
+                       return false;
+               if (ri->i_log_cluster_size < MIN_COMPRESS_LOG_SIZE ||
+                       ri->i_log_cluster_size > MAX_COMPRESS_LOG_SIZE)
+                       return false;
+       }
+
        return true;
 }
 
@@ -407,6 +421,18 @@ static int do_read_inode(struct inode *inode)
                fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec);
        }
 
+       if (f2fs_has_extra_attr(inode) && f2fs_sb_has_compression(sbi) &&
+                                       (fi->i_flags & F2FS_COMPR_FL)) {
+               if (F2FS_FITS_IN_INODE(ri, fi->i_extra_isize,
+                                       i_log_cluster_size)) {
+                       fi->i_compr_blocks = le64_to_cpu(ri->i_compr_blocks);
+                       fi->i_compress_algorithm = ri->i_compress_algorithm;
+                       fi->i_log_cluster_size = ri->i_log_cluster_size;
+                       fi->i_cluster_size = 1 << fi->i_log_cluster_size;
+                       set_inode_flag(inode, FI_COMPRESSED_FILE);
+               }
+       }
+
        F2FS_I(inode)->i_disk_time[0] = inode->i_atime;
        F2FS_I(inode)->i_disk_time[1] = inode->i_ctime;
        F2FS_I(inode)->i_disk_time[2] = inode->i_mtime;
@@ -416,6 +442,8 @@ static int do_read_inode(struct inode *inode)
        stat_inc_inline_xattr(inode);
        stat_inc_inline_inode(inode);
        stat_inc_inline_dir(inode);
+       stat_inc_compr_inode(inode);
+       stat_add_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks);
 
        return 0;
 }
@@ -569,6 +597,17 @@ void f2fs_update_inode(struct inode *inode, struct page *node_page)
                        ri->i_crtime_nsec =
                                cpu_to_le32(F2FS_I(inode)->i_crtime.tv_nsec);
                }
+
+               if (f2fs_sb_has_compression(F2FS_I_SB(inode)) &&
+                       F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize,
+                                                       i_log_cluster_size)) {
+                       ri->i_compr_blocks =
+                               cpu_to_le64(F2FS_I(inode)->i_compr_blocks);
+                       ri->i_compress_algorithm =
+                               F2FS_I(inode)->i_compress_algorithm;
+                       ri->i_log_cluster_size =
+                               F2FS_I(inode)->i_log_cluster_size;
+               }
        }
 
        __set_inode_rdev(inode, ri);
@@ -711,6 +750,8 @@ void f2fs_evict_inode(struct inode *inode)
        stat_dec_inline_xattr(inode);
        stat_dec_inline_dir(inode);
        stat_dec_inline_inode(inode);
+       stat_dec_compr_inode(inode);
+       stat_sub_compr_blocks(inode, F2FS_I(inode)->i_compr_blocks);
 
        if (likely(!f2fs_cp_error(sbi) &&
                                !is_sbi_flag_set(sbi, SBI_CP_DISABLED)))