summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/syscall.c70
1 files changed, 53 insertions, 17 deletions
diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c
index 48418091676..3b1376ea8ba 100644
--- a/libglusterfs/src/syscall.c
+++ b/libglusterfs/src/syscall.c
@@ -395,7 +395,7 @@ sys_llistxattr (const char *path, char *list, size_t size)
#endif
#ifdef GF_DARWIN_HOST_OS
- return listxattr (path, list, size, XATTR_NOFOLLOW);
+ return listxattr (path, list, size, XATTR_NOFOLLOW);
#endif
}
@@ -446,7 +446,6 @@ sys_fgetxattr (int filedes, const char *name, void *value, size_t size)
}
-
int
sys_fremovexattr (int filedes, const char *name)
{
@@ -455,9 +454,6 @@ sys_fremovexattr (int filedes, const char *name)
return fremovexattr (filedes, name);
#endif
- errno = ENOSYS;
- return -1;
-#if 0 /* TODO: to port to other OSes, fill in each of below */
#ifdef GF_BSD_HOST_OS
return extattr_remove_fd (filedes, EXTATTR_NAMESPACE_USER, name);
#endif
@@ -469,7 +465,6 @@ sys_fremovexattr (int filedes, const char *name)
#ifdef GF_DARWIN_HOST_OS
return fremovexattr (filedes, name, 0);
#endif
-#endif
}
@@ -492,7 +487,8 @@ sys_fsetxattr (int filedes, const char *name, const void *value,
#endif
#ifdef GF_DARWIN_HOST_OS
- return fsetxattr (filedes, name, value, size, 0, flags & ~XATTR_NOSECURITY);
+ return fsetxattr (filedes, name, value, size, 0,
+ flags & ~XATTR_NOSECURITY);
#endif
}
@@ -515,7 +511,7 @@ sys_flistxattr (int filedes, char *list, size_t size)
#endif
#ifdef GF_DARWIN_HOST_OS
- return flistxattr (filedes, list, size, XATTR_NOFOLLOW);
+ return flistxattr (filedes, list, size, XATTR_NOFOLLOW);
#endif
}
@@ -555,19 +551,59 @@ int
sys_fallocate(int fd, int mode, off_t offset, off_t len)
{
#ifdef HAVE_FALLOCATE
- return fallocate(fd, mode, offset, len);
+ return fallocate(fd, mode, offset, len);
#endif
#ifdef HAVE_POSIX_FALLOCATE
- if (mode) {
- /* keep size not supported */
- errno = EOPNOTSUPP;
- return -1;
- }
+ if (mode) {
+ /* keep size not supported */
+ errno = EOPNOTSUPP;
+ return -1;
+ }
- return posix_fallocate(fd, offset, len);
+ return posix_fallocate(fd, offset, len);
#endif
- errno = ENOSYS;
- return -1;
+#if defined(F_ALLOCATECONFIG) && defined(GF_DARWIN_HOST_OS)
+ /* C conversion from C++ implementation for OSX by Mozilla Foundation */
+ if (mode) {
+ /* keep size not supported */
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+ /*
+ * The F_PREALLOCATE command operates on the following structure:
+ *
+ * typedef struct fstore {
+ * u_int32_t fst_flags; // IN: flags word
+ * int fst_posmode; // IN: indicates offset field
+ * off_t fst_offset; // IN: start of the region
+ * off_t fst_length; // IN: size of the region
+ * off_t fst_bytesalloc; // OUT: number of bytes allocated
+ * } fstore_t;
+ *
+ * The flags (fst_flags) for the F_PREALLOCATE command are as follows:
+ * F_ALLOCATECONTIG Allocate contiguous space.
+ * F_ALLOCATEALL Allocate all requested space or no space at all.
+ *
+ * The position modes (fst_posmode) for the F_PREALLOCATE command
+ * indicate how to use the offset field. The modes are as follows:
+ * F_PEOFPOSMODE Allocate from the physical end of file.
+ * F_VOLPOSMODE Allocate from the volume offset.
+ *
+ */
+
+ int ret;
+ fstore_t store = {F_ALLOCATECONTIG, F_PEOFPOSMODE, offset, len, 0};
+ ret = fcntl (fd, F_PREALLOCATE, &store);
+ if (ret == -1) {
+ store.fst_flags = F_ALLOCATEALL;
+ ret = fcntl (fd, F_PREALLOCATE, &store);
+ }
+ if (ret == -1)
+ return ret;
+ return ftruncate (fd, offset + len);
+#endif
+ errno = ENOSYS;
+ return -1;
}