diff options
Diffstat (limited to 'xlators/storage')
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 70 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 23 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.h | 3 | 
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 */  | 
