Fix edge case when i_size doesn't get fixed until second e2fsck run

Don't assume that a special device is bogus just because i_blocks is
non-zero.  The i_blocks field could get adjusted later, and if this
happens it will confuse the e2fsck_process_bad_inode() in pass 2.  In
practice true garbage inodes will have random non-zero in
i_blocks[4..15], so there's no point doing the check for an illegal
i_blocks value.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2007-03-31 18:56:09 -04:00
parent 971fe05630
commit 441ab1e020
2 changed files with 13 additions and 4 deletions

View File

@ -1,3 +1,13 @@
2007-03-31 Theodore Tso <tytso@mit.edu>
* pass1.c (e2fsck_pass1_check_device_inode): Don't assume that a
special device is bogus just because i_blocks is non-zero.
The i_blocks field could get adjusted later, and if this
happens it will confuse the e2fsck_process_bad_inode() in
pass 2. In practice true garbage inodes will have random
non-zero values in i_blocks[4..15], so there's no point
doing the check for an illegal i_blocks value.
2007-03-28 Theodore Tso <tytso@mit.edu>
* pass1.c (e2fsck_pass1, check_ext_attr),

View File

@ -133,11 +133,10 @@ int e2fsck_pass1_check_device_inode(ext2_filsys fs, struct ext2_inode *inode)
int i;
/*
* If i_blocks is non-zero, or the index flag is set, then
* this is a bogus device/fifo/socket
* If the index flag is set, then this is a bogus
* device/fifo/socket
*/
if ((ext2fs_inode_data_blocks(fs, inode) != 0) ||
(inode->i_flags & EXT2_INDEX_FL))
if (inode->i_flags & EXT2_INDEX_FL)
return 0;
/*