vfs_ceph: add missing fallocate hook
authorDavid Disseldorp <ddiss@samba.org>
Tue, 26 Feb 2019 20:26:27 +0000 (21:26 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 5 Mar 2019 07:39:29 +0000 (07:39 +0000)
SMB_VFS_FALLOCATE() calls atop a vfs_ceph share currently fall through
to vfs_default, which results in a local filesystem I/O attempt using a
libcephfs file-descriptor. Add the missing fallocate hook to vfs_ceph.

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>
(cherry picked from commit 5a7e7280813559fb70a9fc8e4238cb6015ee3b53)

source3/modules/vfs_ceph.c

index b6707458b77c1fa24824ec5668724af8b751fa66..f73a1f651870ef1f5c3fdee8f0006308e6760f71 100644 (file)
@@ -1252,6 +1252,22 @@ static int cephwrap_ftruncate(struct vfs_handle_struct *handle, files_struct *fs
        return result;
 }
 
+static int cephwrap_fallocate(struct vfs_handle_struct *handle,
+                             struct files_struct *fsp,
+                             uint32_t mode,
+                             off_t offset,
+                             off_t len)
+{
+       int result;
+
+       DBG_DEBUG("[CEPH] fallocate(%p, %p, %u, %llu, %llu\n",
+                 handle, fsp, mode, llu(offset), llu(len));
+       /* unsupported mode flags are rejected by libcephfs */
+       result = ceph_fallocate(handle->data, fsp->fh->fd, mode, offset, len);
+       DBG_DEBUG("[CEPH] fallocate(...) = %d\n", result);
+       WRAP_RETURN(result);
+}
+
 static bool cephwrap_lock(struct vfs_handle_struct *handle, files_struct *fsp, int op, off_t offset, off_t count, int type)
 {
        DBG_DEBUG("[CEPH] lock\n");
@@ -1613,6 +1629,7 @@ static struct vfs_fn_pointers ceph_fns = {
        .getwd_fn = cephwrap_getwd,
        .ntimes_fn = cephwrap_ntimes,
        .ftruncate_fn = cephwrap_ftruncate,
+       .fallocate_fn = cephwrap_fallocate,
        .lock_fn = cephwrap_lock,
        .kernel_flock_fn = cephwrap_kernel_flock,
        .linux_setlease_fn = cephwrap_linux_setlease,