summaryrefslogtreecommitdiffstats
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-27 03:24:38 -0700
commit5513144feb5b062b733d7514adf194429e31666f (patch)
tree7ec8117f5b44f4c8339947740920e9e610149c7c
parentd37cb5aee7af8582d0343d2732c153226955945d (diff)
posix: Do not update unmodified xattr in (f)xattrop
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: 1211123 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/10886 Tested-by: NetBSD Build System Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
-rw-r--r--tests/volume.rc6
-rw-r--r--xlators/storage/posix/src/posix.c31
2 files changed, 27 insertions, 10 deletions
diff --git a/tests/volume.rc b/tests/volume.rc
index 9e01fff687d..5a7d0343a14 100644
--- a/tests/volume.rc
+++ b/tests/volume.rc
@@ -209,7 +209,11 @@ function check_option_help_presence {
function afr_get_changelog_xattr {
local file=$1
local xkey=$2
- getfattr -n $xkey -e hex $file 2>/dev/null | grep "$xkey" | cut -f2 -d'='
+ local xval=$(getfattr -n $xkey -e hex $file 2>/dev/null | grep "$xkey" | cut -f2 -d'=')
+ if [ -z $xval ]; then
+ xval="0x000000000000000000000000"
+ fi
+ echo $xval
}
function afr_get_pending_heal_count {
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,