f2fs: check total_segments from devices in raw_super
authorQiuyang Sun <sunqiuyang@huawei.com>
Mon, 23 Sep 2019 04:22:35 +0000 (12:22 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 22 Oct 2019 17:32:42 +0000 (10:32 -0700)
For multi-device F2FS, we should check if the sum of total_segments from
all devices matches segment_count.

Signed-off-by: Qiuyang Sun <sunqiuyang@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/super.c

index f3a68af3b43acc04c7ed3209be970edce25fa040..112eb86a120f5bb43ec6dd6795aead80cbff394a 100644 (file)
@@ -2604,6 +2604,21 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
                return -EFSCORRUPTED;
        }
 
+       if (RDEV(0).path[0]) {
+               block_t dev_seg_count = le32_to_cpu(RDEV(0).total_segments);
+               int i = 1;
+
+               while (i < MAX_DEVICES && RDEV(i).path[0]) {
+                       dev_seg_count += le32_to_cpu(RDEV(i).total_segments);
+                       i++;
+               }
+               if (segment_count != dev_seg_count) {
+                       f2fs_info(sbi, "Segment count (%u) mismatch with total segments from devices (%u)",
+                                       segment_count, dev_seg_count);
+                       return -EFSCORRUPTED;
+               }
+       }
+
        if (secs_per_zone > total_sections || !secs_per_zone) {
                f2fs_info(sbi, "Wrong secs_per_zone / total_sections (%u, %u)",
                          secs_per_zone, total_sections);