summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorSachin Prabhu <sprabhu@redhat.com>2017-11-14 15:51:44 +0530
committerJeremy Allison <jra@samba.org>2018-01-17 06:09:29 +0100
commit0edce86e97a49f4bd79f4431015ac2b788105e46 (patch)
treebaf18d3909811324315500788a11df4157d51485 /source3
parente77f8e4628ba868f09cbcf2970caac6c69fe080c (diff)
downloadsamba-0edce86e97a49f4bd79f4431015ac2b788105e46.tar.gz
vfs_glusterfs: Add fallocate support for vfs_glusterfs
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
Diffstat (limited to 'source3')
-rw-r--r--source3/modules/vfs_glusterfs.c28
-rw-r--r--source3/wscript4
2 files changed, 31 insertions, 1 deletions
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index 953c46af4cd..f9a96fa004d 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -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,
diff --git a/source3/wscript b/source3/wscript
index 0f8fe5452da..e81a212b448 100644
--- a/source3/wscript
+++ b/source3/wscript
@@ -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')