From 0d53ce7e072d3dc5208fd752c5d49ed313d1c752 Mon Sep 17 00:00:00 2001 From: Björn Jacke Date: Tue, 8 Dec 2009 21:13:19 +0100 Subject: s3: make sys_posix_fallocate more generic this is in preparation for other preallocation methods to be introduced. --- source3/lib/system.c | 8 ++++---- 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, -- cgit