summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src
diff options
context:
space:
mode:
authorXavier Hernandez <xhernandez@datalab.es>2015-05-21 18:45:12 +0200
committerPranith Kumar Karampuri <pkarampu@redhat.com>2015-05-28 22:54:34 -0700
commit02e53c084953399a5f73905085a109b61d9606c8 (patch)
tree7102a97b006d09b28acacd1e54c4af819f4ee1f3 /xlators/storage/posix/src
parent5364a02d2dbb116952086958010ec508956b259b (diff)
posix: Do not update unmodified xattr in (f)xattrop
Backport of http://review.gluster.org/10886 If a (f)xattrop is issued with a value that only contains 0's, then we don't modify or create the extended attribute. This is useful to avoid ctime modifications when the only purpose of the xattrop was to get the current value. Change-Id: Ia62494e9009962e683c8276783f671da17a8b03a BUG: 1225320 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/10928 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src')
-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 afc11fa813c..fbbeacd28b1 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,