e2fsck: Check for cases where EOFBLOCKS_FL is unnecessarily set

Some kernels will crash if EOFBLOCKS_FL is set when it is it not
needed, and this if it is left set when it isn't needed, it is a sign
of a kernel bug.

Addresses-Google-Bug: #2604224

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2010-05-10 10:17:44 -04:00
parent bc11f0dacc
commit 2291fbb035
4 changed files with 30 additions and 0 deletions

View File

@ -2000,6 +2000,19 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
/* too big for an extent-based file - 32bit ee_block */
bad_size = 6;
/*
* Check to see if the EOFBLOCKS flag is set where it
* doesn't need to be.
*/
if ((inode->i_flags & EXT4_EOFBLOCKS_FL) &&
(size <= (((__u64)pb.last_block + 1) * fs->blocksize))) {
pctx->blkcount = pb.last_block;
if (fix_problem(ctx, PR_1_EOFBLOCKS_FL_SET, pctx)) {
inode->i_flags &= ~EXT4_EOFBLOCKS_FL;
dirty_inode++;
}
}
}
/* i_size for symlinks is checked elsewhere */
if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {

View File

@ -885,6 +885,11 @@ static struct e2fsck_problem problem_table[] = {
N_("@i %i has an invalid extent node (blk %b, lblk %c)\n"),
PROMPT_CLEAR, 0 },
{ PR_1_EOFBLOCKS_FL_SET,
N_("@i %i should not have EOFBLOCKS_FL set "
"(size %Is, lblk %r)\n"),
PROMPT_CLEAR, PR_PREEN_OK },
/* Pass 1b errors */
/* Pass 1B: Rescan for duplicate/bad blocks */

View File

@ -517,6 +517,9 @@ struct problem_context {
/* Extent node header invalid */
#define PR_1_EXTENT_HEADER_INVALID 0x01005F
/* EOFBLOCKS flag set when not necessary */
#define PR_1_EOFBLOCKS_FL_SET 0x010060
/*
* Pass 1b errors
*/

View File

@ -2,12 +2,21 @@ Pass 1: Checking inodes, blocks, and sizes
Inode 1 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
Inode 9 should not have EOFBLOCKS_FL set (size 0, lblk -1)
Clear? yes
Inode 10 should not have EOFBLOCKS_FL set (size 0, lblk -1)
Clear? yes
Inode 15 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
Inode 16 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
Inode 13 should not have EOFBLOCKS_FL set (size 0, lblk -1)
Clear? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
/lost+found not found. Create? yes