From patchwork Thu Oct 31 21:01:00 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Dilger X-Patchwork-Id: 287619 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 8A0622C03F2 for ; Fri, 1 Nov 2013 08:10:48 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753777Ab3JaVKp (ORCPT ); Thu, 31 Oct 2013 17:10:45 -0400 Received: from smtp-out-03.shaw.ca ([64.59.136.139]:34393 "EHLO smtp-out-02.shaw.ca" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752693Ab3JaVKp (ORCPT ); Thu, 31 Oct 2013 17:10:45 -0400 X-Greylist: delayed 581 seconds by postgrey-1.27 at vger.kernel.org; Thu, 31 Oct 2013 17:10:45 EDT X-Cloudmark-SP-Filtered: true X-Cloudmark-SP-Result: v=1.1 cv=ryrf5q5p6c4dCQYR2lAej91p2ozDt6sfPnRAuS/Q8hc= c=1 sm=1 a=Uu0qCeBZ9RUA:10 a=BLceEmwcHowA:10 a=sQcIUxX0G8DGr1HsvJ29bQ==:17 a=MOgk78zF1bMkf3KKSToA:9 a=HpAAvcLHHh0Zw7uRqdWCyQ==:117 Received: from unknown (HELO sookie-gig.adilger.int) ([96.51.76.157]) by smtp-out-02.shaw.ca with ESMTP; 31 Oct 2013 15:01:02 -0600 From: Andreas Dilger To: tytso@mit.edu Cc: linux-ext4@vger.kernel.org, Andreas Dilger Subject: [PATCH] mmp: fix 64-bit handling of s_mmp_block Date: Thu, 31 Oct 2013 15:01:00 -0600 Message-Id: <1383253260-22873-1-git-send-email-adilger@dilger.ca> X-Mailer: git-send-email 1.7.3.4 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Fix the checking of s_mmp_block in e2fsck_pass1() and ext2fs_mmp_read() to handle the high 32 bits of s_blocks_count. Remove redundant check of s_mmp_block in do_dump_mmp() right before ext2fs_mmp_read() is called. Also fix s_blocks_count_hi in check_backup_super_block(), since it cannot use the ext2fs_blocks_count() helper easily. Signed-off-by: Andreas Dilger --- debugfs/debugfs.c | 7 +------ e2fsck/pass1.c | 4 ++-- e2fsck/super.c | 1 + lib/ext2fs/mmp.c | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c index 5590295..5502570 100644 --- a/debugfs/debugfs.c +++ b/debugfs/debugfs.c @@ -2311,12 +2311,7 @@ void do_dump_mmp(int argc EXT2FS_ATTR((unused)), char *argv[]) if (check_fs_open(argv[0])) return; - sb = current_fs->super; - if (sb->s_mmp_block <= sb->s_first_data_block || - sb->s_mmp_block >= ext2fs_blocks_count(sb)) { - com_err(argv[0], EXT2_ET_MMP_BAD_BLOCK, "while dumping it.\n"); - return; - } + sb = current_fs->super; if (current_fs->mmp_buf == NULL) { retval = ext2fs_get_mem(current_fs->blocksize, diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 311706e..13028b2 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -716,8 +716,8 @@ void e2fsck_pass1(e2fsck_t ctx) busted_fs_time = 1; if ((fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_MMP) && - !(fs->super->s_mmp_block <= fs->super->s_first_data_block || - fs->super->s_mmp_block >= fs->super->s_blocks_count)) + fs->super->s_mmp_block > fs->super->s_first_data_block && + fs->super->s_mmp_block < ext2fs_blocks_count(fs->super)) ext2fs_mark_block_bitmap2(ctx->block_found_map, fs->super->s_mmp_block); diff --git a/e2fsck/super.c b/e2fsck/super.c index 352f16d..db3e63a 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -956,6 +956,7 @@ int check_backup_super_block(e2fsck_t ctx) SUPER_INCOMPAT_DIFFERENT(s_feature_incompat) || SUPER_RO_COMPAT_DIFFERENT(s_feature_ro_compat) || SUPER_DIFFERENT(s_blocks_count) || + SUPER_DIFFERENT(s_blocks_count_hi) || SUPER_DIFFERENT(s_inodes_count) || memcmp(fs->super->s_uuid, backup_sb->s_uuid, sizeof(fs->super->s_uuid))) diff --git a/lib/ext2fs/mmp.c b/lib/ext2fs/mmp.c index 98562e7..fb266d1 100644 --- a/lib/ext2fs/mmp.c +++ b/lib/ext2fs/mmp.c @@ -37,7 +37,7 @@ errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf) errcode_t retval = 0; if ((mmp_blk <= fs->super->s_first_data_block) || - (mmp_blk >= fs->super->s_blocks_count)) + (mmp_blk >= ext2fs_blocks_count(fs->super))) return EXT2_ET_MMP_BAD_BLOCK; /* ext2fs_open() reserves fd0,1,2 to avoid stdio collision, so checking