Ignore:
Timestamp:
Jan 16, 2009, 4:38:16 PM (13 years ago)
Author:
charles
Message:

(trunk libT) make file preallocation optional via settings.json. choices are: full, sparse, and none

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/fdlimit.c

    r7643 r7720  
    109109#endif
    110110
    111 static int
    112 preallocateFile( const char * filename, uint64_t length )
    113 {
    114     int success = 0;
     111static tr_bool
     112preallocateFileSparse( int fd, uint64_t length )
     113{
     114    const char zero = '\0';
     115
     116    if( length == 0 )
     117        return TRUE;
     118
     119    if( lseek( fd, length-1, SEEK_SET ) == -1 )
     120        return FALSE;
     121    if( write( fd, &zero, 1 ) == -1 )
     122        return FALSE;
     123    if( ftruncate( fd, length ) == -1 )
     124        return FALSE;
     125
     126    return TRUE;
     127}
     128
     129static tr_bool
     130preallocateFileFull( const char * filename, uint64_t length )
     131{
     132    tr_bool success = 0;
    115133
    116134#ifdef WIN32
     
    171189 */
    172190static int
    173 TrOpenFile( int          i,
    174             const char * folder,
    175             const char * torrentFile,
    176             int          doWrite,
    177             int          doPreallocate,
    178             uint64_t     desiredFileSize )
     191TrOpenFile( int                      i,
     192            const char             * folder,
     193            const char             * torrentFile,
     194            tr_bool                  doWrite,
     195            tr_preallocation_mode    preallocationMode,
     196            uint64_t                 desiredFileSize )
    179197{
    180198    struct tr_openfile * file = &gFd->openFiles[i];
     
    203221    alreadyExisted = !stat( filename, &sb ) && S_ISREG( sb.st_mode );
    204222
    205     if( doWrite && !alreadyExisted && doPreallocate )
    206         if( preallocateFile( filename, desiredFileSize ) )
     223    if( doWrite && !alreadyExisted && ( preallocationMode == TR_PREALLOCATE_FULL ) )
     224        if( preallocateFileFull( filename, desiredFileSize ) )
    207225            tr_inf( _( "Preallocated file \"%s\"" ), filename );
    208226   
     
    225243    }
    226244
     245    if( doWrite && !alreadyExisted && ( preallocationMode == TR_PREALLOCATE_SPARSE ) )
     246        preallocateFileSparse( file->fd, desiredFileSize );
     247
    227248    tr_free( filename );
    228249    return 0;
     
    257278/* returns an fd on success, or a -1 on failure and sets errno */
    258279int
    259 tr_fdFileCheckout( const char * folder,
    260                    const char * torrentFile,
    261                    int          doWrite,
    262                    int          doPreallocate,
    263                    uint64_t     desiredFileSize )
     280tr_fdFileCheckout( const char             * folder,
     281                   const char             * torrentFile,
     282                   tr_bool                  doWrite,
     283                   tr_preallocation_mode    preallocationMode,
     284                   uint64_t                 desiredFileSize )
    264285{
    265286    int i, winner = -1;
     
    359380    if( !fileIsOpen( o ) )
    360381    {
    361         const int err = TrOpenFile( winner, folder, torrentFile, doWrite, doPreallocate, desiredFileSize );
     382        const int err = TrOpenFile( winner, folder, torrentFile, doWrite, preallocationMode, desiredFileSize );
    362383        if( err ) {
    363384            tr_lockUnlock( gFd->lock );
Note: See TracChangeset for help on using the changeset viewer.