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:
parent
70329c36ed
commit
155f1289ba
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user