vfs_glusterfs: Add fallocate support for vfs_glusterfs
authorSachin Prabhu <sprabhu@redhat.com>
Tue, 14 Nov 2017 10:21:44 +0000 (15:51 +0530)
committerJeremy Allison <jra@samba.org>
Wed, 17 Jan 2018 05:09:29 +0000 (06:09 +0100)
Adds fallocate support to the vfs glusterfs plugin.

v2: Add check for glusterfs-api version.
RHBZ: 1478875
Signed-off-by: Sachin Prabhu <sprabhu@redhat.com>
Reviewed-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Wed Jan 17 06:09:29 CET 2018 on sn-devel-144

source3/modules/vfs_glusterfs.c
source3/wscript

index 953c46af4cdd5eaaa195e515add202f8931ed1a5..f9a96fa004d3ddc72832f74104b7035a328004ad 100644 (file)
@@ -464,6 +464,10 @@ static uint32_t vfs_gluster_fs_capabilities(struct vfs_handle_struct *handle,
 {
        uint32_t caps = FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES;
 
+#ifdef HAVE_GFAPI_VER_6
+       caps |= FILE_SUPPORTS_SPARSE_FILES;
+#endif
+
 #ifdef STAT_HAVE_NSEC
        *p_ts_res = TIMESTAMP_SET_NT_OR_BETTER;
 #endif
@@ -1148,9 +1152,31 @@ static int vfs_gluster_fallocate(struct vfs_handle_struct *handle,
                                 uint32_t mode,
                                 off_t offset, off_t len)
 {
-       /* TODO: add support using glfs_fallocate() and glfs_zerofill() */
+#ifdef HAVE_GFAPI_VER_6
+       int keep_size, punch_hole;
+
+       keep_size = mode & VFS_FALLOCATE_FL_KEEP_SIZE;
+       punch_hole = mode & VFS_FALLOCATE_FL_PUNCH_HOLE;
+
+       mode &= ~(VFS_FALLOCATE_FL_KEEP_SIZE|VFS_FALLOCATE_FL_PUNCH_HOLE);
+       if (mode != 0) {
+               errno = ENOTSUP;
+               return -1;
+       }
+
+       if (punch_hole) {
+               return glfs_discard(*(glfs_fd_t **)
+                                   VFS_FETCH_FSP_EXTENSION(handle, fsp),
+                                   offset, len);
+       }
+
+       return glfs_fallocate(*(glfs_fd_t **)
+                             VFS_FETCH_FSP_EXTENSION(handle, fsp),
+                             keep_size, offset, len);
+#else
        errno = ENOTSUP;
        return -1;
+#endif
 }
 
 static struct smb_filename *vfs_gluster_realpath(struct vfs_handle_struct *handle,
index 0f8fe5452daf4fd5676a1695b5307ede562a1113..e81a212b44837f03a796f76f8face1b205160d75 100644 (file)
@@ -1568,6 +1568,10 @@ main() {
                 conf.undefine('HAVE_GLUSTERFS')
         else:
             conf.undefine('HAVE_GLUSTERFS')
+
+        conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 6" --cflags --libs',
+                       msg='Checking for glusterfs-api >= 6',
+                       uselib_store="GFAPI_VER_6")
     else:
         conf.SET_TARGET_TYPE('gfapi', 'EMPTY')
         conf.undefine('HAVE_GLUSTERFS')