1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-03-04 12:05:23 +02:00
Files
coreutils/tests/dd/sparse.sh
Pádraig Brady 7c03fe2c9f tests: fix false dd conv=sparse failure on newer XFS
* tests/dd/sparse.sh: When testing that a hole is created,
use an existing sparse destination file, so that we're
not write extending the file size, and thus avoiding
speculative preallocation which can result in smaller
holes than requested.
Workaround suggested by Brian Foster
2014-04-11 23:52:08 +01:00

78 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
# Copyright (C) 2012-2014 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_ dd
require_sparse_support_
# Ensure basic sparse generation works
truncate -s1M sparse
dd bs=32K if=sparse of=sparse.dd conv=sparse
test $(stat -c %s sparse) = $(stat -c %s sparse.dd) || fail=1
# Demonstrate that conv=sparse with oflag=append,
# will do ineffective seeks in the output
printf 'a\000\000b' > file.in
printf 'ab' > exp
dd if=file.in bs=1 conv=sparse oflag=append > out
compare exp out || fail=1
# Demonstrate conv=sparse with conv=notrunc,
# where data in file.out is not overwritten with NULs
printf '____' > out
printf 'a__b' > exp
dd if=file.in bs=1 conv=sparse,notrunc of=out
compare exp out || fail=1
# Ensure we fall back to write if seek fails
dd if=file.in bs=1 conv=sparse | cat > file.out
cmp file.in file.out || fail=1
# Setup for block size tests: create a 3MiB file with a 1MiB
# stretch of NUL bytes in the middle.
rm -f file.in
dd if=/dev/urandom of=file.in bs=1M count=3 iflag=fullblock || fail=1
dd if=/dev/zero of=file.in bs=1M count=1 seek=1 conv=notrunc || fail=1
kb_alloc() { du -k "$1"|cut -f1; }
# If our just-created input file appears to be too small,
# skip the remaining tests. On at least Solaris 10 with NFS,
# file.in is reported to occupy <= 1KiB for about 50 seconds
# after its creation.
if test $(kb_alloc file.in) -gt 3000; then
# Ensure NUL blocks smaller than the block size are not made sparse.
# Here, with a 2MiB block size, dd's conv=sparse must *not* introduce a hole.
dd if=file.in of=file.out bs=2M conv=sparse
test 2500 -lt $(kb_alloc file.out) || fail=1
# Note we recreate a sparse file first to avoid
# speculative preallocation seen in XFS, where a write() that
# extends a file can preallocate some extra space that
# a subsequent seek will not convert to a hole.
rm -f file.out
truncate --size=3M file.out
# Ensure that this 1MiB string of NULs *is* converted to a hole.
dd if=file.in of=file.out bs=1M conv=sparse,notrunc
test $(kb_alloc file.out) -lt 2500 || fail=1
fi
Exit $fail