Whamcloud - gitweb
e2fsck: fix e2fsck -fD directory truncation
authorAndreas Dilger <andreas.dilger@intel.com>
Mon, 30 Nov 2015 20:26:35 +0000 (15:26 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 30 Nov 2015 20:26:35 +0000 (15:26 -0500)
commit19961cd0003564c63c33ec14e69dfec6d81a2238
treec5cbeaffca77073a049e41432f6c17d26f33158d
parente158db537754ae1ffb3ec6184051bd1a4226937a
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 maybe 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.

Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
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