diff options
Diffstat (limited to 'xlators/storage')
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 87 | 
1 files changed, 39 insertions, 48 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 0638f845e9d..5b7236b193f 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -1856,72 +1856,63 @@ 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) +static int32_t +posix_fetch_signature_xattr (char *real_path, const char *key, dict_t *xattr)  { -        int32_t  op_ret    = 0; +        int32_t 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); +        xattrsize = sys_lgetxattr (real_path, key, NULL, 0); +        if ((xattrsize == -1) && ((errno == ENOATTR) || (errno == ENODATA))) +                return 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); +        memptr = GF_CALLOC (xattrsize + 1, sizeof (char), gf_posix_mt_char);          if (!memptr)                  goto error_return; +        ret = sys_lgetxattr (real_path, key, memptr, xattrsize); +        if (ret == -1) +                goto freemem; -        op_ret = sys_lgetxattr (real_path, BITROT_CURRENT_VERSION_KEY, -                                memptr, allocsize - xattrsize); -        if (op_ret == -1) { -                op_ret = -errno; -                goto dealloc_mem; -        } +        ret = dict_set_dynptr (xattr, (char *)key, memptr, xattrsize); +        if (ret) +                goto freemem; -        xattrsize = op_ret; /* save for correct _in_ memory pointing */ +        return 0; -        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; -        } + freemem: +        GF_FREE (memptr); + error_return: +        return -1; +} -        /* this is a dynamic set */ -        op_ret = dict_set_dynptr (xattr, BITROT_CURRENT_VERSION_KEY, -                                  memptr, allocsize); -        if (op_ret < 0) -                goto dealloc_mem; +/** + * Fetch on-disk ongoing version and object signature extended attribute. + * Be generous to absence of xattrs (just *absence*, other errors are + * propagated up to the invoker), higher layer (br-stub) takes care of + * interpreting the xattrs for anomalies. + */ +int32_t +posix_get_objectsignature (char *real_path, dict_t *xattr) +{ +        int32_t ret = 0; -        /* rest all should be static */ -        op_ret = dict_set_static_ptr (xattr, BITROT_SIGNING_VERSION_KEY, -                                      memptr + xattrsize + 1); -        if (op_ret < 0) +        ret = posix_fetch_signature_xattr +                             (real_path, BITROT_CURRENT_VERSION_KEY, xattr); +        if (ret) +                goto error_return; + +        ret = posix_fetch_signature_xattr +                             (real_path, BITROT_SIGNING_VERSION_KEY, xattr); +        if (ret)                  goto delkey; -        return allocsize; +        return 0;   delkey:          dict_del (xattr, BITROT_CURRENT_VERSION_KEY); - dealloc_mem: -        GF_FREE (memptr);   error_return: -        return op_ret; - +        return -1;  }  | 
