summaryrefslogtreecommitdiffstats
path: root/source3/lib/system.c
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@samba.org>2015-02-09 18:21:59 +0100
committerJeremy Allison <jra@samba.org>2015-03-09 21:27:07 +0100
commit12c0b6bf4055b0466d0a2962d5ac34ac60357de3 (patch)
treec9a8bed2fc463020192cd9191ea7cf615a9e0ebd /source3/lib/system.c
parent3787119eb8d85d122badb22b3bcc15ed5c32765d (diff)
downloadsamba-12c0b6bf4055b0466d0a2962d5ac34ac60357de3.tar.gz
samba-12c0b6bf4055b0466d0a2962d5ac34ac60357de3.tar.xz
samba-12c0b6bf4055b0466d0a2962d5ac34ac60357de3.zip
s3/vfs: change fallocate mode flags from enum->uint32_t
The Linux fallocate syscall offers a mode parameter which can take the following flags: FALLOC_FL_KEEP_SIZE FALLOC_FL_PUNCH_HOLE (since 2.6.38) FALLOC_FL_COLLAPSE_RANGE (since 3.15) FALLOC_FL_ZERO_RANGE (since 3.14) The flags are not exclusive, e.g. FALLOC_FL_PUNCH_HOLE must be specified alongside FALLOC_FL_KEEP_SIZE. Samba currently takes a vfs_fallocate_mode enum parameter for the VFS fallocate hook, taking either an EXTEND_SIZE or KEEP_SIZE value. This commit changes the fallocate hook such that it accepts a uint32_t flags parameter, in preparation for PUNCH_HOLE and ZERO_RANGE support. Signed-off-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/lib/system.c')
-rw-r--r--source3/lib/system.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c
index 4f3e214a54..fca5855ec3 100644
--- a/source3/lib/system.c
+++ b/source3/lib/system.c
@@ -478,18 +478,19 @@ int sys_posix_fallocate(int fd, off_t offset, off_t len)
#include <linux/falloc.h>
#endif
-int sys_fallocate(int fd, enum vfs_fallocate_mode mode, off_t offset, off_t len)
+int sys_fallocate(int fd, uint32_t mode, off_t offset, off_t len)
{
#if defined(HAVE_LINUX_FALLOCATE)
- int lmode;
- switch (mode) {
- case VFS_FALLOCATE_EXTEND_SIZE:
- lmode = 0;
- break;
- case VFS_FALLOCATE_KEEP_SIZE:
- lmode = FALLOC_FL_KEEP_SIZE;
- break;
- default:
+ int lmode = 0;
+
+ if (mode & VFS_FALLOCATE_FL_KEEP_SIZE) {
+ lmode |= FALLOC_FL_KEEP_SIZE;
+ mode &= ~VFS_FALLOCATE_FL_KEEP_SIZE;
+ }
+
+ if (mode != 0) {
+ DEBUG(2, ("unmapped fallocate flags: %lx\n",
+ (unsigned long)mode));
errno = EINVAL;
return -1;
}