preallocate files without (posix_)fallocate or fcntl's
F_PREALLOCATE?
John Baldwin
jhb at freebsd.org
Wed Nov 5 14:51:23 PST 2008
On Wednesday 05 November 2008 12:08:11 pm Jeremy Messenger wrote:
> Hello folks,
>
> At first, I don't really know C that well so... It's more of request or
> suggest if anyone is bored or interest to port on FreeBSD. :-)
>
> Recently, Transmission has added preallocate files to prevent disk
> fragmentation but FreeBSD does not has any of (posix_)fallocate or fcntl's
> F_PREALLOCATE (checked in RELENG_7's src/* and manpages). Here's what it
> looks like:
>
> ----------------------------------------
> static int
> preallocateFile( int fd UNUSED, uint64_t length UNUSED )
> {
> #ifdef HAVE_FALLOCATE
>
> return fallocate( fd, 0, offset, length );
>
> #elif defined(HAVE_POSIX_FALLOCATE)
>
> return posix_fallocate( fd, 0, length );
>
> #elif defined(SYS_DARWIN)
>
> fstore_t fst;
> fst.fst_flags = F_ALLOCATECONTIG;
> fst.fst_posmode = F_PEOFPOSMODE;
> fst.fst_offset = 0;
> fst.fst_length = length;
> fst.fst_bytesalloc = 0;
> return fcntl( fd, F_PREALLOCATE, &fst );
>
> #else
>
> #warning no known method to preallocate files on this platform
> return -1;
>
> #endif
> }
> ----------------------------------------
>
> You can see a bit more over at
> http://trac.transmissionbt.com/changeset/7051 .. You can also point me to
> some sources if it exists for I can try do it by myself, but with lacking
> C knowledge is a bit hard for me at the most of time. I don't know if UFS
> does not need or does need it. If anyone is interesting to write simple
> one for FreeBSD will be cool. Thanks!
UFS would benefit. See the notes on MAP_NOSYNC in mmap(2). Peter Wemm
(peter@) probably can give a more detailed suggestion of what you would need
to do. Doing it efficiently would probably require a new VOP_ALLOCATE() or
some such.
--
John Baldwin
More information about the freebsd-hackers
mailing list