From bdb3e709e3eec1863181339bf1a5b66b702ac1bb Mon Sep 17 00:00:00 2001 From: Junaid Date: Tue, 12 Apr 2011 10:01:28 +0000 Subject: features/marker: Filter the quota xattr's on getxattr with NULL name argument. Signed-off-by: Junaid Signed-off-by: Anand Avati BUG: 2473 (Support for volume and directory level quota) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2473 --- xlators/features/marker/src/marker-common.c | 17 ++++++++++++++++- xlators/features/marker/src/marker-common.h | 3 +++ xlators/features/marker/src/marker.c | 18 +++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/xlators/features/marker/src/marker-common.c b/xlators/features/marker/src/marker-common.c index a9431b6283b..9d27167fc0d 100644 --- a/xlators/features/marker/src/marker-common.c +++ b/xlators/features/marker/src/marker-common.c @@ -20,7 +20,7 @@ #define _CONFIG_H #include "config.h" #endif - +#include #include "marker-common.h" marker_inode_ctx_t * @@ -69,3 +69,18 @@ unlock: UNLOCK (&inode->lock); return ret; } +void +marker_filter_quota_xattr (dict_t *dict, char *key, + data_t *value, void *data) +{ + int ret = -1; + + GF_VALIDATE_OR_GOTO ("marker", dict, out); + GF_VALIDATE_OR_GOTO ("marker", key, out); + + ret = fnmatch ("trusted.glusterfs.quota*", key, 0); + if (ret == 0) + dict_del (dict, key); +out: + return; +} diff --git a/xlators/features/marker/src/marker-common.h b/xlators/features/marker/src/marker-common.h index 311e4e23832..2533571c180 100644 --- a/xlators/features/marker/src/marker-common.h +++ b/xlators/features/marker/src/marker-common.h @@ -30,4 +30,7 @@ int32_t marker_force_inode_ctx_get (inode_t *, xlator_t *, marker_inode_ctx_t **); + +void +marker_filter_quota_xattr (dict_t *, char *, data_t *, void *); #endif diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 66ef66f62cc..6e65d090fff 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -27,6 +27,7 @@ #include "marker.h" #include "marker-mem-types.h" #include "marker-quota.h" +#include "marker-common.h" void fini (xlator_t *this); @@ -263,6 +264,12 @@ int32_t marker_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno, dict_t *dict) { + if (frame->cookie) { + gf_log (this->name, GF_LOG_DEBUG, + "Filtering the quota extended attributes"); + + dict_foreach (dict, marker_filter_quota_xattr, NULL); + } STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict); return 0; } @@ -283,9 +290,18 @@ marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, ret = call_from_special_client (frame, this, name); wind: - if (ret == _gf_false) + if (ret == _gf_false) { + if (name == NULL) { + /* Signifies that marker translator + * has to filter the quota's xattr's, + * this is to prevent afr from performing + * self healing on marker-quota xattrs' + */ + frame->cookie = (void *) 1; + } STACK_WIND (frame, marker_getxattr_cbk, FIRST_CHILD(this), FIRST_CHILD(this)->fops->getxattr, loc, name); + } return 0; } -- cgit