From 47f15b14ae4f3a9d83ed6f7c9ad31e74978e9606 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Tue, 10 Feb 2015 14:32:07 +0100 Subject: 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 Reviewed-by: Jeremy Allison --- source3/include/vfs.h | 1 + source3/lib/system.c | 11 +++++++++-- 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 -- cgit