diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2015-01-07 12:08:48 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-01-08 21:55:10 -0800 | 
| commit | cf0770c61af2fa49fa435baf62cd5f28569175e4 (patch) | |
| tree | 549d7cabb784dc10434e940d8772664b0f6d7d2b /xlators/cluster | |
| parent | 05d3dfb9623f0939fa807cce3b9336a09fadab2a (diff) | |
cluster/ec: Do not modify quota, selinux xattrs in healing
Problem:
EC heal tries to heal quota-size, selinux xattrs as well.  quota-size is
private to the brick but since quotad accesses them using the standard
interface as well, they can not be filtered in the fops.
Fix:
Ignore QUOTA_SIZE_KEY and SELINUX xattrs during heal.
Change-Id: I1572f9e2fcba7f120b4265e034953a15ff297f04
BUG: 1179640
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/9401
Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 52 | 
1 files changed, 38 insertions, 14 deletions
diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index ad6417bc420..0643f250a4c 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -21,6 +21,29 @@  #include "ec-mem-types.h"  #include "ec-data.h" +static char *ec_ignore_xattrs[] = { +        GF_SELINUX_XATTR_KEY, +        QUOTA_SIZE_KEY, +        NULL +}; + +static gf_boolean_t +ec_ignorable_key_match (dict_t *dict, char *key, data_t *val, void *mdata) +{ +        int i = 0; + +        if (!key) +                goto out; + +        for (i = 0; ec_ignore_xattrs[i]; i++) { +                if (!strcmp (key, ec_ignore_xattrs[i])) +                       return _gf_true; +        } + +out: +        return _gf_false; +} +  /* FOP: heal */  void ec_heal_exclude(ec_heal_t * heal, uintptr_t mask) @@ -864,6 +887,10 @@ void ec_heal_setxattr_others(ec_heal_t * heal)          cbk = heal->lookup->answer;          xdata = cbk->xdata; +        if (dict_foreach_match (xdata, ec_ignorable_key_match, NULL, +                                dict_remove_foreach_fn, NULL) == -1) +                goto out; +          if ((cbk->iatt[0].ia_type == IA_IFREG) ||              (cbk->iatt[0].ia_type == IA_IFDIR))          { @@ -891,24 +918,21 @@ out:      ec_fop_set_error(heal->fop, error);  } -int32_t ec_heal_xattr_clean(dict_t * dict, char * key, data_t * data, -                            void * arg) +int32_t +ec_heal_xattr_clean (dict_t *dict, char *key, data_t *data, +                     void *arg)  { -    dict_t * base = arg; +        dict_t *base = arg; -    if (dict_get(base, key) == NULL) -    { -        if (dict_set_static_bin(dict, key, dict, 0) != 0) -        { -            return -1; +        if (ec_ignorable_key_match (NULL, key, NULL, NULL)) { +                dict_del (dict, key); +                return 0;          } -    } -    else -    { -        dict_del(dict, key); -    } -    return 0; +        if (dict_get (base, key) != NULL) +                dict_del (dict, key); + +        return 0;  }  void ec_heal_removexattr_others(ec_heal_t * heal)  | 
