system: add hole punch support to sys_fallocate()
authorDavid Disseldorp <ddiss@samba.org>
Tue, 10 Feb 2015 13:32:07 +0000 (14:32 +0100)
committerJeremy Allison <jra@samba.org>
Mon, 9 Mar 2015 20:27:07 +0000 (21:27 +0100)
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>
source3/include/vfs.h
source3/lib/system.c

index 3d0b82b508413be8ab252c9cc1ce9417fd1361ba..b2880b76253c4bfd4ef520f28b20b4c29dbd4e4c 100644 (file)
@@ -490,6 +490,7 @@ enum vfs_translate_direction {
 
 enum vfs_fallocate_flags {
        VFS_FALLOCATE_FL_KEEP_SIZE              = 0x0001,
+       VFS_FALLOCATE_FL_PUNCH_HOLE             = 0x0002,
 };
 
 /*
index fca5855ec3d6eab4b7ed807910f64681d97ab462..aba957487725f04a59b5759f4fb42524abad2cb4 100644 (file)
@@ -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