Punching holes into (sparse) files - porting Solaris
fcntl(F_FREESP) to FreeBSD?
Attila Nagy
bra at fsn.hu
Mon Mar 7 18:50:53 UTC 2011
On 03/06/2011 09:54 AM, Pawel Jakub Dawidek wrote:
> On Fri, Mar 04, 2011 at 04:12:20PM +0100, Attila Nagy wrote:
>> Hi,
>>
>> Is it possible to make regions of files, with already written data
>> sparse? (I'm interested to do this on ZFS)
>>
>> All I could find in this topic is:
>> http://www.mail-archive.com/zfs-discuss@opensolaris.org/msg29047.html
>>
>> grepping through the source gives a match for VOP_SPACE in
>> cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c:
>> zfs_replay_truncate(zfsvfs_t *zfsvfs, lr_truncate_t *lr, boolean_t byteswap)
>> {
>> #ifdef sun
>> [...]
>> error = VOP_SPACE(ZTOV(zp), F_FREESP,&fl, FWRITE | FOFFMAX,
>> lr->lr_offset, kcred, NULL);
>>
>> And the relevant section from fcntl(2) in Solaris:
>> F_FREESP
>>
>> Free storage space associated with a section of the
>> ordinary file fildes. The section is specified by a
>> variable of data type struct flock pointed to by arg.
>> The data type struct flock is defined in the<fcntl.h>
>> header (see fcntl.h(3HEAD)) and is described below. Note
>> that all file systems might not support all possible
>> variations of F_FREESP arguments. In particular, many
>> file systems allow space to be freed only at the end of
>> a file.
>>
>> F_FREESP seems to be my friend, and it's implemented in Solaris's ZFS.
>> How hard would it be to complete the port and make it accessible from
>> FreeBSD?
>> I guess it was left out with a reason...
> Well, adding new VOP is important decision. We could eventually
> implement this via ioctl(2), I think... This is a nice feature after all.
>
> I don't know why do you need this, but note that when compression is
> enabled on a ZFS file system, all-zeros blocks are turned into holes, so
> if you do have compression enabled and you write all zeros in the place
> you want to punch a hole, the pool space should be reclaimed.
>
I would like to use it for integer-indexed fixed size storage, where the
given block can be accessed by multiplying the block size with the index
number.
A sparse file would allow to reclaim freed blocks' space.
But with SEEK_HOLE and SEEK_DATA, and the promised efficiency of sparse
files on ZFS I guess there are a lot more use cases than before (for
sparse files).
Thanks for the info about compression, I didn't know that. Should I
assume that using compression and writing blocksize number of zeroes is
efficient as F_FREESP?
Thanks,
More information about the freebsd-fs
mailing list