e2fsprogs/e2fsck
Andreas Dilger 19961cd000 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>
2015-11-30 15:26:35 -05:00
..
CHANGES Many files: 1997-04-26 13:21:57 +00:00
Makefile.in Apply LDFLAGS when building tests 2014-09-08 19:00:24 -04:00
Makefile.pq Many files: 1997-11-14 05:23:04 +00:00
argv_parse.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
argv_parse.h Remove trailing whitespace for the entire source tree 2008-08-27 23:07:54 -04:00
badblocks.c e2fsck: fix memory leak on error path in read_bad_blocks_files() 2014-01-07 09:10:24 -05:00
crc32.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
crc32defs.h Only use __builtin_expect if __GNUC__ > 3 2008-07-13 16:06:56 -04:00
dict.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
dict.h Fixx gcc -Wall nitpicks. 2003-07-06 00:36:48 -04:00
dirinfo.c e2fsck: fix dangling pointer when dir_info array is resized 2014-11-05 11:14:26 -05:00
dx_dirinfo.c e2fsck: notice when the realloc of dir_info fails 2014-09-11 12:24:07 -04:00
e2fsck.8.in Fix spelling typo's in man pages for tune2fs and mke2fs 2012-07-14 19:58:06 -04:00
e2fsck.c e2fsck: skip quota update when interrupted 2015-11-16 06:20:56 -05:00
e2fsck.conf.5.in e2fsck.conf: clarify man page's description of accept_time_fudge 2014-01-04 19:11:36 -05:00
e2fsck.h e2fsck: skip quota update when interrupted 2015-11-16 06:20:56 -05:00
ea_refcount.c e2fsck: fix printf conversion specs in ea_refcount.c 2013-12-24 22:50:23 -05:00
ehandler.c e2fsck: fix potential segv when handling a read error in a superblock 2012-08-06 18:46:42 -04:00
emptydir.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
extend.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
flushb.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
gen_crc32table.c Fix gcc -Wall warnings in e2fsck 2008-06-07 11:04:10 -04:00
iscan.c debugfs, e2fsck: fix s_desc_size handling 2013-12-24 22:50:19 -05:00
jfs_user.h Allow e2fsprogs to be built using the clang (LLVM) frontend 2012-09-09 21:35:39 -04:00
journal.c journal: use consts instead of 1024 and add helper for journal with 1k blocksize 2014-07-28 20:21:47 -04:00
logfile.c e2fsck: close the progress_fd in the logfile child process 2015-01-12 19:42:29 -05:00
message.c e2fsck: sort the abbreviations better 2014-06-03 22:04:33 -04:00
mtrace.awk Many files: 1997-04-26 13:21:57 +00:00
mtrace.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
mtrace.h ChangeLog, super.c: 2001-01-12 21:05:57 +00:00
pass1.c e2fsck: zap extent-format inode with no extent header 2015-11-30 15:22:07 -05:00
pass1b.c e2fsck: during pass1b delete_file, only free a cluster once 2014-07-26 16:28:58 -04:00
pass2.c e2fsck: skip quota update when interrupted 2015-11-16 06:20:56 -05:00
pass3.c e2fsck: reserve blocks for root/lost+found directory repair 2014-07-26 15:45:42 -04:00
pass4.c e2fsck: use dgrp_t for block group numbers 2013-12-02 23:21:31 -05:00
pass5.c Fix 32/64-bit overflow when multiplying by blocks/clusters per group 2014-07-26 07:40:36 -04:00
problem.c e2fsck: zap extent-format inode with no extent header 2015-11-30 15:22:07 -05:00
problem.h e2fsck: zap extent-format inode with no extent header 2015-11-30 15:22:07 -05:00
problemP.h e2fsck: add ability to limit the # of problems of a particular type 2012-03-14 17:44:54 -04:00
prof_err.et Fix more spelling errors found by translators and add pluralization 2011-10-09 17:54:23 -04:00
profile.c e2fsck, mke2fs: enable octal integers in the profile/config file 2014-01-30 13:58:18 -05:00
profile.h mke2fs: Allow specifying reserved_ratio via mke2fs.conf 2011-05-14 23:34:48 -04:00
profile_helpers.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
profile_helpers.h Simplify profile core functionality 2006-01-02 22:04:41 -05:00
quota.c quota: integrate mkquota.h into quotaio.h 2014-05-13 10:13:04 -04:00
recovery.c e2fsck: fix gcc -Wall nits 2013-05-19 21:36:31 -04:00
region.c build: quiet some "gcc -Wall" compiler warnings 2012-12-29 17:39:45 -05:00
rehash.c e2fsck: fix e2fsck -fD directory truncation 2015-11-30 15:26:35 -05:00
revoke.c Shorten compile commands run by the build system 2011-09-18 17:34:37 -04:00
scantest.c e2fsprogs: introduce ext2fs_close_free() helper 2014-07-05 21:06:48 -04:00
sigcatcher.c Work around Debian Bug #712530 2013-06-16 17:54:39 -04:00
super.c e2fsck: fix file systems with an overly large s_first_meta_bg 2014-08-10 16:21:08 -04:00
unix.c e2fsck: skip quota update when interrupted 2015-11-16 06:20:56 -05:00
util.c e2fsprogs: introduce ext2fs_close_free() helper 2014-07-05 21:06:48 -04:00