mirror of https://github.com/vitalif/e2fsprogs
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
parent
bc11f0dacc
commit
2291fbb035
|
@ -2000,6 +2000,19 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
|
||||||
((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
|
((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
|
||||||
/* too big for an extent-based file - 32bit ee_block */
|
/* too big for an extent-based file - 32bit ee_block */
|
||||||
bad_size = 6;
|
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 */
|
/* i_size for symlinks is checked elsewhere */
|
||||||
if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
|
if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
|
||||||
|
|
|
@ -885,6 +885,11 @@ static struct e2fsck_problem problem_table[] = {
|
||||||
N_("@i %i has an invalid extent node (blk %b, lblk %c)\n"),
|
N_("@i %i has an invalid extent node (blk %b, lblk %c)\n"),
|
||||||
PROMPT_CLEAR, 0 },
|
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 errors */
|
||||||
|
|
||||||
/* Pass 1B: Rescan for duplicate/bad blocks */
|
/* Pass 1B: Rescan for duplicate/bad blocks */
|
||||||
|
|
|
@ -517,6 +517,9 @@ struct problem_context {
|
||||||
/* Extent node header invalid */
|
/* Extent node header invalid */
|
||||||
#define PR_1_EXTENT_HEADER_INVALID 0x01005F
|
#define PR_1_EXTENT_HEADER_INVALID 0x01005F
|
||||||
|
|
||||||
|
/* EOFBLOCKS flag set when not necessary */
|
||||||
|
#define PR_1_EOFBLOCKS_FL_SET 0x010060
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Pass 1b errors
|
* Pass 1b errors
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,12 +2,21 @@ Pass 1: Checking inodes, blocks, and sizes
|
||||||
Inode 1 has EXTENTS_FL flag set on filesystem without extents support.
|
Inode 1 has EXTENTS_FL flag set on filesystem without extents support.
|
||||||
Clear? yes
|
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.
|
Inode 15 has EXTENTS_FL flag set on filesystem without extents support.
|
||||||
Clear? yes
|
Clear? yes
|
||||||
|
|
||||||
Inode 16 has EXTENTS_FL flag set on filesystem without extents support.
|
Inode 16 has EXTENTS_FL flag set on filesystem without extents support.
|
||||||
Clear? yes
|
Clear? yes
|
||||||
|
|
||||||
|
Inode 13 should not have EOFBLOCKS_FL set (size 0, lblk -1)
|
||||||
|
Clear? yes
|
||||||
|
|
||||||
Pass 2: Checking directory structure
|
Pass 2: Checking directory structure
|
||||||
Pass 3: Checking directory connectivity
|
Pass 3: Checking directory connectivity
|
||||||
/lost+found not found. Create? yes
|
/lost+found not found. Create? yes
|
||||||
|
|
Loading…
Reference in New Issue