diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 39 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 45 | ||||
| -rw-r--r-- | xlators/system/posix-acl/src/posix-acl-xattr.h | 6 | 
3 files changed, 84 insertions, 6 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index f16ecb1b6e3..0b32a20a1e5 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1272,6 +1272,39 @@ err:          return 0;  } +/* For directories, check if acl xattrs have been requested (by the acl xlator), + * if not, request for them. These xattrs are needed for dht dir self-heal to + * perform proper self-healing of dirs + */ +void +dht_check_and_set_acl_xattr_req (inode_t *inode, dict_t *xattr_req) +{ +        int     ret = 0; + +        GF_ASSERT (inode); +        GF_ASSERT (xattr_req); + +        if (inode->ia_type != IA_IFDIR) +                return; + +        if (!dict_get (xattr_req, POSIX_ACL_ACCESS_XATTR)) { +                ret = dict_set_int8 (xattr_req, POSIX_ACL_ACCESS_XATTR, 0); +                if (ret) +                        gf_log (THIS->name, GF_LOG_WARNING, +                                "failed to set key %s", +                                POSIX_ACL_ACCESS_XATTR); +        } + +        if (!dict_get (xattr_req, POSIX_ACL_DEFAULT_XATTR)) { +                ret = dict_set_int8 (xattr_req, POSIX_ACL_DEFAULT_XATTR, 0); +                if (ret) +                        gf_log (THIS->name, GF_LOG_WARNING, +                                "failed to set key %s", +                                POSIX_ACL_DEFAULT_XATTR); +        } + +        return; +}  int  dht_lookup (call_frame_t *frame, xlator_t *this, @@ -1395,6 +1428,9 @@ dht_lookup (call_frame_t *frame, xlator_t *this,                  ret = dict_set_uint32 (local->xattr_req,                                         GLUSTERFS_OPEN_FD_COUNT, 4); +                /* need it for dir self-heal */ +                dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); +  		for (i = 0; i < call_cnt; i++) {  			subvol = layout->list[i].xlator; @@ -1417,6 +1453,9 @@ dht_lookup (call_frame_t *frame, xlator_t *this,                  ret = dict_set_uint32 (local->xattr_req,                                         GLUSTERFS_OPEN_FD_COUNT, 4); +                /* need it for dir self-heal */ +                dht_check_and_set_acl_xattr_req (loc->inode, local->xattr_req); +                  if (!hashed_subvol) {                          gf_log (this->name, GF_LOG_DEBUG,                                  "no subvolume in layout for path=%s, " diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index 2ca340295d8..420af4b7f93 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -27,7 +27,6 @@  #include "xlator.h"  #include "dht-common.h" -  #define DHT_SET_LAYOUT_RANGE(layout,i,srt,chunk,cnt,path)    do {       \                  layout->list[i].start = srt;                            \                  layout->list[i].stop  = srt + chunk - 1;                \ @@ -38,7 +37,6 @@                          layout->list[i].xlator->name, path);            \          } while (0) -  static inline uint32_t  dht_find_overlap (int idx, int cnk_idx, uint32_t start, uint32_t stop,                    uint32_t chunk_size) @@ -387,6 +385,46 @@ out:          return 0;  } +void +dht_selfheal_dir_mkdir_setacl (dict_t *xattr, dict_t *dict) +{ +        data_t          *acl_default = NULL; +        data_t          *acl_access = NULL; +        xlator_t        *this = NULL; +        int     ret = -1; + +        GF_ASSERT (xattr); +        GF_ASSERT (dict); + +        this = THIS; +        GF_ASSERT (this); + +        acl_default = dict_get (xattr, POSIX_ACL_DEFAULT_XATTR); + +        if (!acl_default) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "ACL_DEFAULT xattr not present"); +                goto cont; +        } +        ret = dict_set (dict, POSIX_ACL_DEFAULT_XATTR, acl_default); +        if (ret) +                gf_log (this->name, GF_LOG_WARNING, +                        "Could not set ACL_DEFAULT xattr"); +cont: +        acl_access = dict_get (xattr, POSIX_ACL_ACCESS_XATTR); +        if (!acl_access) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "ACL_ACCESS xattr not present"); +                goto out; +        } +        ret = dict_set (dict, POSIX_ACL_ACCESS_XATTR, acl_access); +        if (ret) +                gf_log (this->name, GF_LOG_WARNING, +                        "Could not set ACL_ACCESS xattr"); + +out: +        return; +}  int  dht_selfheal_dir_mkdir (call_frame_t *frame, loc_t *loc, @@ -426,6 +464,9 @@ dht_selfheal_dir_mkdir (call_frame_t *frame, loc_t *loc,                  /* Send the dictionary from higher layers directly */                  dict = dict_ref (local->params);          } +        /* Set acls */ +        if (local->xattr && dict) +                dht_selfheal_dir_mkdir_setacl (local->xattr, dict);          if (!dict)                  gf_log (this->name, GF_LOG_WARNING, diff --git a/xlators/system/posix-acl/src/posix-acl-xattr.h b/xlators/system/posix-acl/src/posix-acl-xattr.h index 85c4e545c03..e9ef3ceb821 100644 --- a/xlators/system/posix-acl/src/posix-acl-xattr.h +++ b/xlators/system/posix-acl/src/posix-acl-xattr.h @@ -25,11 +25,9 @@  #include "common-utils.h"  #include "posix-acl.h" +#include "glusterfs.h" -#define POSIX_ACL_ACCESS_XATTR "system.posix_acl_access" -#define POSIX_ACL_DEFAULT_XATTR "system.posix_acl_default" - -#define POSIX_ACL_VERSION 2  +#define POSIX_ACL_VERSION 2  struct posix_acl_xattr_entry {          uint16_t            tag;  | 
