mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
s3: make sys_posix_fallocate more generic
this is in preparation for other preallocation methods to be introduced.
This commit is contained in:
parent
e14fb8f913
commit
0d53ce7e07
@ -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.
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user