diff options
author | Lukas Czerner <lczerner@redhat.com> | 2014-07-15 06:03:38 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-07-15 06:03:38 -0400 |
commit | 4f579ae7de560e5f449587a6c3f02594d53d4d51 (patch) | |
tree | 4880232d5b88692ae01779bbd9d495a531ad378d /fs/ext4/inline.c | |
parent | 71d4f7d032149b935a26eb3ff85c6c837f3714e1 (diff) | |
download | talos-obmc-linux-4f579ae7de560e5f449587a6c3f02594d53d4d51.tar.gz talos-obmc-linux-4f579ae7de560e5f449587a6c3f02594d53d4d51.zip |
ext4: fix punch hole on files with indirect mapping
Currently punch hole code on files with direct/indirect mapping has some
problems which may lead to a data loss. For example (from Jan Kara):
fallocate -n -p 10240000 4096
will punch the range 10240000 - 12632064 instead of the range 1024000 -
10244096.
Also the code is a bit weird and it's not using infrastructure provided
by indirect.c, but rather creating it's own way.
This patch fixes the issues as well as making the operation to run 4
times faster from my testing (punching out 60GB file). It uses similar
approach used in ext4_ind_truncate() which takes advantage of
ext4_free_branches() function.
Also rename the ext4_free_hole_blocks() to something more sensible, like
the equivalent we have for extent mapped files. Call it
ext4_ind_remove_space().
This has been tested mostly with fsx and some xfstests which are testing
punch hole but does not require unwritten extents which are not
supported with direct/indirect mapping. Not problems showed up even with
1024k block size.
CC: stable@vger.kernel.org
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inline.c')
0 files changed, 0 insertions, 0 deletions