mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-20 02:36:16 +02:00
test: improve the cp fiemap tests
* tests/cp/fiemap-2: Enable the fiemap check for files, which will enable the test for files on ext3. * tests/cp/fiemap-perf: Comment why we're not enabling for ext3. * tests/cp/sparse-fiemap: Ditto. Also sync the files before doing a fiemap which was needed for ext4 loop back at least. Add a comment that FIEMAP_FLAG_SYNC is ineffective, thus requiring the explicit syncs. * tests/fiemap-capable: A new python script to determine if a specified path supports fiemap. * tests/init.cfg (fiemap_capable_): Use the new python script. * tests/Makefile.am (EXTRA_DIST): Include the new python script.
This commit is contained in:
@@ -11,6 +11,7 @@ EXTRA_DIST = \
|
||||
check.mk \
|
||||
envvar-check \
|
||||
filefrag-extent-compare \
|
||||
fiemap-capable \
|
||||
init.cfg \
|
||||
init.sh \
|
||||
lang-default \
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
print_ver_ cp
|
||||
|
||||
# Require a fiemap-enabled FS.
|
||||
fiemap_capable_ . \
|
||||
touch fiemap_chk # check a file rather than current dir for best coverage
|
||||
fiemap_capable_ fiemap_chk \
|
||||
|| skip_ "this file system lacks FIEMAP support"
|
||||
|
||||
# Exercise the code that handles a file ending in a hole.
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
print_ver_ cp
|
||||
|
||||
# Require a fiemap-enabled FS.
|
||||
# Note we don't check a file here as that could enable
|
||||
# the test on ext3 where emulated extent scanning can be slow.
|
||||
fiemap_capable_ . \
|
||||
|| skip_ "this file system lacks FIEMAP support"
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
. "${srcdir=.}/init.sh"; path_prepend_ ../src
|
||||
print_ver_ cp
|
||||
|
||||
# Note we don't check a file here as that could enable
|
||||
# the test on ext3 where this test is seen to fail.
|
||||
if fiemap_capable_ . ; then
|
||||
: # Current dir is on a partition with working extents. Good!
|
||||
else
|
||||
@@ -66,11 +68,13 @@ for i in $(seq 1 2 21); do
|
||||
$PERL -e 'BEGIN { $n = '$i' * 1024; *F = *STDOUT }' \
|
||||
-e 'for (1..'$j') { sysseek (*F, $n, 1)' \
|
||||
-e '&& syswrite (*F, chr($_)x$n) or die "$!"}' > j1 || fail=1
|
||||
# sync
|
||||
|
||||
# Note the explicit fdatasync is used here as
|
||||
# it was seen that `filefrag -s` (FIEMAP_FLAG_SYNC) was
|
||||
# ineffective on ext4 loopback on Linux 2.6.35.10-72.fc14.i686
|
||||
dd if=/dev/null of=j1 conv=notrunc,fdatasync
|
||||
cp --sparse=always j1 j2 || fail=1
|
||||
# sync
|
||||
# Technically we may need the 'sync' uses above, but
|
||||
# uncommenting them makes this test take much longer.
|
||||
dd if=/dev/null of=j2 conv=notrunc,fdatasync
|
||||
|
||||
cmp j1 j2 || fail=1
|
||||
filefrag -v j1 | grep extent \
|
||||
|
||||
16
tests/fiemap-capable
Normal file
16
tests/fiemap-capable
Normal file
@@ -0,0 +1,16 @@
|
||||
import struct, fcntl, sys, os
|
||||
|
||||
def sizeof(t): return struct.calcsize(t)
|
||||
IOCPARM_MASK = 0x7f
|
||||
IOC_OUT = 0x40000000
|
||||
IOC_IN = 0x80000000
|
||||
IOC_INOUT = (IOC_IN|IOC_OUT)
|
||||
def _IOWR(x,y,t): return (IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|y)
|
||||
|
||||
try:
|
||||
fd = os.open (len (sys.argv) == 2 and sys.argv[1] or '.', os.O_RDONLY)
|
||||
struct_fiemap = '=qqllll'
|
||||
FS_IOC_FIEMAP = _IOWR (ord ('f'), 11, struct_fiemap)
|
||||
fcntl.ioctl (fd, FS_IOC_FIEMAP, struct.pack(struct_fiemap, 0,~0,0,0,0,0))
|
||||
except:
|
||||
sys.exit (1)
|
||||
@@ -295,13 +295,16 @@ require_proc_pid_status_()
|
||||
kill $pid
|
||||
}
|
||||
|
||||
# Return nonzero if the specified directory is on a file system for
|
||||
# which FIEMAP support exists, and the file system type is new enough
|
||||
# (unlike ext2 and ext3) that it is hard to find an instance *without*
|
||||
# FIEMAP support.
|
||||
# Return nonzero if the specified path is on a file system for
|
||||
# which FIEMAP support exists. Note some file systems (like ext3)
|
||||
# only support FIEMAP for files, not directories.
|
||||
fiemap_capable_()
|
||||
{
|
||||
df -T -t btrfs -t xfs -t ext4 -t ocfs2 -t gfs2 "$@"
|
||||
if ! python < /dev/null; then
|
||||
echo 'fiemap_capable_: python missing: assuming not fiemap capable' 1>&2
|
||||
return 1
|
||||
fi
|
||||
python $abs_srcdir/fiemap-capable "$@"
|
||||
}
|
||||
|
||||
# Does the current (working-dir) file system support sparse files?
|
||||
|
||||
Reference in New Issue
Block a user