diff options
-rw-r--r-- | source3/include/vfs.h | 1 | ||||
-rw-r--r-- | 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 |