diff options
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r-- | xlators/storage/posix/src/posix.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 2a29f167250..b235ff4a794 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -4691,22 +4691,34 @@ _posix_handle_xattr_keyvalue_pair (dict_t *d, char *k, data_t *v, goto unlock; } + /* We only write back the xattr if it has been really modified + * (i.e. v->data is not all 0's). Otherwise we return its value + * but we don't update anything. + * + * If the xattr does not exist, a value of all 0's is returned + * without creating it. */ + size = v->len; + if (mem_0filled(v->data, v->len) == 0) + goto unlock; + switch (optype) { case GF_XATTROP_ADD_ARRAY: - __add_array ((int32_t *) array, (int32_t *) v->data, - v->len / 4); + __add_array ((int32_t *) array, + (int32_t *) v->data, v->len / 4); break; case GF_XATTROP_ADD_ARRAY64: - __add_long_array ((int64_t *) array, (int64_t *) v->data, + __add_long_array ((int64_t *) array, + (int64_t *) v->data, v->len / 8); break; default: gf_log (this->name, GF_LOG_ERROR, - "Unknown xattrop type (%d) on %s. Please send " - "a bug report to gluster-devel@gluster.org", + "Unknown xattrop type (%d) on %s. " + "Please send a bug report to " + "gluster-devel@gluster.org", optype, filler->real_path); op_ret = -1; op_errno = EINVAL; @@ -4714,12 +4726,14 @@ _posix_handle_xattr_keyvalue_pair (dict_t *d, char *k, data_t *v, } if (filler->real_path) { - size = sys_lsetxattr (filler->real_path, k, array, - v->len, 0); + size = sys_lsetxattr (filler->real_path, k, + array, v->len, 0); } else { - size = sys_fsetxattr (filler->fdnum, k, (char *)array, + size = sys_fsetxattr (filler->fdnum, k, + (char *)array, v->len, 0); } + op_errno = errno; } unlock: UNLOCK (&inode->lock); @@ -4727,7 +4741,6 @@ unlock: if (op_ret == -1) goto out; - op_errno = errno; if (size == -1) { if (filler->real_path) gf_log (this->name, GF_LOG_ERROR, |