From 5e91614349797fc51c8fbd3b8abbf22c5360baec Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Thu, 14 Apr 2005 17:10:14 -0400 Subject: [PATCH] Don't offer to update or clone the resize inode when e2fsck deals with multiply claimed blocks. --- TODO | 6 ++++++ e2fsck/ChangeLog | 3 +++ e2fsck/pass1b.c | 2 +- tests/ChangeLog | 4 ++++ tests/f_dup_resize/expect.1 | 33 +++++++++++++++++++++++++++++++++ tests/f_dup_resize/expect.2 | 7 +++++++ tests/f_dup_resize/name | 1 + tests/f_dup_resize/script | 18 ++++++++++++++++++ 8 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 tests/f_dup_resize/expect.1 create mode 100644 tests/f_dup_resize/expect.2 create mode 100644 tests/f_dup_resize/name create mode 100644 tests/f_dup_resize/script diff --git a/TODO b/TODO index a6d4792..0707750 100644 --- a/TODO +++ b/TODO @@ -276,3 +276,9 @@ cleanliness. (I will probably have to do this myself -- Ted) extent maps first/in parallel. Difficulty: High Priority: Medium + +---------------------------------- + +Need to deal with the case where the resize inode overlaps with the +bad blocks inode. + diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 7317628..75979ec 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,5 +1,8 @@ 2005-04-14 Theodore Ts'o + * pass1b.c (pass1d): Don't offer to clone or delete the resize + inode; it's not allowed! + * e2fsck.c, e2fsck.h, journal.c, pass1.c, pass1b.c, pass2.c, pass3.c, pass4.c, super.c, unix.c: Use a centrally stored current time for "now" which can be overridden using the diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c index 733c027..23a54d8 100644 --- a/e2fsck/pass1b.c +++ b/e2fsck/pass1b.c @@ -432,7 +432,7 @@ static void pass1d(e2fsck_t ctx, char *block_buf) shared_len = 0; file_ok = 1; ino = (ext2_ino_t)VOIDPTR_TO_INT(dnode_getkey(n)); - if (ino == EXT2_BAD_INO) + if (ino == EXT2_BAD_INO || ino == EXT2_RESIZE_INO) continue; /* diff --git a/tests/ChangeLog b/tests/ChangeLog index fad3aa3..a1819f1 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,7 @@ +2005-04-14 Theodore Ts'o + + * f_dup_resize: New test case + 2005-04-09 Theodore Ts'o * test_script.in: Make the test script driver exit with a non-zero diff --git a/tests/f_dup_resize/expect.1 b/tests/f_dup_resize/expect.1 new file mode 100644 index 0000000..2fa92a7 --- /dev/null +++ b/tests/f_dup_resize/expect.1 @@ -0,0 +1,33 @@ +Resize inode not valid. Recreate? yes + +Pass 1: Checking inodes, blocks, and sizes +Duplicate blocks found... invoking duplicate block passes. +Pass 1B: Rescan for duplicate/bad blocks +Duplicate/bad block(s) in inode 7: 4 5 6 7 +Duplicate/bad block(s) in inode 12: 4 5 6 7 +Pass 1C: Scan directories for inodes with dup blocks. +Pass 1D: Reconciling duplicate blocks +(There are 1 inodes containing duplicate/bad blocks.) + +File /debugfs (inode #12, mod time Mon Apr 11 00:00:00 2005) + has 4 duplicate block(s), shared with 1 file(s): + (inode #7, mod time Mon Apr 11 06:13:20 2005) +Clone duplicate/bad blocks? yes + +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Block bitmap differences: +(8195--8198) +Fix? yes + +Free blocks count wrong for group #0 (7910, counted=7911). +Fix? yes + +Free blocks count wrong (9754, counted=9755). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 12/2560 files (8.3% non-contiguous), 485/10240 blocks +Exit status is 1 diff --git a/tests/f_dup_resize/expect.2 b/tests/f_dup_resize/expect.2 new file mode 100644 index 0000000..ed116f4 --- /dev/null +++ b/tests/f_dup_resize/expect.2 @@ -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: 12/2560 files (16.7% non-contiguous), 485/10240 blocks +Exit status is 0 diff --git a/tests/f_dup_resize/name b/tests/f_dup_resize/name new file mode 100644 index 0000000..6c5befa --- /dev/null +++ b/tests/f_dup_resize/name @@ -0,0 +1 @@ +blocks claimed by the resize inode and another inode diff --git a/tests/f_dup_resize/script b/tests/f_dup_resize/script new file mode 100644 index 0000000..969761a --- /dev/null +++ b/tests/f_dup_resize/script @@ -0,0 +1,18 @@ +SKIP_GUNZIP="true" + +touch $TMPFILE +mke2fs -F -O resize_inode $TMPFILE 10240 > /dev/null 2>&1 +debugfs -w $TMPFILE << "EOF" > /dev/null 2>&1 +freeb 4 4 +freeb 8195 4 +write /sbin/debugfs debugfs +set_inode_field debugfs mtime 200504110000 +q +EOF + +E2FSCK_TIME=1113200000 +export E2FSCK_TIME + +. $cmd_dir/run_e2fsck + +unset E2FSCK_TIME -- 1.8.3.1