From patchwork Fri Jun 29 02:35:56 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zheng Liu X-Patchwork-Id: 167979 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 6F8ADB700D for ; Fri, 29 Jun 2012 12:28:03 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754848Ab2F2C2B (ORCPT ); Thu, 28 Jun 2012 22:28:01 -0400 Received: from mail-pz0-f46.google.com ([209.85.210.46]:62680 "EHLO mail-pz0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754272Ab2F2C2A (ORCPT ); Thu, 28 Jun 2012 22:28:00 -0400 Received: by dady13 with SMTP id y13so3700910dad.19 for ; Thu, 28 Jun 2012 19:28:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=E8qGf1OVS9MTVQJuVZXUja1LdjlUDMeoFuDio4MArD4=; b=zGi4dcU4gDncfqScVRczKabWXKavmtAlbdE/e2shgkDSjB1L3VeQUhvqjTVm9gDGu8 TnOpx+F5S5Uhgk2z32rSukUdUyZQFbNx73E5/C3oFfDOSYUYmMFFHToAcqs7SOCDPAUZ vglO3BtQvoVcoiqkf2O7OsUCMJhH5FdkOP9noxqQ7R5GHbUcpGMKPTw4Fm5ZAjrHhN6O PfT1Xt38bfAt8/ig8WQRaQ3xtW9gNNkjUdJccrghSOsFoE0KGGePNQDdLg2iv5OzN4g8 9AgOBPrcJ4yBm7u0OzklQjO8Tp+FPsxC5dGz7vU/ncHmxQjWZpt2V0eT33HNlooQs9FO r9TQ== Received: by 10.68.203.73 with SMTP id ko9mr1474885pbc.66.1340936879942; Thu, 28 Jun 2012 19:27:59 -0700 (PDT) Received: from localhost.localdomain ([182.92.247.2]) by mx.google.com with ESMTPS id ku7sm3900102pbc.31.2012.06.28.19.27.57 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 28 Jun 2012 19:27:59 -0700 (PDT) From: Zheng Liu To: linux-ext4@vger.kernel.org Cc: "Darrick J. Wong" , "Theodore Ts'o" , Zheng Liu Subject: [PATCH] e2fsck: delay metadata checksum in pass1 Date: Fri, 29 Jun 2012 10:35:56 +0800 Message-Id: <1340937356-12493-1-git-send-email-wenqing.lz@taobao.com> X-Mailer: git-send-email 1.7.4.1 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org From: Zheng Liu in __ext4_get_inode_loc, when all other inodes are free, we will skip I/O. Thus, all of inodes in this block are set to 0. Then when we scan these inodes in pass1, we will get a metadata checksum error. However, we don't need to scan these inodes because they have been freed. This bug can be reproduced by xfstests #013. Reported-by: Tao Ma Cc: Darrick J. Wong Cc: "Theodore Ts'o" Signed-off-by: Zheng Liu --- e2fsck/pass1.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 48a1af0..72f8e82 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -583,6 +583,7 @@ void e2fsck_pass1(e2fsck_t ctx) ext2_ino_t ino = 0; struct ext2_inode *inode; ext2_inode_scan scan; + errcode_t csum_errcode; char *block_buf; #ifdef RESOURCE_TRACK struct resource_track rtrack; @@ -788,12 +789,7 @@ void e2fsck_pass1(e2fsck_t ctx) pctx.inode = inode; ctx->stashed_ino = ino; - /* Clear corrupt inode? */ - if (pctx.errcode == EXT2_ET_INODE_CSUM_INVALID) { - if (fix_problem(ctx, PR_1_INODE_CSUM_INVALID, &pctx)) - goto clear_inode; - failed_csum = 1; - } + csum_errcode = pctx.errcode; if (inode->i_links_count) { pctx.errcode = ext2fs_icount_store(ctx->inode_link_info, @@ -1063,6 +1059,14 @@ void e2fsck_pass1(e2fsck_t ctx) } continue; } + + /* Clear corrupt inode? */ + if (csum_errcode == EXT2_ET_INODE_CSUM_INVALID) { + if (fix_problem(ctx, PR_1_INODE_CSUM_INVALID, &pctx)) + goto clear_inode; + failed_csum = 1; + } + /* * n.b. 0.3c ext2fs code didn't clear i_links_count for * deleted files. Oops.