f2fs: fix to check i_compr_blocks correctly
authorChao Yu <yuchao0@huawei.com>
Tue, 25 Feb 2020 10:26:46 +0000 (18:26 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 10 Mar 2020 16:18:29 +0000 (09:18 -0700)
inode.i_blocks counts based on 512byte sector, we need to convert
to 4kb sized block count before comparing to i_compr_blocks.

In addition, add to print message when sanity check on inode
compression configs failed.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/inode.c

index 78c3f1d70f1dca4430813f2108b8f8186eeb7b95..9b49832296cfc088b91ebdf3feee9f2da0918f4c 100644 (file)
@@ -291,13 +291,30 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
                        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)
+               if (ri->i_compress_algorithm >= COMPRESS_MAX) {
+                       f2fs_warn(sbi, "%s: inode (ino=%lx) has unsupported "
+                               "compress algorithm: %u, run fsck to fix",
+                                 __func__, inode->i_ino,
+                                 ri->i_compress_algorithm);
                        return false;
-               if (le64_to_cpu(ri->i_compr_blocks) > inode->i_blocks)
+               }
+               if (le64_to_cpu(ri->i_compr_blocks) >
+                               SECTOR_TO_BLOCK(inode->i_blocks)) {
+                       f2fs_warn(sbi, "%s: inode (ino=%lx) has inconsistent "
+                               "i_compr_blocks:%llu, i_blocks:%llu, run fsck to fix",
+                                 __func__, inode->i_ino,
+                                 le64_to_cpu(ri->i_compr_blocks),
+                                 SECTOR_TO_BLOCK(inode->i_blocks));
                        return false;
+               }
                if (ri->i_log_cluster_size < MIN_COMPRESS_LOG_SIZE ||
-                       ri->i_log_cluster_size > MAX_COMPRESS_LOG_SIZE)
+                       ri->i_log_cluster_size > MAX_COMPRESS_LOG_SIZE) {
+                       f2fs_warn(sbi, "%s: inode (ino=%lx) has unsupported "
+                               "log cluster size: %u, run fsck to fix",
+                                 __func__, inode->i_ino,
+                                 ri->i_log_cluster_size);
                        return false;
+               }
        }
 
        return true;