summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage/posix/src')
-rw-r--r--xlators/storage/posix/src/posix-helpers.c70
-rw-r--r--xlators/storage/posix/src/posix.c23
-rw-r--r--xlators/storage/posix/src/posix.h3
3 files changed, 96 insertions, 0 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index edbf0241f26..4a062970f7d 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -1855,3 +1855,73 @@ posix_fsyncer (void *d)
}
}
}
+
+/**
+ * fetch on-disk ongoing version and object signature extended
+ * attribute.
+ */
+int32_t
+posix_get_objectsignature (char *real_path, dict_t *xattr)
+{
+ int32_t op_ret = 0;
+ char *memptr = NULL;
+ ssize_t xattrsize = 0;
+ ssize_t allocsize = 0;
+
+ op_ret = -EINVAL;
+ xattrsize = sys_lgetxattr (real_path,
+ BITROT_CURRENT_VERSION_KEY, NULL, 0);
+ if (xattrsize == -1)
+ goto error_return;
+ allocsize += xattrsize;
+
+ xattrsize = sys_lgetxattr (real_path,
+ BITROT_SIGNING_VERSION_KEY, NULL, 0);
+ if (xattrsize == -1)
+ goto error_return;
+ allocsize += xattrsize;
+
+ op_ret = -ENOMEM;
+ /* bulk alloc */
+ memptr = GF_CALLOC (allocsize + 2, sizeof (char), gf_posix_mt_char);
+ if (!memptr)
+ goto error_return;
+
+ op_ret = sys_lgetxattr (real_path, BITROT_CURRENT_VERSION_KEY,
+ memptr, allocsize - xattrsize);
+ if (op_ret == -1) {
+ op_ret = -errno;
+ goto dealloc_mem;
+ }
+
+ xattrsize = op_ret; /* save for correct _in_ memory pointing */
+
+ op_ret = sys_lgetxattr (real_path, BITROT_SIGNING_VERSION_KEY,
+ (memptr + op_ret + 1), allocsize - op_ret);
+ if (op_ret == -1) {
+ op_ret = -errno;
+ goto dealloc_mem;
+ }
+
+ /* this is a dynamic set */
+ op_ret = dict_set_dynptr (xattr, BITROT_CURRENT_VERSION_KEY,
+ memptr, allocsize);
+ if (op_ret < 0)
+ goto dealloc_mem;
+
+ /* rest all should be static */
+ op_ret = dict_set_static_ptr (xattr, BITROT_SIGNING_VERSION_KEY,
+ memptr + xattrsize + 1);
+ if (op_ret < 0)
+ goto delkey;
+
+ return allocsize;
+
+ delkey:
+ dict_del (xattr, BITROT_CURRENT_VERSION_KEY);
+ dealloc_mem:
+ GF_FREE (memptr);
+ error_return:
+ return op_ret;
+
+}
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 8001f238614..ae08adcc8e0 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -3882,6 +3882,18 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
goto done;
}
+ if (loc->inode && name
+ && (strncmp (name, GLUSTERFS_GET_OBJECT_SIGNATURE,
+ strlen (GLUSTERFS_GET_OBJECT_SIGNATURE)) == 0)) {
+ op_ret = posix_get_objectsignature (real_path, dict);
+ if (op_ret < 0) {
+ op_errno = -op_ret;
+ op_ret = -1;
+ }
+
+ goto done;
+ }
+
if (name) {
strcpy (keybuffer, name);
char *key = keybuffer;
@@ -4316,6 +4328,17 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
op_ret = -1;
}
+ if (!ret && xdata && dict_get (xdata, GLUSTERFS_DURABLE_OP)) {
+ op_ret = fsync (_fd);
+ if (op_ret < 0) {
+ op_ret = -1;
+ op_errno = errno;
+ gf_log (this->name, GF_LOG_WARNING,
+ "could not satisfy durability request: "
+ "reason (%s)", strerror (errno));
+ }
+ }
+
out:
SET_TO_OLD_FS_ID ();
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
index bdb56b1d59d..452248dd794 100644
--- a/xlators/storage/posix/src/posix.h
+++ b/xlators/storage/posix/src/posix.h
@@ -242,4 +242,7 @@ posix_pacl_set (const char *path, const char *key, const char *acl_s);
int
posix_pacl_get (const char *path, const char *key, char **acl_s);
+int32_t
+posix_get_objectsignature (char *, dict_t *);
+
#endif /* _POSIX_H */