Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 04 Apr 2012 09:52:52 +0200
From:      Attila Nagy <bra@fsn.hu>
To:        freebsd-fs@FreeBSD.org
Subject:   SEEK_HOLE and SEEK_DATA does not work on zfs (with test case)
Message-ID:  <4F7BFDD4.6080703@fsn.hu>

next in thread | raw e-mail | index | archive | help
Hi,

I've started to experiment with SEEK_HOLE and SEEK_DATA in python on a 
recent FreeBSD 9-STABLE/amd64 box and it quickly became evident that the 
program that works on Solaris doesn't work on FreeBSD.
Python itself couldn't cause this, because it correctly issues the 
lseek, but taking the C test program from here:
https://lkml.org/lkml/2011/4/22/79
gives the same result (failure).

On a Solaris 10 box I get (the correct result):
creating file
Error 0
fpathconf gives 512, ENXIO is 6

testing at start
CUR at offset 0, errno 0
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0
DATA gives offset 0, errno 0
CUR at offset 0, errno 0
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0

testing at end
end at offset 1048578, errno 0
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0
HOLE gives offset 1048578, errno 0
CUR at offset 1048578, errno 0
DATA gives offset 1048577, errno 0
CUR at offset 1048577, errno 0

testing at offset 1
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0
DATA gives offset 1, errno 0
CUR at offset 1, errno 0

testing at offset 200000
HOLE gives offset 200000, errno 0
CUR at offset 200000, errno 0
DATA gives offset 1048576, errno 0
CUR at offset 1048576, errno 0

On FreeBSD 9-STABLE/amd64 (all HOLE or DATA seeks fail):
creating file
No error: 0
fpathconf gives 512, ENXIO is 6

testing at start
CUR at offset 0, errno 0
HOLE gives offset -1, errno 6
CUR at offset 0, errno 0
DATA gives offset -1, errno 6
CUR at offset 0, errno 0
HOLE gives offset -1, errno 6
CUR at offset 0, errno 0

testing at end
end at offset 1048578, errno 0
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0

testing at offset 1
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0

testing at offset 200000
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0

Interestingly on an older 8.2-PRELEASE (Dec 14 23:12:05 CET 2010 and 
i386) box it works:
creating file
No such file or directory
fpathconf gives 512, ENXIO is 6

testing at start
CUR at offset 0, errno 0
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0
DATA gives offset 0, errno 0
CUR at offset 0, errno 0
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0

testing at end
end at offset 1048578, errno 0
HOLE gives offset -1, errno 6
CUR at offset 1048578, errno 0
DATA gives offset -1, errno 6
CUR at offset 1048578, errno 0
HOLE gives offset 1048578, errno 0
CUR at offset 1048578, errno 0
DATA gives offset 1048577, errno 0
CUR at offset 1048577, errno 0

testing at offset 1
HOLE gives offset 131072, errno 0
CUR at offset 131072, errno 0
DATA gives offset 1, errno 0
CUR at offset 1, errno 0

testing at offset 200000
HOLE gives offset 200000, errno 0
CUR at offset 200000, errno 0
DATA gives offset 1048576, errno 0
CUR at offset 1048576, errno 0

I don't know whether 32 bit, the OS or the pool version (the only 
working FreeBSD case use a version 13 zpool) cause the malfunction, but 
this is a major issue for anybody who wants to use this documented feature.




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F7BFDD4.6080703>