ext4: allocate entire range in zero range
authorLukas Czerner <lczerner@redhat.com>
Fri, 3 Apr 2015 04:09:13 +0000 (00:09 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 3 Apr 2015 04:09:13 +0000 (00:09 -0400)
commit0f2af21aae11972fa924374ddcf52e88347cf5a8
tree753b0c67fecebe1cc2bf15ca775b9ea13312b85c
parent5a4f3145aa685ddc2caf424763d42d3eaaebbc6f
ext4: allocate entire range in zero range

Currently there is a bug in zero range code which causes zero range
calls to only allocate block aligned portion of the range, while
ignoring the rest in some cases.

In some cases, namely if the end of the range is past i_size, we do
attempt to preallocate the last nonaligned block. However this might
cause kernel to BUG() in some carefully designed zero range requests
on setups where page size > block size.

Fix this problem by first preallocating the entire range, including
the nonaligned edges and converting the written extents to unwritten
in the next step. This approach will also give us the advantage of
having the range to be as linearly contiguous as possible.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/extents.c