diff options
author | David Disseldorp <ddiss@samba.org> | 2015-02-09 18:21:59 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2015-03-09 21:27:07 +0100 |
commit | 12c0b6bf4055b0466d0a2962d5ac34ac60357de3 (patch) | |
tree | c9a8bed2fc463020192cd9191ea7cf615a9e0ebd /source3/lib/system.c | |
parent | 3787119eb8d85d122badb22b3bcc15ed5c32765d (diff) | |
download | samba-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.c | 21 |
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; } |