1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback

Both libcephfs functions are supported and capable of extending files,
so fallback can be dropped.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13807

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
This commit is contained in:
David Disseldorp 2019-02-27 11:52:42 +01:00
parent 70329c36ed
commit 155f1289ba

View File

@ -1037,9 +1037,7 @@ static struct smb_filename *cephwrap_getwd(struct vfs_handle_struct *handle,
static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_struct *fsp, off_t len)
{
off_t space_to_write;
uint64_t space_avail;
uint64_t bsize,dfree,dsize;
int ret;
int result;
NTSTATUS status;
SMB_STRUCT_STAT *pst;
@ -1059,107 +1057,28 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle, files_str
/* Shrink - just ftruncate. */
if (pst->st_ex_size > len) {
ret = ceph_ftruncate(handle->data, fsp->fh->fd, len);
WRAP_RETURN(ret);
result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
WRAP_RETURN(result);
}
space_to_write = len - pst->st_ex_size;
/* for allocation try fallocate first. This can fail on some
platforms e.g. when the filesystem doesn't support it and no
emulation is being done by the libc (like on AIX with JFS1). In that
case we do our own emulation. fallocate implementations can
return ENOTSUP or EINVAL in cases like that. */
ret = SMB_VFS_FALLOCATE(fsp, 0, pst->st_ex_size, space_to_write);
if (ret == -1 && errno == ENOSPC) {
return -1;
}
if (ret == 0) {
return 0;
}
DEBUG(10,("[CEPH] strict_allocate_ftruncate: SMB_VFS_FALLOCATE failed with "
"error %d. Falling back to slow manual allocation\n", errno));
/* available disk space is enough or not? */
space_avail =
get_dfree_info(fsp->conn, fsp->fsp_name, &bsize, &dfree, &dsize);
/* space_avail is 1k blocks */
if (space_avail == (uint64_t)-1 ||
((uint64_t)space_to_write/1024 > space_avail) ) {
errno = ENOSPC;
return -1;
}
/* Write out the real space on disk. */
return vfs_slow_fallocate(fsp, pst->st_ex_size, space_to_write);
result = ceph_fallocate(handle->data, fsp->fh->fd, 0, pst->st_ex_size,
space_to_write);
WRAP_RETURN(result);
}
static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct *fsp, off_t len)
{
int result = -1;
SMB_STRUCT_STAT st;
char c = 0;
off_t currpos;
DBG_DEBUG("[CEPH] ftruncate(%p, %p, %llu\n", handle, fsp, llu(len));
if (lp_strict_allocate(SNUM(fsp->conn))) {
result = strict_allocate_ftruncate(handle, fsp, len);
return result;
return strict_allocate_ftruncate(handle, fsp, len);
}
/* we used to just check HAVE_FTRUNCATE_EXTEND and only use
sys_ftruncate if the system supports it. Then I discovered that
you can have some filesystems that support ftruncate
expansion and some that don't! On Linux fat can't do
ftruncate extend but ext2 can. */
result = ceph_ftruncate(handle->data, fsp->fh->fd, len);
if (result == 0)
goto done;
/* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
extend a file with ftruncate. Provide alternate implementation
for this */
currpos = SMB_VFS_LSEEK(fsp, 0, SEEK_CUR);
if (currpos == -1) {
goto done;
}
/* Do an fstat to see if the file is longer than the requested
size in which case the ftruncate above should have
succeeded or shorter, in which case seek to len - 1 and
write 1 byte of zero */
if (SMB_VFS_FSTAT(fsp, &st) == -1) {
goto done;
}
#ifdef S_ISFIFO
if (S_ISFIFO(st.st_ex_mode)) {
result = 0;
goto done;
}
#endif
if (st.st_ex_size == len) {
result = 0;
goto done;
}
if (st.st_ex_size > len) {
/* the sys_ftruncate should have worked */
goto done;
}
if (SMB_VFS_PWRITE(fsp, &c, 1, len-1)!=1) {
goto done;
}
result = 0;
done:
return result;
WRAP_RETURN(result);
}
static int cephwrap_fallocate(struct vfs_handle_struct *handle,