fallocate can allocate extens beyond EOF via FALLOC_FL_KEEP_SIZE. Currenly sparse engine tries to copy such extents which is wrong and result in silent data corruption (leave file with incorrect size).
##TESTCASE echo blabla > sparse_falloc.in truncate -s 2M sparse_falloc.in fallocate -n -o 4M -l 1M sparse_falloc.in cp sparse_falloc.in sparse_falloc.out cmp sparse_falloc.in sparse_falloc.out Signed-off-by: Dmitry Monakhov <dmonak...@openvz.org> --- src/copy.c | 7 ++++++- tests/cp/sparse-unwritten.sh | 29 +++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100755 tests/cp/sparse-unwritten.sh diff --git a/src/copy.c b/src/copy.c index edf022e..de197a4 100644 --- a/src/copy.c +++ b/src/copy.c @@ -430,7 +430,12 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size, ext_start = last_ext_start + scan.ext_info[i].ext_length; ext_len = 0; } - + /* Is this extent beyond EOF? */ + if (ext_start + ext_len >= src_total_size) + { + wrote_hole_at_eof = true; + break; + } ext_hole_size = ext_start - last_ext_start - last_ext_len; wrote_hole_at_eof = false; diff --git a/tests/cp/sparse-unwritten.sh b/tests/cp/sparse-unwritten.sh new file mode 100755 index 0000000..4666535 --- /dev/null +++ b/tests/cp/sparse-unwritten.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# Test cp for a file which has extents beyond EOF + +# Copyright (C) 2006-2015 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ cp +require_sparse_support_ + +echo blabla > sparse_falloc.in || framework_failure_ +truncate -s 2M sparse_falloc.in || framework_failure_ +fallocate -n -o 4M -l 1M sparse_falloc.in || framework_failure_ +cp sparse_falloc.in sparse_falloc.out || fail=1 +cmp sparse_falloc.in sparse_falloc.out || fail=1 + +Exit $fail -- 2.1.4 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel