vfs_ceph: remove ceph_fallocate/ceph_ftruncate fallback
authorDavid Disseldorp <ddiss@samba.org>
Wed, 27 Feb 2019 10:52:42 +0000 (11:52 +0100)
committerDavid Disseldorp <ddiss@samba.org>
Wed, 27 Feb 2019 14:53:19 +0000 (14:53 +0000)
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>
source3/modules/vfs_ceph.c

index b582902..3fb5943 100644 (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,