Inconsistency between lseek(SEEK_HOLE) and lseek(SEEK_DATA)

Maxim Sobolev sobomax at
Mon Feb 1 15:57:42 UTC 2016


I've noticed that lseek() behaved inconsistently with regards to SEEK_HOLE
and SEEK_DATA operations. The SEEK_HOLE on a data-only file returns st_size
(i.e. EOF + 1), while the SEEK_DATA on a hole-only file returns -1 and sets
errno to ENXIO. The latter seems to be a documented way to indicate that
the file has no more data sections past this point.

My first idea was that somehow most files has a hole attached to its end to
fill up the FS block, but that does not seem to be a case. Trying to
SEEK_HOLE past the end of any of those data-only files produces an error
(i.e. lseek(fd, st_size, SEEK_HOLE) == -1).

In short, for some reason I cannot get proper ENXIO from the SEEK_HOLE.
What currently returned implies that there is 1-byte hole attached to each
file past its EOF and that does not smell right.

All tests are done on UFS, fairly recent 11-current.


More information about the freebsd-fs mailing list