Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Nov 2008 17:17:34 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        freebsd-hackers@freebsd.org
Cc:        Jeremy Messenger <mezz7@cox.net>
Subject:   Re: preallocate files without (posix_)fallocate or fcntl's F_PREALLOCATE?
Message-ID:  <200811051717.34933.jhb@freebsd.org>
In-Reply-To: <op.uj5okktj9aq2h7@localhost>
References:  <op.uj5okktj9aq2h7@localhost>

next in thread | previous in thread | raw e-mail | index | archive | help
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



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