For other files, we can still enable compression via ioctl.
                         Note that, there is one reserved special extension '*', it
                         can be set to enable compression for all files.
+compress_chksum                 Support verifying chksum of raw data in compressed cluster.
 inlinecrypt             When possible, encrypt/decrypt the contents of encrypted
                         files using the blk-crypto framework rather than
                         filesystem-layer encryption. This allows the use of
 
                                f2fs_cops[fi->i_compress_algorithm];
        unsigned int max_len, new_nr_cpages;
        struct page **new_cpages;
+       u32 chksum = 0;
        int i, ret;
 
        trace_f2fs_compress_pages_start(cc->inode, cc->cluster_idx,
 
        cc->cbuf->clen = cpu_to_le32(cc->clen);
 
+       if (fi->i_compress_flag & 1 << COMPRESS_CHKSUM)
+               chksum = f2fs_crc32(F2FS_I_SB(cc->inode),
+                                       cc->cbuf->cdata, cc->clen);
+       cc->cbuf->chksum = cpu_to_le32(chksum);
+
        for (i = 0; i < COMPRESS_DATA_RESERVED_SIZE; i++)
                cc->cbuf->reserved[i] = cpu_to_le32(0);
 
 
        ret = cops->decompress_pages(dic);
 
+       if (!ret && fi->i_compress_flag & 1 << COMPRESS_CHKSUM) {
+               u32 provided = le32_to_cpu(dic->cbuf->chksum);
+               u32 calculated = f2fs_crc32(sbi, dic->cbuf->cdata, dic->clen);
+
+               if (provided != calculated) {
+                       if (!is_inode_flag_set(dic->inode, FI_COMPRESS_CORRUPT)) {
+                               set_inode_flag(dic->inode, FI_COMPRESS_CORRUPT);
+                               printk_ratelimited(
+                                       "%sF2FS-fs (%s): checksum invalid, nid = %lu, %x vs %x",
+                                       KERN_INFO, sbi->sb->s_id, dic->inode->i_ino,
+                                       provided, calculated);
+                       }
+                       set_sbi_flag(sbi, SBI_NEED_FSCK);
+                       WARN_ON_ONCE(1);
+               }
+       }
+
 out_vunmap_cbuf:
        vm_unmap_ram(dic->cbuf, dic->nr_cpages);
 out_vunmap_rbuf:
 
 
        /* For compression */
        unsigned char compress_algorithm;       /* algorithm type */
-       unsigned compress_log_size;             /* cluster log size */
+       unsigned char compress_log_size;        /* cluster log size */
+       bool compress_chksum;                   /* compressed data chksum */
        unsigned char compress_ext_cnt;         /* extension count */
        unsigned char extensions[COMPRESS_EXT_NUM][F2FS_EXTENSION_LEN]; /* extensions */
 };
        FI_ATOMIC_REVOKE_REQUEST, /* request to drop atomic data */
        FI_VERITY_IN_PROGRESS,  /* building fs-verity Merkle tree */
        FI_COMPRESSED_FILE,     /* indicate file's data can be compressed */
+       FI_COMPRESS_CORRUPT,    /* indicate compressed cluster is corrupted */
        FI_MMAP_FILE,           /* indicate file was mmapped */
        FI_MAX,                 /* max flag, never be used */
 };
        atomic_t i_compr_blocks;                /* # of compressed blocks */
        unsigned char i_compress_algorithm;     /* algorithm type */
        unsigned char i_log_cluster_size;       /* log of cluster size */
+       unsigned short i_compress_flag;         /* compress flag */
        unsigned int i_cluster_size;            /* cluster size */
 };
 
        COMPRESS_MAX,
 };
 
-#define COMPRESS_DATA_RESERVED_SIZE            5
+enum compress_flag {
+       COMPRESS_CHKSUM,
+       COMPRESS_MAX_FLAG,
+};
+
+#define COMPRESS_DATA_RESERVED_SIZE            4
 struct compress_data {
        __le32 clen;                    /* compressed data size */
+       __le32 chksum;                  /* compressed data chksum */
        __le32 reserved[COMPRESS_DATA_RESERVED_SIZE];   /* reserved */
        u8 cdata[];                     /* compressed data */
 };
                        F2FS_OPTION(sbi).compress_algorithm;
        F2FS_I(inode)->i_log_cluster_size =
                        F2FS_OPTION(sbi).compress_log_size;
+       F2FS_I(inode)->i_compress_flag =
+                       F2FS_OPTION(sbi).compress_chksum ?
+                               1 << COMPRESS_CHKSUM : 0;
        F2FS_I(inode)->i_cluster_size =
                        1 << F2FS_I(inode)->i_log_cluster_size;
        F2FS_I(inode)->i_flags |= F2FS_COMPR_FL;
 
                                        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_compress_flag = le16_to_cpu(ri->i_compress_flag);
                        fi->i_cluster_size = 1 << fi->i_log_cluster_size;
                        set_inode_flag(inode, FI_COMPRESSED_FILE);
                }
                                        &F2FS_I(inode)->i_compr_blocks));
                        ri->i_compress_algorithm =
                                F2FS_I(inode)->i_compress_algorithm;
+                       ri->i_compress_flag =
+                               cpu_to_le16(F2FS_I(inode)->i_compress_flag);
                        ri->i_log_cluster_size =
                                F2FS_I(inode)->i_log_cluster_size;
                }
 
        Opt_compress_algorithm,
        Opt_compress_log_size,
        Opt_compress_extension,
+       Opt_compress_chksum,
        Opt_atgc,
        Opt_err,
 };
        {Opt_compress_algorithm, "compress_algorithm=%s"},
        {Opt_compress_log_size, "compress_log_size=%u"},
        {Opt_compress_extension, "compress_extension=%s"},
+       {Opt_compress_chksum, "compress_chksum"},
        {Opt_atgc, "atgc"},
        {Opt_err, NULL},
 };
                        F2FS_OPTION(sbi).compress_ext_cnt++;
                        kfree(name);
                        break;
+               case Opt_compress_chksum:
+                       F2FS_OPTION(sbi).compress_chksum = true;
+                       break;
 #else
                case Opt_compress_algorithm:
                case Opt_compress_log_size:
                case Opt_compress_extension:
+               case Opt_compress_chksum:
                        f2fs_info(sbi, "compression options not supported");
                        break;
 #endif
                seq_printf(seq, ",compress_extension=%s",
                        F2FS_OPTION(sbi).extensions[i]);
        }
+
+       if (F2FS_OPTION(sbi).compress_chksum)
+               seq_puts(seq, ",compress_chksum");
 }
 
 static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
 
                        __le64 i_compr_blocks;  /* # of compressed blocks */
                        __u8 i_compress_algorithm;      /* compress algorithm */
                        __u8 i_log_cluster_size;        /* log of cluster size */
-                       __le16 i_padding;               /* padding */
+                       __le16 i_compress_flag;         /* compress flag */
                        __le32 i_extra_end[0];  /* for attribute size calculation */
                } __packed;
                __le32 i_addr[DEF_ADDRS_PER_INODE];     /* Pointers to data blocks */