mirror of https://github.com/vitalif/e2fsprogs
e2fsck: pass1c terminates early if hard links
I think this is a small buglet in e2fsck: if a file has multiple hard links, e2fsck pass1c search_dirent_proc() doesn't maintain its count properly and may return DIRENT_ABORT before it has found containing directories for all inodes sharing blocks. Signed-off-by: Jim Garlick <garlick@llnl.gov> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>bitmap-optimize
parent
a4ea6b98f3
commit
3d51ff876e
|
@ -1,3 +1,11 @@
|
|||
2007-04-10 Jim Garlick <garlick@llnl.gov>
|
||||
|
||||
* pass1b.c (search_dirent_proc): if a file has multiple hard
|
||||
links, e2fsck pass1c search_dirent_proc() doesn't maintain
|
||||
its count properly and may return DIRENT_ABORT before it
|
||||
has found containing directories for all inodes sharing
|
||||
blocks.
|
||||
|
||||
2007-04-06 Theodore Tso <tytso@mit.edu>
|
||||
|
||||
* e2fsck.conf.5.in: Update man page to document the scratch_files
|
||||
|
|
|
@ -372,8 +372,10 @@ static int search_dirent_proc(ext2_ino_t dir, int entry,
|
|||
if (!n)
|
||||
return 0;
|
||||
p = (struct dup_inode *) dnode_get(n);
|
||||
p->dir = dir;
|
||||
sd->count--;
|
||||
if (!p->dir) {
|
||||
p->dir = dir;
|
||||
sd->count--;
|
||||
}
|
||||
|
||||
return(sd->count ? 0 : DIRENT_ABORT);
|
||||
}
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2007-04-10 Theodore Tso <tytso@mit.edu>
|
||||
|
||||
* f_dup4: New test cases which tests a bugfix in e2fsck where if an
|
||||
inode which has blocks claimed by other inodes has
|
||||
multiple hard links, e2fsck could fail to collect the
|
||||
directory information for all of the inodes with multiply
|
||||
claimed blocks.
|
||||
|
||||
2007-04-07 Theodore Tso <tytso@mit.edu>
|
||||
|
||||
* test_script.in: Skip completely empty directories
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
Pass 1: Checking inodes, blocks, and sizes
|
||||
|
||||
Running additional passes to resolve blocks claimed by more than one inode...
|
||||
Pass 1B: Rescanning for multiply-claimed blocks
|
||||
Multiply-claimed block(s) in inode 16: 30
|
||||
Multiply-claimed block(s) in inode 17: 30
|
||||
Multiply-claimed block(s) in inode 18: 30
|
||||
Multiply-claimed block(s) in inode 19: 30
|
||||
Multiply-claimed block(s) in inode 20: 34
|
||||
Multiply-claimed block(s) in inode 21: 34
|
||||
Multiply-claimed block(s) in inode 22: 34
|
||||
Multiply-claimed block(s) in inode 23: 34
|
||||
Pass 1C: Scanning directories for inodes with multiply-claimed blocks
|
||||
Pass 1D: Reconciling multiply-claimed blocks
|
||||
(There are 8 inodes containing multiply-claimed blocks.)
|
||||
|
||||
File /dir/foo (inode #16, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir/quux1 (inode #19, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir3/baz (inode #18, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/bar (inode #17, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir2/bar (inode #17, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir/quux1 (inode #19, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir3/baz (inode #18, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/foo (inode #16, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir3/baz (inode #18, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir/quux1 (inode #19, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/bar (inode #17, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/foo (inode #16, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir/quux1 (inode #19, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir3/baz (inode #18, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/bar (inode #17, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/foo (inode #16, mod time Tue Apr 10 21:00:00 2007)
|
||||
Multiply-claimed blocks already reassigned or cloned.
|
||||
|
||||
File /dir/fee (inode #20, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir4/fum (inode #23, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir3/foe (inode #22, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/fie (inode #21, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir2/fie (inode #21, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir4/fum (inode #23, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir3/foe (inode #22, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/fee (inode #20, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir3/foe (inode #22, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir4/fum (inode #23, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/fie (inode #21, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/fee (inode #20, mod time Tue Apr 10 21:00:00 2007)
|
||||
Clone multiply-claimed blocks? yes
|
||||
|
||||
File /dir4/fum (inode #23, mod time Tue Apr 10 21:00:00 2007)
|
||||
has 1 multiply-claimed block(s), shared with 3 file(s):
|
||||
/dir3/foe (inode #22, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir2/fie (inode #21, mod time Tue Apr 10 21:00:00 2007)
|
||||
/dir/fee (inode #20, mod time Tue Apr 10 21:00:00 2007)
|
||||
Multiply-claimed blocks already reassigned or cloned.
|
||||
|
||||
Pass 2: Checking directory structure
|
||||
Invalid inode number for '.' in directory inode 20.
|
||||
Fix? yes
|
||||
|
||||
Invalid inode number for '.' in directory inode 21.
|
||||
Fix? yes
|
||||
|
||||
Invalid inode number for '.' in directory inode 22.
|
||||
Fix? yes
|
||||
|
||||
Pass 3: Checking directory connectivity
|
||||
'..' in /dir/fee (20) is /dir4 (15), should be /dir (12).
|
||||
Fix? yes
|
||||
|
||||
'..' in /dir2/fie (21) is /dir4 (15), should be /dir2 (13).
|
||||
Fix? yes
|
||||
|
||||
'..' in /dir3/foe (22) is /dir4 (15), should be /dir3 (14).
|
||||
Fix? yes
|
||||
|
||||
Pass 4: Checking reference counts
|
||||
Inode 12 ref count is 4, should be 3. Fix? yes
|
||||
|
||||
Inode 13 ref count is 4, should be 3. Fix? yes
|
||||
|
||||
Inode 14 ref count is 4, should be 3. Fix? yes
|
||||
|
||||
Inode 15 ref count is 0, should be 3. Fix? yes
|
||||
|
||||
Inode 16 ref count is 1, should be 3. Fix? yes
|
||||
|
||||
Inode 17 ref count is 1, should be 2. Fix? yes
|
||||
|
||||
Inode 19 ref count is 1, should be 3. Fix? yes
|
||||
|
||||
Pass 5: Checking group summary information
|
||||
|
||||
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
|
||||
test_filesys: 23/32 files (0.0% non-contiguous), 35/100 blocks
|
||||
Exit status is 1
|
|
@ -0,0 +1,7 @@
|
|||
Pass 1: Checking inodes, blocks, and sizes
|
||||
Pass 2: Checking directory structure
|
||||
Pass 3: Checking directory connectivity
|
||||
Pass 4: Checking reference counts
|
||||
Pass 5: Checking group summary information
|
||||
test_filesys: 23/32 files (0.0% non-contiguous), 35/100 blocks
|
||||
Exit status is 0
|
|
@ -0,0 +1,2 @@
|
|||
find all directdory pathnames
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
SKIP_GUNZIP="true"
|
||||
TEST_DATA="test.data"
|
||||
|
||||
echo "/ Murphy Magic. The SeCrEt of the UnIvErSe is 43, NOT 42" > $TEST_DATA
|
||||
|
||||
touch $TMPFILE
|
||||
$MKE2FS -N 32 -F -o Linux -b 1024 $TMPFILE 100 > /dev/null 2>&1
|
||||
$DEBUGFS -w $TMPFILE << EOF > /dev/null 2>&1
|
||||
set_current_time 200704102100
|
||||
set_super_value lastcheck 0
|
||||
set_super_value hash_seed null
|
||||
set_super_value mkfs_time 0
|
||||
mkdir dir
|
||||
mkdir dir2
|
||||
mkdir dir3
|
||||
mkdir dir4
|
||||
cd /dir
|
||||
write $TEST_DATA foo
|
||||
cd /dir2
|
||||
write $TEST_DATA bar
|
||||
cd /dir3
|
||||
write $TEST_DATA baz
|
||||
cd /dir4
|
||||
write $TEST_DATA quux
|
||||
mkdir /dir/fee
|
||||
mkdir /dir2/fie
|
||||
mkdir /dir3/foe
|
||||
mkdir /dir4/fum
|
||||
link /dir/foo /dir2/foo1
|
||||
link /dir/foo /dir3/foo2
|
||||
link /dir2/bar /dir3/bar1
|
||||
link /dir4/quux /dir/quux1
|
||||
link /dir4/quux /dir2/quux2
|
||||
set_inode_field /dir/foo block[0] 30
|
||||
set_inode_field /dir2/bar block[0] 30
|
||||
set_inode_field /dir3/baz block[0] 30
|
||||
set_inode_field /dir/fee block[0] 34
|
||||
set_inode_field /dir2/fie block[0] 34
|
||||
set_inode_field /dir3/foe block[0] 34
|
||||
q
|
||||
EOF
|
||||
|
||||
E2FSCK_TIME=200704102100
|
||||
export E2FSCK_TIME
|
||||
|
||||
. $cmd_dir/run_e2fsck
|
||||
|
||||
rm -f $TEST_DATA
|
||||
|
||||
unset E2FSCK_TIME TEST_DATA
|
Loading…
Reference in New Issue