Merge tag 'configfs-5.11' of git://git.infradead.org/users/hch/configfs
[linux-2.6-microblaze.git] / fs / f2fs / compress.c
index 14262e0..4bcbacf 100644 (file)
@@ -602,6 +602,7 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
                                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,
@@ -655,6 +656,11 @@ static int f2fs_compress_pages(struct compress_ctx *cc)
 
        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);
 
@@ -790,6 +796,22 @@ void f2fs_decompress_pages(struct bio *bio, struct page *page, bool verity)
 
        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);
+               }
+       }
+
 out_vunmap_cbuf:
        vm_unmap_ram(dic->cbuf, dic->nr_cpages);
 out_vunmap_rbuf:
@@ -798,8 +820,6 @@ destroy_decompress_ctx:
        if (cops->destroy_decompress_ctx)
                cops->destroy_decompress_ctx(dic);
 out_free_dic:
-       if (verity)
-               atomic_set(&dic->pending_pages, dic->nr_cpages);
        if (!verity)
                f2fs_decompress_end_io(dic->rpages, dic->cluster_size,
                                                                ret, false);
@@ -921,7 +941,7 @@ int f2fs_is_compressed_cluster(struct inode *inode, pgoff_t index)
 
 static bool cluster_may_compress(struct compress_ctx *cc)
 {
-       if (!f2fs_compressed_file(cc->inode))
+       if (!f2fs_need_compress_data(cc->inode))
                return false;
        if (f2fs_is_atomic_file(cc->inode))
                return false;