diff options
author | vmallika <vmallika@redhat.com> | 2015-12-22 16:32:49 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2016-01-07 00:20:36 -0800 |
commit | 124eac4e46cb52e4dc7e47ce4e01adddc4ff44fd (patch) | |
tree | b2aa7dba69f38e1a0b379b89fcab1021a38d67c7 /xlators/features | |
parent | 1a464c2ef3b8351e2d5217009d9a0a20e03add9a (diff) |
quota: handle quota xattr removal when quota is enabled again
This is a backport of http://review.gluster.org/#/c/13065/
When a quota is disable and enabled again before completing
the cleanup operation, this can remove the new xattrs
and quota accounting can become wrong
Remove removing the xattr, check if quota enabled again and the
xattr is new
> Change-Id: Idda216f1e7346a9b843dbc112ea3e6faa9c47483
> BUG: 1293601
> Signed-off-by: vmallika <vmallika@redhat.com>
Change-Id: Ia9e3002229427f811d6a35eabf21541f4fa057af
BUG: 1294609
Signed-off-by: vmallika <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/13109
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/features')
-rw-r--r-- | xlators/features/marker/src/marker.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 313ca737091..5504cf55c1f 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -2296,10 +2296,29 @@ out: int remove_quota_keys (dict_t *dict, char *k, data_t *v, void *data) { - call_frame_t *frame = data; - marker_local_t *local = frame->local; - xlator_t *this = frame->this; - int ret = -1; + call_frame_t *frame = data; + marker_local_t *local = frame->local; + xlator_t *this = frame->this; + marker_conf_t *priv = NULL; + char ver_str[NAME_MAX] = {0,}; + char *dot = NULL; + int ret = -1; + + priv = this->private; + + /* If quota is enabled immediately after disable. + * quota healing starts creating new xattrs + * before completing the cleanup operation. + * So we should check if the xattr is the new. + * Do not remove xattr if its xattr + * version is same as current version + */ + if ((priv->feature_enabled & GF_QUOTA) && priv->version > 0) { + snprintf (ver_str, sizeof (ver_str), ".%d", priv->version); + dot = strrchr (k, '.'); + if (dot && !strcmp(dot, ver_str)) + return 0; + } ret = syncop_removexattr (FIRST_CHILD (this), &local->loc, k, 0, NULL); if (ret) { |