From: Eric Sandeen <sandeen@redhat.com>
To: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: Justin Maggard <jmaggard10@gmail.com>,
ext4 development <linux-ext4@vger.kernel.org>
Subject: Re: Broken e2fsck i_blocks repair
Date: Wed, 01 Sep 2010 19:08:43 -0500 [thread overview]
Message-ID: <4C7EEB0B.9000202@redhat.com> (raw)
In-Reply-To: <3B2F6F16-EAC2-435B-89C9-BDB9931541DF@dilger.ca>
Andreas Dilger wrote:
> On 2010-09-01, at 16:01, Justin Maggard wrote:
>> I've mentioned this before on here, but I never verified whether or
>> not it was actually broken. I have done so today. I manually
>> modified the block count of a 3TB file using debugfs, then ran e2fsck
>> on it. e2fsck claimed to repair it, but would throw an error on every
>> subsequent e2fsck run for the same issue. The reason is
>> inode->osd2.linux2.l_i_blocks_hi is always set to 0 if e2fsck is told
>> to fix it. This is an issue in both stable 1.41.12, and in master.
>> This patch fixes it for me, but is there anything else that needs to
>> get checked here?
>
> It probably makes sense to audit all uses of "i_blocks" to see if
> they behave similarly badly w.r.t. l_i_blocks_hi. A casual glance
> indicates that there are a number of places that are similarly
> broken.
>
> I see there is a helper function
> e2fsck/blknum.c:ext2fs_inode_i_blocks() that should be used for most
> i_blocks accesses (excluding those places in e2fsck that check for
> l_i_blocks_hi being non-zero without the appropriate feature flag
> being set). It might make sense to rename this function
> ext2fs_inode_i_blocks_get() and add similar
> ext2fs_inode_i_blocks_set() routine to set it correctly.
maybe another thing to try to make opaque to make mistakes
impossible...?
-Eric
>
>> diff -urp e2fsprogs-1.41.12/e2fsck/pass1.c e2fsprogs-1.41.12-jm/e2fsck/pass1.c
>> --- e2fsprogs-1.41.12/e2fsck/pass1.c 2010-05-14 14:51:21.000000000 -0700
>> +++ e2fsprogs-1.41.12-jm/e2fsck/pass1.c 2010-09-01 15:54:42.000000000 -0700
>> @@ -2044,7 +2044,7 @@ static void check_blocks(e2fsck_t ctx, s
>> pctx->num = pb.num_blocks;
>> if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
>> inode->i_blocks = pb.num_blocks;
>> - inode->osd2.linux2.l_i_blocks_hi = 0;
>> + inode->osd2.linux2.l_i_blocks_hi = (pb.num_blocks >> 32);
>> dirty_inode++;
>> }
>> pctx->num = 0;
>>
>> -Justin
>> --
>> 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
>
>
> Cheers, Andreas
>
>
>
>
>
> --
> 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
next prev parent reply other threads:[~2010-09-02 0:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-01 23:01 Broken e2fsck i_blocks repair Justin Maggard
2010-09-01 23:49 ` Andreas Dilger
2010-09-02 0:08 ` Eric Sandeen [this message]
2010-09-25 12:24 ` Ted Ts'o
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C7EEB0B.9000202@redhat.com \
--to=sandeen@redhat.com \
--cc=adilger.kernel@dilger.ca \
--cc=jmaggard10@gmail.com \
--cc=linux-ext4@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.