summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@samba.org>2015-02-10 14:32:07 +0100
committerJeremy Allison <jra@samba.org>2015-03-09 21:27:07 +0100
commit47f15b14ae4f3a9d83ed6f7c9ad31e74978e9606 (patch)
tree59873123cbdb25eeec2e5402acd0e7d5589be3ce
parent762f9cbe60fe3a5ee6f528276c095ad736c776ee (diff)
downloadsamba-47f15b14ae4f3a9d83ed6f7c9ad31e74978e9606.tar.gz
samba-47f15b14ae4f3a9d83ed6f7c9ad31e74978e9606.tar.xz
samba-47f15b14ae4f3a9d83ed6f7c9ad31e74978e9606.zip
system: add hole punch support to sys_fallocate()
If Samba is configured with FALLOC_FL_PUNCH_HOLE support, then allow sys_fallocate() to propogate the flag to syscall invocation. Signed-off-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
-rw-r--r--source3/include/vfs.h1
-rw-r--r--source3/lib/system.c11
2 files changed, 10 insertions, 2 deletions
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 3d0b82b508..b2880b7625 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -490,6 +490,7 @@ enum vfs_translate_direction {
enum vfs_fallocate_flags {
VFS_FALLOCATE_FL_KEEP_SIZE = 0x0001,
+ VFS_FALLOCATE_FL_PUNCH_HOLE = 0x0002,
};
/*
diff --git a/source3/lib/system.c b/source3/lib/system.c
index fca5855ec3..aba9574877 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -488,6 +488,13 @@ int sys_fallocate(int fd, uint32_t mode, off_t offset, off_t len)
mode &= ~VFS_FALLOCATE_FL_KEEP_SIZE;
}
+#if defined(HAVE_FALLOC_FL_PUNCH_HOLE)
+ if (mode & VFS_FALLOCATE_FL_PUNCH_HOLE) {
+ lmode |= FALLOC_FL_PUNCH_HOLE;
+ mode &= ~VFS_FALLOCATE_FL_PUNCH_HOLE;
+ }
+#endif /* HAVE_FALLOC_FL_PUNCH_HOLE */
+
if (mode != 0) {
DEBUG(2, ("unmapped fallocate flags: %lx\n",
(unsigned long)mode));
@@ -495,11 +502,11 @@ int sys_fallocate(int fd, uint32_t mode, off_t offset, off_t len)
return -1;
}
return fallocate(fd, lmode, offset, len);
-#else
+#else /* HAVE_LINUX_FALLOCATE */
/* TODO - plumb in fallocate from other filesysetms like VXFS etc. JRA. */
errno = ENOSYS;
return -1;
-#endif
+#endif /* HAVE_LINUX_FALLOCATE */
}
#if HAVE_KERNEL_SHARE_MODES