Whamcloud - gitweb
LU-7381 e2fsck: fix e2fsck -fD directory truncation 53/17153/5
authorAndreas Dilger <andreas.dilger@intel.com>
Fri, 13 Nov 2015 05:35:17 +0000 (22:35 -0700)
committerAndreas Dilger <andreas.dilger@intel.com>
Fri, 11 Dec 2015 08:34:51 +0000 (08:34 +0000)
commit7cb8130c79fa80b87c1406056221fc3151184862
tree59f231aa9fc47c350e84c6fcf7e1873ac0d93403
parent229a4739bd8d68192c669e13c411d57575cdc632
LU-7381 e2fsck: fix e2fsck -fD directory truncation

When an extent-mapped directory is compacted by "e2fsck -fD" and
frees enough leaf blocks that it loses an extent tree index block,
the old e2fsck_rehash_dir->ext2fs_block_iterate3->write_dir_block()
code would not free the extent block, which would result in the
extent tree becoming corrupted when it is written out.

    Pass 1: Checking inodes, blocks, and sizes
    Inode 17825800, end of extent exceeds allowed value
            (logical block 710, physical block 570459684, len 1019)

This results in loss of a whole index block of directory leaf blocks
and thousands or millions of files in lost+found.

Fix e2fsck_rehash_dir() to call ext2fs_punch() to free the blocks
at the end of the directory instead of trying to handle this itself
while writing out the directory.  That properly handles all of the
cases of updating the extent tree as well as accounting for blocks
that are released (both leaf blocks and index blocks).

Add a test case for compacting the directory to be smaller than the
index block that originally caused the corruption.

e2fsprogs-commit: 19961cd0003564c63c33ec14e69dfec6d81a2238
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Change-Id: I2e075849423693ebf4468fd7b0f41d6b2f500c1e
Reviewed-on: http://review.whamcloud.com/17153
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
e2fsck/rehash.c
tests/f_extent_htree/expect.1 [new file with mode: 0644]
tests/f_extent_htree/expect.2 [new file with mode: 0644]
tests/f_extent_htree/image.gz [new file with mode: 0644]
tests/f_extent_htree/name [new file with mode: 0644]
tests/f_extent_htree/script [new file with mode: 0644]
tests/f_h_badnode/expect.1
tests/f_h_badnode/expect.2