ext4: fix loss of delalloc extent info in ext4_zero_range()
authorEric Whitney <enwlinux@gmail.com>
Fri, 3 Apr 2015 04:13:42 +0000 (00:13 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 3 Apr 2015 04:13:42 +0000 (00:13 -0400)
commit94426f4b9648154dc5a6760b59e6953e640ab3b1
tree7f8828061434c4de38d99fb4e94289467b6b355c
parent0f2af21aae11972fa924374ddcf52e88347cf5a8
ext4: fix loss of delalloc extent info in ext4_zero_range()

In ext4_zero_range(), removing a file's entire block range from the
extent status tree removes all records of that file's delalloc extents.
The delalloc accounting code uses this information, and its loss can
then lead to accounting errors and kernel warnings at writeback time and
subsequent file system damage.  This is most noticeable on bigalloc
file systems where code in ext4_ext_map_blocks() handles cases where
delalloc extents share clusters with a newly allocated extent.

Because we're not deleting a block range and are correctly updating the
status of its associated extent, there is no need to remove anything
from the extent status tree.

When this patch is combined with an unrelated bug fix for
ext4_zero_range(), kernel warnings and e2fsck errors reported during
xfstests runs on bigalloc filesystems are greatly reduced without
introducing regressions on other xfstests-bld test scenarios.

Signed-off-by: Eric Whitney <enwlinux@gmail.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/extents.c