diff options
author | Björn Jacke <bj@sernet.de> | 2009-12-08 21:13:19 +0100 |
---|---|---|
committer | Björn Jacke <bj@sernet.de> | 2009-12-08 21:16:31 +0100 |
commit | 0d53ce7e072d3dc5208fd752c5d49ed313d1c752 (patch) | |
tree | dc8cbcf0e2c0cc244e7ff7dee23c83c41372deec | |
parent | e14fb8f913e35db96d8d7985e505f96150d9ce6b (diff) | |
download | samba-0d53ce7e072d3dc5208fd752c5d49ed313d1c752.tar.gz samba-0d53ce7e072d3dc5208fd752c5d49ed313d1c752.tar.bz2 samba-0d53ce7e072d3dc5208fd752c5d49ed313d1c752.zip |
s3: make sys_posix_fallocate more generic
this is in preparation for other preallocation methods to be introduced.
-rw-r--r-- | source3/lib/system.c | 8 | ||||
-rw-r--r-- | source3/modules/vfs_default.c | 25 |
2 files changed, 15 insertions, 18 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c index a2dd89982e..a58d9037a7 100644 --- a/source3/lib/system.c +++ b/source3/lib/system.c @@ -621,16 +621,16 @@ int sys_lstat(const char *fname,SMB_STRUCT_STAT *sbuf, /******************************************************************* An posix_fallocate() wrapper that will deal with 64 bit filesizes. ********************************************************************/ -#if (defined(HAVE_POSIX_FALLOCATE64) || defined(HAVE_POSIX_FALLOCATE)) && !defined(HAVE_BROKEN_POSIX_FALLOCATE) int sys_posix_fallocate(int fd, SMB_OFF_T offset, SMB_OFF_T len) { -#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_POSIX_FALLOCATE64) +#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_OFF64_T) && defined(HAVE_POSIX_FALLOCATE64) && !defined(HAVE_BROKEN_POSIX_FALLOCATE) return posix_fallocate64(fd, offset, len); -#else +#elif defined(HAVE_POSIX_FALLOCATE) && !defined(HAVE_BROKEN_POSIX_FALLOCATE) return posix_fallocate(fd, offset, len); +#else + return ENOSYS; #endif } -#endif /******************************************************************* An ftruncate() wrapper that will deal with 64 bit filesizes. diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index 9b842df93f..ded4b1af27 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -917,6 +917,7 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs SMB_OFF_T space_to_write; uint64_t space_avail; uint64_t bsize,dfree,dsize; + int ret; if (currpos == -1) return -1; @@ -943,21 +944,17 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs emulation is being done by the libc (like on AIX with JFS1). In that case we do our own emulation. posix_fallocate implementations can return ENOTSUP or EINVAL in cases like that. */ -#if defined(HAVE_POSIX_FALLOCATE) - { - int ret = sys_posix_fallocate(fsp->fh->fd, st.st_ex_size, space_to_write); - if (ret == ENOSPC) { - errno = ENOSPC; - return -1; - } - if (ret == 0) { - return 0; - } - DEBUG(10,("strict_allocate_ftruncate: sys_posix_fallocate " - "failed with error %d. " - "Falling back to slow manual allocation\n", ret)); + ret = sys_posix_fallocate(fsp->fh->fd, st.st_ex_size, space_to_write); + if (ret == ENOSPC) { + errno = ENOSPC; + return -1; } -#endif + if (ret == 0) { + return 0; + } + DEBUG(10,("strict_allocate_ftruncate: sys_posix_fallocate failed with " + "error %d. Falling back to slow manual allocation\n", ret)); + /* available disk space is enough or not? */ space_avail = get_dfree_info(fsp->conn, fsp->fsp_name->base_name, false, |