From patchwork Tue Jun 12 09:53:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 928260 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 414myx2NsHz9s1B for ; Tue, 12 Jun 2018 20:56:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933469AbeFLK4V (ORCPT ); Tue, 12 Jun 2018 06:56:21 -0400 Received: from mx2.suse.de ([195.135.220.15]:40091 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933394AbeFLK4H (ORCPT ); Tue, 12 Jun 2018 06:56:07 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext-too.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E89FDAE0C; Tue, 12 Jun 2018 10:56:05 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 42A0B1E11E9; Tue, 12 Jun 2018 11:53:35 +0200 (CEST) From: Jan Kara To: Cc: Ted Tso , Jan Kara Subject: [PATCH 10/10] e2fsck: Report only one sb corruption Date: Tue, 12 Jun 2018 11:53:28 +0200 Message-Id: <20180612095328.5215-11-jack@suse.cz> X-Mailer: git-send-email 2.13.7 In-Reply-To: <20180612095328.5215-1-jack@suse.cz> References: <20180612095328.5215-1-jack@suse.cz> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org check_super_value() does not terminate in case of error anymore since c8b20b40ebf0 "misc: add plausibility checks to debugfs/tune2fs/dumpe2fs/e2fsck" which removed the PR_FATAL flag from PR_0_SB_CORRUPT problem. This results in potentially many errors for superblock being printed including the long message about how to deal with corrupted superblock. Restore the original behavior of reporting only one error and also remove the comments 'never get here' as they are not true anymore. Reviewed-by: Andreas Dilger Signed-off-by: Jan Kara --- e2fsck/super.c | 98 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/e2fsck/super.c b/e2fsck/super.c index 60a19a7e2767..bfd1006697c5 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -24,7 +24,7 @@ #define MAX_CHECK 2 #define LOG2_CHECK 4 -static void check_super_value(e2fsck_t ctx, const char *descr, +static int check_super_value(e2fsck_t ctx, const char *descr, unsigned long value, int flags, unsigned long min_val, unsigned long max_val) { @@ -37,11 +37,13 @@ static void check_super_value(e2fsck_t ctx, const char *descr, pctx.num = value; pctx.str = descr; fix_problem(ctx, PR_0_MISC_CORRUPT_SUPER, &pctx); - ctx->flags |= E2F_FLAG_ABORT; /* never get here! */ + ctx->flags |= E2F_FLAG_ABORT; + return 0; } + return 1; } -static void check_super_value64(e2fsck_t ctx, const char *descr, +static int check_super_value64(e2fsck_t ctx, const char *descr, __u64 value, int flags, __u64 min_val, __u64 max_val) { @@ -54,8 +56,10 @@ static void check_super_value64(e2fsck_t ctx, const char *descr, pctx.num = value; pctx.str = descr; fix_problem(ctx, PR_0_MISC_CORRUPT_SUPER, &pctx); - ctx->flags |= E2F_FLAG_ABORT; /* never get here! */ + ctx->flags |= E2F_FLAG_ABORT; + return 0; } + return 1; } /* @@ -618,34 +622,46 @@ void check_super_block(e2fsck_t ctx) /* * Verify the super block constants... */ - check_super_value(ctx, "inodes_count", sb->s_inodes_count, - MIN_CHECK, 1, 0); - check_super_value64(ctx, "blocks_count", ext2fs_blocks_count(sb), - MIN_CHECK | MAX_CHECK, 1, blks_max); - check_super_value(ctx, "first_data_block", sb->s_first_data_block, - MAX_CHECK, 0, ext2fs_blocks_count(sb)); - check_super_value(ctx, "log_block_size", sb->s_log_block_size, - MIN_CHECK | MAX_CHECK, 0, - EXT2_MAX_BLOCK_LOG_SIZE - EXT2_MIN_BLOCK_LOG_SIZE); - check_super_value(ctx, "log_cluster_size", - sb->s_log_cluster_size, - MIN_CHECK | MAX_CHECK, sb->s_log_block_size, - (EXT2_MAX_CLUSTER_LOG_SIZE - - EXT2_MIN_CLUSTER_LOG_SIZE)); - check_super_value(ctx, "clusters_per_group", sb->s_clusters_per_group, - MIN_CHECK | MAX_CHECK, 8, cpg_max); - check_super_value(ctx, "blocks_per_group", sb->s_blocks_per_group, - MIN_CHECK | MAX_CHECK, 8, bpg_max); - check_super_value(ctx, "inodes_per_group", sb->s_inodes_per_group, - MIN_CHECK | MAX_CHECK, inodes_per_block, ipg_max); - check_super_value(ctx, "r_blocks_count", ext2fs_r_blocks_count(sb), - MAX_CHECK, 0, ext2fs_blocks_count(sb) / 2); - check_super_value(ctx, "reserved_gdt_blocks", - sb->s_reserved_gdt_blocks, MAX_CHECK, 0, - fs->blocksize / sizeof(__u32)); - check_super_value(ctx, "desc_size", - sb->s_desc_size, MAX_CHECK | LOG2_CHECK, 0, - EXT2_MAX_DESC_SIZE); + if (!check_super_value(ctx, "inodes_count", sb->s_inodes_count, + MIN_CHECK, 1, 0)) + return; + if (!check_super_value64(ctx, "blocks_count", ext2fs_blocks_count(sb), + MIN_CHECK | MAX_CHECK, 1, blks_max)) + return; + if (!check_super_value(ctx, "first_data_block", sb->s_first_data_block, + MAX_CHECK, 0, ext2fs_blocks_count(sb))) + return; + if (!check_super_value(ctx, "log_block_size", sb->s_log_block_size, + MIN_CHECK | MAX_CHECK, 0, + EXT2_MAX_BLOCK_LOG_SIZE - EXT2_MIN_BLOCK_LOG_SIZE)) + return; + if (!check_super_value(ctx, "log_cluster_size", + sb->s_log_cluster_size, + MIN_CHECK | MAX_CHECK, sb->s_log_block_size, + (EXT2_MAX_CLUSTER_LOG_SIZE - + EXT2_MIN_CLUSTER_LOG_SIZE))) + return; + if (!check_super_value(ctx, "clusters_per_group", + sb->s_clusters_per_group, + MIN_CHECK | MAX_CHECK, 8, cpg_max)) + return; + if (!check_super_value(ctx, "blocks_per_group", sb->s_blocks_per_group, + MIN_CHECK | MAX_CHECK, 8, bpg_max)) + return; + if (!check_super_value(ctx, "inodes_per_group", sb->s_inodes_per_group, + MIN_CHECK | MAX_CHECK, inodes_per_block, ipg_max)) + return; + if (!check_super_value(ctx, "r_blocks_count", ext2fs_r_blocks_count(sb), + MAX_CHECK, 0, ext2fs_blocks_count(sb) / 2)) + return; + if (!check_super_value(ctx, "reserved_gdt_blocks", + sb->s_reserved_gdt_blocks, MAX_CHECK, 0, + fs->blocksize / sizeof(__u32))) + return; + if (!check_super_value(ctx, "desc_size", + sb->s_desc_size, MAX_CHECK | LOG2_CHECK, 0, + EXT2_MAX_DESC_SIZE)) + return; should_be = (__u64)sb->s_inodes_per_group * fs->group_desc_count; if (should_be > ~0U) { @@ -662,20 +678,22 @@ void check_super_block(e2fsck_t ctx) ext2fs_mark_super_dirty(fs); } } - if (sb->s_rev_level > EXT2_GOOD_OLD_REV) - check_super_value(ctx, "first_ino", sb->s_first_ino, - MIN_CHECK | MAX_CHECK, - EXT2_GOOD_OLD_FIRST_INO, sb->s_inodes_count); + if (sb->s_rev_level > EXT2_GOOD_OLD_REV && + !check_super_value(ctx, "first_ino", sb->s_first_ino, + MIN_CHECK | MAX_CHECK, + EXT2_GOOD_OLD_FIRST_INO, sb->s_inodes_count)) + return; inode_size = EXT2_INODE_SIZE(sb); - check_super_value(ctx, "inode_size", - inode_size, MIN_CHECK | MAX_CHECK | LOG2_CHECK, - EXT2_GOOD_OLD_INODE_SIZE, fs->blocksize); + if (!check_super_value(ctx, "inode_size", + inode_size, MIN_CHECK | MAX_CHECK | LOG2_CHECK, + EXT2_GOOD_OLD_INODE_SIZE, fs->blocksize)) + return; if (sb->s_blocks_per_group != (sb->s_clusters_per_group * EXT2FS_CLUSTER_RATIO(fs))) { pctx.num = sb->s_clusters_per_group * EXT2FS_CLUSTER_RATIO(fs); pctx.str = "block_size"; fix_problem(ctx, PR_0_MISC_CORRUPT_SUPER, &pctx); - ctx->flags |= E2F_FLAG_ABORT; /* never get here! */ + ctx->flags |= E2F_FLAG_ABORT; return; }