From patchwork Tue Mar 13 00:33:34 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 146305 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 88F2DB6FA7 for ; Tue, 13 Mar 2012 11:34:26 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932151Ab2CMAeL (ORCPT ); Mon, 12 Mar 2012 20:34:11 -0400 Received: from e34.co.us.ibm.com ([32.97.110.152]:59268 "EHLO e34.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965132Ab2CMAdn (ORCPT ); Mon, 12 Mar 2012 20:33:43 -0400 Received: from /spool/local by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 12 Mar 2012 18:33:42 -0600 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e34.co.us.ibm.com (192.168.1.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 12 Mar 2012 18:33:40 -0600 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id DDEA11FF0038 for ; Mon, 12 Mar 2012 18:33:39 -0600 (MDT) Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q2D0XcET131916 for ; Mon, 12 Mar 2012 18:33:38 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q2D0XZ5R028393 for ; Mon, 12 Mar 2012 18:33:38 -0600 Received: from tux1.beaverton.ibm.com (elm3b50.beaverton.ibm.com [9.47.67.50]) by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q2D0XYFu028295; Mon, 12 Mar 2012 18:33:34 -0600 Received: by tux1.beaverton.ibm.com (Postfix, from userid 501) id 7883413E829; Mon, 12 Mar 2012 17:33:34 -0700 (PDT) Date: Mon, 12 Mar 2012 17:33:34 -0700 From: "Darrick J. Wong" To: Andreas Dilger , Theodore Tso Cc: Sunil Mushran , Amir Goldstein , Andi Kleen , Mingming Cao , Joel Becker , linux-ext4@vger.kernel.org, Coly Li Subject: [PATCH v3.1 16/54] e2fsck: Verify block bitmap checksum Message-ID: <20120313003334.GS15164@tux1.beaverton.ibm.com> Reply-To: djwong@us.ibm.com References: <20120306235720.11945.30629.stgit@elm3b70.beaverton.ibm.com> <20120306235904.11945.97460.stgit@elm3b70.beaverton.ibm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20120306235904.11945.97460.stgit@elm3b70.beaverton.ibm.com> User-Agent: Mutt/1.5.17+20080114 (2008-01-14) X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12031300-1780-0000-0000-000003EA6824 X-IBM-ISS-SpamDetectors: X-IBM-ISS-DetailInfo: BY=3.00000256; HX=3.00000185; KW=3.00000007; PH=3.00000001; SC=3.00000001; SDB=6.00121506; UDB=6.00029288; UTC=2012-03-13 00:33:41 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Check block bitmap checksum and write a new checksum if the verification fails. This is ok because e2fsck has already computed the correct block bitmap. Signed-off-by: Darrick J. Wong --- e2fsck/pass5.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ e2fsck/problem.c | 5 ++++ e2fsck/problem.h | 3 +++ 3 files changed, 71 insertions(+), 0 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/e2fsck/pass5.c b/e2fsck/pass5.c index bfcf384..64a751d 100644 --- a/e2fsck/pass5.c +++ b/e2fsck/pass5.c @@ -28,6 +28,7 @@ static void check_inode_bitmaps(e2fsck_t ctx); static void check_inode_end(e2fsck_t ctx); static void check_block_end(e2fsck_t ctx); static void check_inode_bitmap_checksum(e2fsck_t ctx); +static void check_block_bitmap_checksum(e2fsck_t ctx); void e2fsck_pass5(e2fsck_t ctx) { @@ -66,6 +67,7 @@ void e2fsck_pass5(e2fsck_t ctx) return; check_inode_bitmap_checksum(ctx); + check_block_bitmap_checksum(ctx); ext2fs_free_inode_bitmap(ctx->inode_used_map); ctx->inode_used_map = 0; @@ -136,6 +138,67 @@ static void check_inode_bitmap_checksum(e2fsck_t ctx) ext2fs_free_mem(&buf); } +static void check_block_bitmap_checksum(e2fsck_t ctx) +{ + struct problem_context pctx; + struct ext4_group_desc *gdp; + char *buf; + dgrp_t i; + int nbytes; + blk64_t blk_itr; + errcode_t retval; + + if (!EXT2_HAS_RO_COMPAT_FEATURE(ctx->fs->super, + EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) + return; + + /* If bitmap is dirty from being fixed, checksum will be corrected */ + if (ext2fs_test_bb_dirty(ctx->fs)) + return; + + nbytes = (size_t)(EXT2_CLUSTERS_PER_GROUP(ctx->fs->super) / 8); + retval = ext2fs_get_memalign(ctx->fs->blocksize, ctx->fs->blocksize, + &buf); + if (retval) { + com_err(ctx->program_name, 0, + _("check_block_bitmap_checksum: Memory allocation error")); + fatal_error(ctx, 0); + } + + clear_problem_context(&pctx); + for (i = 0; i < ctx->fs->group_desc_count; i++) { + if (ext2fs_bg_flags_test(ctx->fs, i, EXT2_BG_BLOCK_UNINIT)) + continue; + + blk_itr = EXT2FS_B2C(ctx->fs, + ctx->fs->super->s_first_data_block) + + (i * (nbytes << 3)); + gdp = (struct ext4_group_desc *)ext2fs_group_desc(ctx->fs, + ctx->fs->group_desc, i); + retval = ext2fs_get_block_bitmap_range2(ctx->fs->block_map, + blk_itr, nbytes << 3, + buf); + if (retval) + break; + + if (ext2fs_block_bitmap_csum_verify(ctx->fs, i, buf, nbytes)) + continue; + pctx.group = i; + if (!fix_problem(ctx, PR_5_BLOCK_BITMAP_CSUM_INVALID, &pctx)) + continue; + + /* + * Fixing one checksum will rewrite all of them. The bitmap + * will be checked against the one we made during pass1 for + * discrepancies, and fixed if need be. + */ + ext2fs_mark_bb_dirty(ctx->fs); + break; + } + + ext2fs_free_mem(&buf); +} + static void e2fsck_discard_blocks(e2fsck_t ctx, io_manager manager, blk64_t start, blk64_t count) { diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 79ad34d..8476bc2 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -1689,6 +1689,11 @@ static struct e2fsck_problem problem_table[] = { N_("@g %g @i bitmap does not match checksum\n"), PROMPT_FIX, PR_LATCH_IBITMAP | PR_PREEN_OK }, + /* Group N block bitmap does not match checksum */ + { PR_5_BLOCK_BITMAP_CSUM_INVALID, + N_("@g %g @b bitmap does not match checksum\n"), + PROMPT_FIX, PR_LATCH_BBITMAP | PR_PREEN_OK }, + /* Post-Pass 5 errors */ /* Recreate journal if E2F_FLAG_JOURNAL_INODE flag is set */ diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 0adc7ea..39e6dba 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -1022,6 +1022,9 @@ struct problem_context { /* Inode bitmap checksum does not match */ #define PR_5_INODE_BITMAP_CSUM_INVALID 0x05001A +/* Block bitmap checksum does not match */ +#define PR_5_BLOCK_BITMAP_CSUM_INVALID 0x05001B + /* * Post-Pass 5 errors */