Re: [PATCH 10/10] e2fsck: Report only one sb corruption

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On May 30, 2018, at 6:51 AM, Jan Kara <jack@xxxxxxx> wrote:
> 
> 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.
> 
> Signed-off-by: Jan Kara <jack@xxxxxxx>

Reviewed-by: Andreas Dilger <adilger@xxxxxxxxx>

> ---
> e2fsck/super.c | 98 ++++++++++++++++++++++++++++++++++------------------------
> 1 file changed, 58 insertions(+), 40 deletions(-)
> 
> diff --git a/e2fsck/super.c b/e2fsck/super.c
> index 00872b5ce5dc..26e531d5a13c 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 = (blk64_t)sb->s_inodes_per_group * fs->group_desc_count;
> 	if (should_be > UINT_MAX) {
> @@ -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;
> 	}
> 
> --
> 2.13.6
> 


Cheers, Andreas





Attachment: signature.asc
Description: Message signed with OpenPGP


[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux