summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage/posix/src/posix.c')
-rw-r--r--xlators/storage/posix/src/posix.c31
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,