diff options
| -rwxr-xr-x | tests/bugs/bug-924265.t | 35 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 124 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 17 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 12 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 42 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-linkfile.c | 7 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rebalance.c | 39 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rename.c | 5 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-selfheal.c | 8 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht.c | 19 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/nufa.c | 16 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/switch.c | 28 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 6 | 
13 files changed, 233 insertions, 125 deletions
diff --git a/tests/bugs/bug-924265.t b/tests/bugs/bug-924265.t new file mode 100755 index 00000000..13491356 --- /dev/null +++ b/tests/bugs/bug-924265.t @@ -0,0 +1,35 @@ +#!/bin/bash + +# Test that setting cluster.dht-xattr-name works, and that DHT consistently +# uses the specified name instead of the default. + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +# We only care about the exit code, so keep it quiet. +function silent_getfattr { +	getfattr $* &> /dev/null +} + +cleanup + +TEST glusterd +TEST pidof glusterd + +mkdir -p $H0:$B0/${V0}0 + +# Create a volume and set the option. +TEST $CLI volume create $V0 $H0:$B0/${V0}0 +TEST $CLI volume set $V0 cluster.dht-xattr-name trusted.foo.bar + +# Start and mount the volume. +TEST $CLI volume start $V0 +EXPECT_WITHIN 15 'Started' volinfo_field $V0 'Status'; +TEST glusterfs --volfile-server=$H0 --volfile-id=$V0 $M0 + +# Create a directory and make sure it has the right xattr. +mkdir $M0/test +TEST ! silent_getfattr -n trusted.glusterfs.dht $B0/${V0}0/test +TEST silent_getfattr -n trusted.foo.bar $B0/${V0}0/test + +cleanup diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index f95bb84e..74897b95 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -226,6 +226,7 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          int           is_dir                  = 0;          int           is_linkfile             = 0;          int           attempt_unwind          = 0; +        dht_conf_t   *conf                    = 0;          GF_VALIDATE_OR_GOTO ("dht", frame, out);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -235,6 +236,7 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local = frame->local;          prev  = cookie; +        conf = this->private;          layout = local->layout; @@ -269,7 +271,8 @@ dht_discover_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          goto unlock;                  } -                is_linkfile = check_is_linkfile (inode, stbuf, xattr); +                is_linkfile = check_is_linkfile (inode, stbuf, xattr, +                                                 conf->link_xattr_name);                  is_dir = check_is_dir (inode, stbuf, xattr);                  if (is_dir) { @@ -328,23 +331,20 @@ dht_discover (call_frame_t *frame, xlator_t *this, loc_t *loc)          int          i = 0;          call_frame_t *discover_frame = NULL; -          conf = this->private;          local = frame->local; -        ret = dict_set_uint32 (local->xattr_req, -                               "trusted.glusterfs.dht", 4 * 4); +        ret = dict_set_uint32 (local->xattr_req, conf->xattr_name, 4 * 4);          if (ret)                  gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to set 'trusted.glusterfs.dht' key", -                        loc->path); +                        "%s: failed to set '%s' key", +                        loc->path, conf->xattr_name); -        ret = dict_set_uint32 (local->xattr_req, -                               "trusted.glusterfs.dht.linkto", 256); +        ret = dict_set_uint32 (local->xattr_req, conf->link_xattr_name, 256);          if (ret)                  gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to set 'trusted.glusterfs.dht.linkto' key", -                        loc->path); +                        "%s: failed to set '%s' key", +                        loc->path, conf->link_xattr_name);          call_cnt        = conf->subvolume_cnt;          local->call_cnt = call_cnt; @@ -585,7 +585,8 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  layout = local->layout;                  is_dir = check_is_dir (inode, stbuf, xattr); -                is_linkfile = check_is_linkfile (inode, stbuf, xattr); +                is_linkfile = check_is_linkfile (inode, stbuf, xattr, +                                                 conf->link_xattr_name);                  if (is_linkfile) {                          gf_log (this->name, GF_LOG_INFO, @@ -597,7 +598,7 @@ dht_revalidate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  }                  if (is_dir) { -                        ret = dht_dir_has_layout (xattr); +                        ret = dht_dir_has_layout (xattr, conf->xattr_name);                          if (ret >= 0) {                                  if (is_greater_time(local->stbuf.ia_ctime,                                                      local->stbuf.ia_ctime_nsec, @@ -886,7 +887,7 @@ dht_lookup_everywhere_done (call_frame_t *frame, xlator_t *this)                  hashed_subvol->name);          ret = dht_linkfile_create (frame, -                                   dht_lookup_linkfile_create_cbk, +                                   dht_lookup_linkfile_create_cbk, this,                                     cached_subvol, hashed_subvol, &local->loc);          return ret; @@ -924,8 +925,9 @@ dht_lookup_everywhere_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          xlator_t     *subvol        = NULL;          loc_t        *loc           = NULL;          xlator_t     *link_subvol   = NULL; -        int           ret = -1; -        int32_t       fd_count = 0; +        int           ret           = -1; +        int32_t       fd_count      = 0; +        dht_conf_t   *conf          = NULL;          GF_VALIDATE_OR_GOTO ("dht", frame, out);          GF_VALIDATE_OR_GOTO ("dht", this, out); @@ -935,6 +937,7 @@ dht_lookup_everywhere_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          local  = frame->local;          loc    = &local->loc; +        conf   = this->private;          prev   = cookie;          subvol = prev->this; @@ -956,7 +959,8 @@ dht_lookup_everywhere_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                                  loc->path, prev->this->name);                  } -                is_linkfile = check_is_linkfile (inode, buf, xattr); +                is_linkfile = check_is_linkfile (inode, buf, xattr, +                                                 conf->link_xattr_name);                  is_dir = check_is_dir (inode, buf, xattr);                  if (is_linkfile) { @@ -1117,7 +1121,7 @@ dht_lookup_linkfile_cbk (call_frame_t *frame, void *cookie,                  goto err;          } -        if (check_is_linkfile (inode, stbuf, xattr)) { +        if (check_is_linkfile (inode, stbuf, xattr, conf->link_xattr_name)) {                  gf_log (this->name, GF_LOG_INFO,                          "lookup of %s on %s (following linkfile) reached link",                          local->loc.path, subvol->name); @@ -1294,7 +1298,8 @@ dht_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto out;          } -        is_linkfile = check_is_linkfile (inode, stbuf, xattr); +        is_linkfile = check_is_linkfile (inode, stbuf, xattr, +                                         conf->link_xattr_name);          if (!is_linkfile) {                  /* non-directory and not a linkfile */ @@ -1474,7 +1479,7 @@ dht_lookup (call_frame_t *frame, xlator_t *this,                   *       revalidates directly go to the cached-subvolume.                   */                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  if (IA_ISDIR (local->inode->ia_type)) {                          local->call_cnt = call_cnt = conf->subvolume_cnt; @@ -1509,10 +1514,10 @@ dht_lookup (call_frame_t *frame, xlator_t *this,          do_fresh_lookup:                  /* TODO: remove the hard-coding */                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  ret = dict_set_uint32 (local->xattr_req, -                                       DHT_LINKFILE_KEY, 256); +                                       conf->link_xattr_name, 256);                  /* need it for self-healing linkfiles which is                     'in-migration' state */ @@ -2009,10 +2014,13 @@ dht_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  {          int             this_call_cnt = 0;          dht_local_t     *local = NULL; +        dht_conf_t      *conf = NULL;          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (frame->local, out); +        VALIDATE_OR_GOTO (this->private, out); +        conf = this->private;          local = frame->local;          this_call_cnt = dht_frame_return (frame); @@ -2020,8 +2028,8 @@ dht_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (!xattr || (op_ret == -1))                  goto out; -        if (dict_get (xattr, "trusted.glusterfs.dht")) { -                dict_del (xattr, "trusted.glusterfs.dht"); +        if (dict_get (xattr, conf->xattr_name)) { +                dict_del (xattr, conf->xattr_name);          }          local->op_ret = 0; @@ -2308,13 +2316,17 @@ dht_fsetxattr (call_frame_t *frame, xlator_t *this,          xlator_t     *subvol   = NULL;          dht_local_t  *local    = NULL;          int           op_errno = EINVAL; +        dht_conf_t   *conf     = NULL;          VALIDATE_OR_GOTO (frame, err);          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (fd, err);          VALIDATE_OR_GOTO (fd->inode, err); +        VALIDATE_OR_GOTO (this->private, err); -        GF_IF_INTERNAL_XATTR_GOTO ("trusted.glusterfs.dht*", xattr, +        conf = this->private; + +        GF_IF_INTERNAL_XATTR_GOTO (conf->wild_xattr_name, xattr,                                     op_errno, err);          local = dht_local_init (frame, NULL, fd, GF_FOP_FSETXATTR); @@ -2420,10 +2432,11 @@ dht_setxattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (loc->inode, err);          VALIDATE_OR_GOTO (loc->path, err); -        GF_IF_INTERNAL_XATTR_GOTO ("trusted.glusterfs.dht*", xattr, +        conf   = this->private; + +        GF_IF_INTERNAL_XATTR_GOTO (conf->wild_xattr_name, xattr,                                     op_errno, err); -        conf   = this->private;          local = dht_local_init (frame, loc, NULL, GF_FOP_SETXATTR);          if (!local) {                  op_errno = ENOMEM; @@ -2636,13 +2649,16 @@ dht_removexattr (call_frame_t *frame, xlator_t *this,          dht_local_t  *local = NULL;          dht_layout_t *layout = NULL;          int           call_cnt = 0; +        dht_conf_t   *conf = NULL;          int i;          VALIDATE_OR_GOTO (this, err); +        VALIDATE_OR_GOTO (this->private, err); -        GF_IF_NATIVE_XATTR_GOTO ("trusted.glusterfs.dht*", -                                 key, op_errno, err); +        conf = this->private; + +        GF_IF_NATIVE_XATTR_GOTO (conf->wild_xattr_name, key, op_errno, err);          VALIDATE_OR_GOTO (frame, err);          VALIDATE_OR_GOTO (loc, err); @@ -2699,13 +2715,16 @@ dht_fremovexattr (call_frame_t *frame, xlator_t *this,          dht_local_t  *local = NULL;          dht_layout_t *layout = NULL;          int           call_cnt = 0; +        dht_conf_t   *conf = 0;          int i;          VALIDATE_OR_GOTO (this, err); +        VALIDATE_OR_GOTO (this->private, err); -        GF_IF_NATIVE_XATTR_GOTO ("trusted.glusterfs.dht*", -                                 key, op_errno, err); +        conf = this->private; + +        GF_IF_NATIVE_XATTR_GOTO (conf->wild_xattr_name, key, op_errno, err);          VALIDATE_OR_GOTO (frame, err); @@ -2996,10 +3015,13 @@ dht_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,          list_for_each_entry (orig_entry, (&orig_entries->list), list) {                  next_offset = orig_entry->d_off; -                if ((check_is_dir (NULL, (&orig_entry->d_stat), NULL) && -                     (prev->this != dht_first_up_subvol (this))) || -                    check_is_linkfile (NULL, (&orig_entry->d_stat), -                                       orig_entry->dict)) { +                if (check_is_dir (NULL, (&orig_entry->d_stat), NULL) && +                    (prev->this != dht_first_up_subvol (this))) { +                        continue; +                } +                if (check_is_linkfile (NULL, (&orig_entry->d_stat), +                                       orig_entry->dict, +                                       conf->link_xattr_name)) {                          continue;                  } @@ -3215,6 +3237,7 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,          VALIDATE_OR_GOTO (frame, err);          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (fd, err); +        VALIDATE_OR_GOTO (this->private, err);          conf = this->private; @@ -3239,12 +3262,11 @@ dht_do_readdir (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,                  if (local->xattr) {                          ret = dict_set_uint32 (local->xattr, -                                               "trusted.glusterfs.dht.linkto", -                                               256); +                                               conf->link_xattr_name, 256);                          if (ret)                                  gf_log (this->name, GF_LOG_WARNING, -                                        "failed to set 'glusterfs.dht.linkto'" -                                        " key"); +                                        "failed to set '%s' key", +                                        conf->link_xattr_name);  			if (conf->readdir_optimize == _gf_true) {                                  if (xvol != dht_first_up_subvol (this)) {  				        ret = dict_set_int32 (local->xattr, @@ -3522,7 +3544,7 @@ dht_mknod (call_frame_t *frame, xlator_t *this,                          local->umask = umask;                          dht_linkfile_create (frame,                                               dht_mknod_linkfile_create_cbk, -                                             avail_subvol, subvol, loc); +                                             this, avail_subvol, subvol, loc);                  } else {                          gf_log (this->name, GF_LOG_TRACE,                                  "creating %s on %s", loc->path, subvol->name); @@ -3781,7 +3803,7 @@ dht_link (call_frame_t *frame, xlator_t *this,          if (hashed_subvol != cached_subvol) {                  uuid_copy (local->gfid, oldloc->inode->gfid); -                dht_linkfile_create (frame, dht_link_linkfile_cbk, +                dht_linkfile_create (frame, dht_link_linkfile_cbk, this,                                       cached_subvol, hashed_subvol, newloc);          } else {                  STACK_WIND (frame, dht_link_cbk, @@ -3942,9 +3964,8 @@ dht_create (call_frame_t *frame, xlator_t *this,                  gf_log (this->name, GF_LOG_TRACE,                          "creating %s on %s (link at %s)", loc->path,                          avail_subvol->name, subvol->name); -                dht_linkfile_create (frame, -                                     dht_create_linkfile_create_cbk, -                                     avail_subvol, subvol, loc); +                dht_linkfile_create (frame, dht_create_linkfile_create_cbk, +                                     this, avail_subvol, subvol, loc);                  goto done;          }          gf_log (this->name, GF_LOG_TRACE, @@ -4483,6 +4504,7 @@ dht_rmdir_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          call_frame_t   *main_frame = NULL;          dht_local_t    *main_local = NULL;          int             this_call_cnt = 0; +        dht_conf_t     *conf = this->private;          local = frame->local;          prev  = cookie; @@ -4494,7 +4516,7 @@ dht_rmdir_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret != 0)                  goto err; -        if (check_is_linkfile (inode, stbuf, xattr) == 0) { +        if (!check_is_linkfile (inode, stbuf, xattr, conf->link_xattr_name)) {                  main_local->op_ret  = -1;                  main_local->op_errno = ENOTEMPTY; @@ -4529,6 +4551,7 @@ dht_rmdir_is_subvol_empty (call_frame_t *frame, xlator_t *this,          dht_local_t        *lookup_local = NULL;          dht_local_t        *local = NULL;          dict_t             *xattrs = NULL; +        dht_conf_t         *conf = this->private;          local = frame->local; @@ -4537,7 +4560,8 @@ dht_rmdir_is_subvol_empty (call_frame_t *frame, xlator_t *this,                          continue;                  if (strcmp (trav->d_name, "..") == 0)                          continue; -                if (check_is_linkfile (NULL, (&trav->d_stat), trav->dict)) { +                if (check_is_linkfile (NULL, (&trav->d_stat), trav->dict, +                                              conf->link_xattr_name)) {                          ret++;                          continue;                  } @@ -4555,7 +4579,7 @@ dht_rmdir_is_subvol_empty (call_frame_t *frame, xlator_t *this,                  return -1;          } -        ret = dict_set_uint32 (xattrs, DHT_LINKFILE_KEY, 256); +        ret = dict_set_uint32 (xattrs, conf->link_xattr_name, 256);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "failed to set linkto key"                          " in dict"); @@ -4678,6 +4702,7 @@ dht_rmdir_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          call_frame_t *prev = NULL;          dict_t       *dict = NULL;          int           ret = 0; +        dht_conf_t   *conf = this->private;          local = frame->local;          prev  = cookie; @@ -4701,12 +4726,11 @@ dht_rmdir_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  goto err;          } -        ret = dict_set_uint32 (dict, -                               "trusted.glusterfs.dht.linkto", 256); +        ret = dict_set_uint32 (dict, conf->link_xattr_name, 256);          if (ret)                  gf_log (this->name, GF_LOG_WARNING, -                        "%s: failed to set 'trusted.glusterfs.dht.linkto' key", -                        local->loc.path); +                        "%s: failed to set '%s' key", +                        local->loc.path, conf->link_xattr_name);          STACK_WIND (frame, dht_rmdir_readdirp_cbk,                      prev->this, prev->this->fops->readdirp, diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 65983c0c..3679918d 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -290,6 +290,11 @@ struct dht_conf {          gf_boolean_t    rsync_regex_valid;          regex_t         extra_regex;          gf_boolean_t    extra_regex_valid; + +        /* Support variable xattr names. */ +        char            *xattr_name; +        char            *link_xattr_name; +        char            *wild_xattr_name;  };  typedef struct dht_conf dht_conf_t; @@ -320,13 +325,12 @@ typedef enum {  #define DHT_MIGRATION_IN_PROGRESS 1  #define DHT_MIGRATION_COMPLETED   2 -#define DHT_LINKFILE_KEY         "trusted.glusterfs.dht.linkto"  #define DHT_LINKFILE_MODE        (S_ISVTX) -#define check_is_linkfile(i,s,x) (                                      \ +#define check_is_linkfile(i,s,x,n) (                                      \                  ((st_mode_from_ia ((s)->ia_prot, (s)->ia_type) & ~S_IFMT) \ -                 == DHT_LINKFILE_MODE) &&                               \ -                dict_get (x, DHT_LINKFILE_KEY)) +                 == DHT_LINKFILE_MODE) &&                                 \ +                dict_get (x, n))  #define IS_DHT_MIGRATION_PHASE2(buf)  (                                 \                  IA_ISREG ((buf)->ia_type) &&                            \ @@ -438,7 +442,8 @@ int       dht_subvol_cnt (xlator_t *this, xlator_t *subvol);  int dht_hash_compute (xlator_t *this, int type, const char *name, uint32_t *hash_p);  int dht_linkfile_create (call_frame_t    *frame, fop_mknod_cbk_t linkfile_cbk, -                         xlator_t        *tovol, xlator_t *fromvol, loc_t *loc); +                         xlator_t        *this, xlator_t *tovol, +                         xlator_t        *fromvol, loc_t *loc);  int                                       dht_lookup_directory (call_frame_t *frame, xlator_t *this, loc_t *loc);  int                                       dht_lookup_everywhere (call_frame_t *frame, xlator_t *this, loc_t *loc);  int @@ -740,7 +745,7 @@ dht_dir_attr_heal (void *data);  int  dht_dir_attr_heal_done (int ret, call_frame_t *sync_frame, void *data);  int -dht_dir_has_layout (dict_t *xattr); +dht_dir_has_layout (dict_t *xattr, char *name);  gf_boolean_t  dht_is_subvol_in_layout (dht_layout_t *layout, xlator_t *xlator);  xlator_t * diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index ecd06e39..4f50e214 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -620,10 +620,12 @@ dht_migration_complete_check_task (void *data)          call_frame_t *frame    = NULL;          loc_t         tmp_loc  = {0,};          char         *path     = NULL; +        dht_conf_t   *conf     = NULL;          this  = THIS;          frame = data;          local = frame->local; +        conf = this->private;          src_node = local->cached_subvol; @@ -633,10 +635,10 @@ dht_migration_complete_check_task (void *data)          /* getxattr on cached_subvol for 'linkto' value */          if (!local->loc.inode)                  ret = syncop_fgetxattr (src_node, local->fd, &dict, -                                        DHT_LINKFILE_KEY); +                                        conf->link_xattr_name);          else                  ret = syncop_getxattr (src_node, &local->loc, &dict, -                                       DHT_LINKFILE_KEY); +                                       conf->link_xattr_name);          if (!ret)                  dst_node = dht_linkfile_subvol (this, NULL, NULL, dict); @@ -801,10 +803,12 @@ dht_rebalance_inprogress_task (void *data)          char         *path     = NULL;          struct iatt   stbuf    = {0,};          loc_t         tmp_loc  = {0,}; +        dht_conf_t   *conf     = NULL;          this  = THIS;          frame = data;          local = frame->local; +        conf = this->private;          src_node = local->cached_subvol; @@ -814,10 +818,10 @@ dht_rebalance_inprogress_task (void *data)          /* getxattr on cached_subvol for 'linkto' value */          if (local->loc.inode)                  ret = syncop_getxattr (src_node, &local->loc, &dict, -                                       DHT_LINKFILE_KEY); +                                       conf->link_xattr_name);          else                  ret = syncop_fgetxattr (src_node, local->fd, &dict, -                                        DHT_LINKFILE_KEY); +                                        conf->link_xattr_name);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index 71aa1b70..7d53e3d0 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -335,11 +335,12 @@ int  dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,                    int op_ret, int op_errno, dict_t *xattr)  { -        int      i     = 0; -        int      ret   = -1; -        int      err   = -1; -        void    *disk_layout_raw = NULL; -        int      disk_layout_len = 0; +        int         i     = 0; +        int         ret   = -1; +        int         err   = -1; +        void       *disk_layout_raw = NULL; +        int         disk_layout_len = 0; +        dht_conf_t *conf = this->private;          if (op_ret != 0) {                  err = op_errno; @@ -360,7 +361,7 @@ dht_layout_merge (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,          if (xattr) {                  /* during lookup and not mkdir */ -                ret = dict_get_ptr_and_len (xattr, "trusted.glusterfs.dht", +                ret = dict_get_ptr_and_len (xattr, conf->xattr_name,  					    &disk_layout_raw, &disk_layout_len);          } @@ -650,30 +651,29 @@ out:  }  int -dht_dir_has_layout (dict_t *xattr) +dht_dir_has_layout (dict_t *xattr, char *name)  {          void     *disk_layout_raw = NULL; -        return dict_get_ptr (xattr, "trusted.glusterfs.dht", -                             &disk_layout_raw); - +        return dict_get_ptr (xattr, name, &disk_layout_raw);  }  int  dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,                           loc_t *loc, dict_t *xattr)  { -        int       idx = 0; -        int       pos = -1; -        int       ret = 0; -        int       err = 0; -        int       dict_ret = 0; -        int32_t   disk_layout[4]; -        void     *disk_layout_raw = NULL; -        int32_t   count = -1; -        uint32_t  start_off = -1; -        uint32_t  stop_off = -1; +        int         idx = 0; +        int         pos = -1; +        int         ret = 0; +        int         err = 0; +        int         dict_ret = 0; +        int32_t     disk_layout[4]; +        void       *disk_layout_raw = NULL; +        int32_t     count = -1; +        uint32_t    start_off = -1; +        uint32_t    stop_off = -1; +        dht_conf_t *conf = this->private;          for (idx = 0; idx < layout->cnt; idx++) { @@ -703,7 +703,7 @@ dht_layout_dir_mismatch (xlator_t *this, dht_layout_t *layout, xlator_t *subvol,                  goto out;          } -        dict_ret = dict_get_ptr (xattr, "trusted.glusterfs.dht", +        dict_ret = dict_get_ptr (xattr, conf->xattr_name,                                   &disk_layout_raw);          if (dict_ret < 0) { diff --git a/xlators/cluster/dht/src/dht-linkfile.c b/xlators/cluster/dht/src/dht-linkfile.c index 67d6ce58..b4a074b6 100644 --- a/xlators/cluster/dht/src/dht-linkfile.c +++ b/xlators/cluster/dht/src/dht-linkfile.c @@ -43,12 +43,14 @@ dht_linkfile_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int  dht_linkfile_create (call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk, +                     xlator_t *this,                       xlator_t *tovol, xlator_t *fromvol, loc_t *loc)  {          dht_local_t *local = NULL;          dict_t      *dict = NULL;          int          need_unref = 0;          int          ret = 0; +        dht_conf_t  *conf = this->private;          local = frame->local;          local->linkfile.linkfile_cbk = linkfile_cbk; @@ -76,8 +78,7 @@ dht_linkfile_create (call_frame_t *frame, fop_mknod_cbk_t linkfile_cbk,                  gf_log ("dht-linkfile", GF_LOG_INFO,                          "%s: internal-fop set failed", loc->path); -        ret = dict_set_str (dict, "trusted.glusterfs.dht.linkto", -                                   tovol->name); +        ret = dict_set_str (dict, conf->link_xattr_name, tovol->name);          if (ret < 0) {                  gf_log (frame->this->name, GF_LOG_INFO, @@ -179,7 +180,7 @@ dht_linkfile_subvol (xlator_t *this, inode_t *inode, struct iatt *stbuf,          if (!xattr)                  goto out; -        ret = dict_get_ptr (xattr, "trusted.glusterfs.dht.linkto", &volname); +        ret = dict_get_ptr (xattr, conf->link_xattr_name, &volname);          if ((-1 == ret) || !volname)                  goto out; diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index af31072a..370118f9 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -102,12 +102,16 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t  *xattrs,          data_t                 *data            = NULL;          struct iatt             iatt            = {0,};          int32_t                 op_errno        = 0; +        dht_conf_t             *conf            = NULL;          GF_VALIDATE_OR_GOTO ("defrag", loc, out);          GF_VALIDATE_OR_GOTO ("defrag", loc->name, out);          GF_VALIDATE_OR_GOTO ("defrag", stbuf, out);          GF_VALIDATE_OR_GOTO ("defrag", this, out);          GF_VALIDATE_OR_GOTO ("defrag", xattrs, out); +        GF_VALIDATE_OR_GOTO ("defrag", this->private, out); + +        conf = this->private;          if (uuid_is_null (loc->pargfid)) {                  gf_log ("", GF_LOG_ERROR, "loc->pargfid is NULL for " @@ -138,10 +142,10 @@ gf_defrag_handle_hardlink (xlator_t *this, loc_t *loc, dict_t  *xattrs,          gf_log (this->name, GF_LOG_INFO, "Attempting to migrate hardlink %s "                  "with gfid %s from %s -> %s", loc->name, uuid_utoa (loc->gfid),                  cached_subvol->name, hashed_subvol->name); -        data = dict_get (xattrs, DHT_LINKFILE_KEY); +        data = dict_get (xattrs, conf->link_xattr_name);          /* set linkto on cached -> hashed if not present, else link it */          if (!data) { -                ret = dict_set_str (xattrs, DHT_LINKFILE_KEY, +                ret = dict_set_str (xattrs, conf->link_xattr_name,                                      hashed_subvol->name);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR, "Failed to set " @@ -241,12 +245,14 @@ static inline int  __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struct iatt *stbuf,                                   dict_t *dict, fd_t **dst_fd)  { -        xlator_t *this = NULL; -        int       ret  = -1; -        fd_t     *fd   = NULL; -        struct iatt new_stbuf = {0,}; +        xlator_t    *this = NULL; +        int          ret  = -1; +        fd_t        *fd   = NULL; +        struct iatt  new_stbuf = {0,}; +        dht_conf_t  *conf = NULL;          this = THIS; +        conf = this->private;          ret = dict_set_static_bin (dict, "gfid-req", stbuf->ia_gfid, 16);          if (ret) { @@ -255,7 +261,7 @@ __dht_rebalance_create_dst_file (xlator_t *to, xlator_t *from, loc_t *loc, struc                  goto out;          } -        ret = dict_set_str (dict, DHT_LINKFILE_KEY, from->name); +        ret = dict_set_str (dict, conf->link_xattr_name, from->name);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "%s: failed to set gfid in dict for create", loc->path); @@ -449,8 +455,10 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc,          dict_t      *dict = NULL;          xlator_t    *this = NULL;          struct iatt  iatt = {0,}; +        dht_conf_t  *conf = NULL;          this = THIS; +        conf = this->private;          fd = fd_create (loc->inode, DHT_REBALANCE_PID);          if (!fd) { @@ -473,7 +481,7 @@ __dht_rebalance_open_src_file (xlator_t *from, xlator_t *to, loc_t *loc,          if (!dict)                  goto out; -        ret = dict_set_str (dict, DHT_LINKFILE_KEY, to->name); +        ret = dict_set_str (dict, conf->link_xattr_name, to->name);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "failed to set xattr in dict for %s (linkto:%s)", @@ -526,12 +534,13 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc,          dict_t      *dict     = NULL;          char        *link     = NULL;          struct iatt  stbuf    = {0,}; +        dht_conf_t  *conf     = this->private;          dict = dict_new ();          if (!dict)                  goto out; -        ret = dict_set_int32 (dict, DHT_LINKFILE_KEY, 256); +        ret = dict_set_int32 (dict, conf->link_xattr_name, 256);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "%s: failed to set 'linkto' key in dict", loc->path); @@ -547,12 +556,13 @@ migrate_special_files (xlator_t *this, xlator_t *from, xlator_t *to, loc_t *loc,          }          /* we no more require this key */ -        dict_del (dict, DHT_LINKFILE_KEY); +        dict_del (dict, conf->link_xattr_name);          /* file exists in target node, only if it is 'linkfile' its valid,             otherwise, error out */          if (!ret) { -                if (!check_is_linkfile (loc->inode, &stbuf, rsp_dict)) { +                if (!check_is_linkfile (loc->inode, &stbuf, rsp_dict, +                                        conf->link_xattr_name)) {                          gf_log (this->name, GF_LOG_WARNING,                                  "%s: file exists in destination", loc->path);                          ret = -1; @@ -647,6 +657,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          dict_t         *xattr          = NULL;          dict_t         *xattr_rsp      = NULL;          int             file_has_holes = 0; +        dht_conf_t     *conf           = this->private;          gf_log (this->name, GF_LOG_INFO, "%s: attempting to move from %s to %s",                  loc->path, from->name, to->name); @@ -655,7 +666,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          if (!dict)                  goto out; -        ret = dict_set_int32 (dict, DHT_LINKFILE_KEY, 256); +        ret = dict_set_int32 (dict, conf->link_xattr_name, 256);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR,                          "%s: failed to set 'linkto' key in dict", loc->path); @@ -671,7 +682,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          }          /* we no more require this key */ -        dict_del (dict, DHT_LINKFILE_KEY); +        dict_del (dict, conf->link_xattr_name);          /* preserve source mode, so set the same to the destination */          src_ia_prot = stbuf.ia_prot; @@ -842,7 +853,7 @@ dht_migrate_file (xlator_t *this, loc_t *loc, xlator_t *from, xlator_t *to,          }          /* remove the 'linkto' xattr from the destination */ -        ret = syncop_fremovexattr (to, dst_fd, DHT_LINKFILE_KEY); +        ret = syncop_fremovexattr (to, dst_fd, conf->link_xattr_name);          if (ret) {                  gf_log (this->name, GF_LOG_WARNING,                          "%s: failed to perform removexattr on %s (%s)", diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c index 35fedeaa..fd0208f7 100644 --- a/xlators/cluster/dht/src/dht-rename.c +++ b/xlators/cluster/dht/src/dht-rename.c @@ -505,7 +505,8 @@ dht_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  uuid_copy (link_local->gfid, local->loc.inode->gfid);                  dht_linkfile_create (link_frame, dht_rename_links_create_cbk, -                                     src_cached, dst_hashed, &link_local->loc); +                                     this, src_cached, dst_hashed, +                                     &link_local->loc);          }  err: @@ -759,7 +760,7 @@ dht_rename_create_links (call_frame_t *frame)                          "linkfile %s @ %s => %s",                          local->loc.path, dst_hashed->name, src_cached->name);                  memcpy (local->gfid, local->loc.inode->gfid, 16); -		dht_linkfile_create (frame, dht_rename_links_cbk, +		dht_linkfile_create (frame, dht_rename_links_cbk, this,  				     src_cached, dst_hashed, &local->loc);  	} diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index b8d873aa..e1e962ab 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -124,7 +124,7 @@ dht_selfheal_dir_xattr_persubvol (call_frame_t *frame, loc_t *loc,          xlator_t          *this = NULL;          int32_t           *disk_layout = NULL;          dht_local_t       *local = NULL; - +        dht_conf_t        *conf = NULL;          local = frame->local;          if (req_subvol) @@ -137,6 +137,9 @@ dht_selfheal_dir_xattr_persubvol (call_frame_t *frame, loc_t *loc,          GF_VALIDATE_OR_GOTO (this->name, layout, err);          GF_VALIDATE_OR_GOTO (this->name, local, err);          GF_VALIDATE_OR_GOTO (this->name, subvol, err); +        VALIDATE_OR_GOTO (this->private, err); + +        conf = this->private;          xattr = get_new_dict ();          if (!xattr) { @@ -151,8 +154,7 @@ dht_selfheal_dir_xattr_persubvol (call_frame_t *frame, loc_t *loc,                  goto err;          } -        ret = dict_set_bin (xattr, "trusted.glusterfs.dht", -                            disk_layout, 4 * 4); +        ret = dict_set_bin (xattr, conf->xattr_name, disk_layout, 4 * 4);          if (ret == -1) {                  gf_log (this->name, GF_LOG_WARNING,                          "%s: (subvol %s) failed to set xattr dictionary", diff --git a/xlators/cluster/dht/src/dht.c b/xlators/cluster/dht/src/dht.c index 14f3eb1d..777086ab 100644 --- a/xlators/cluster/dht/src/dht.c +++ b/xlators/cluster/dht/src/dht.c @@ -489,6 +489,7 @@ init (xlator_t *this)          if (!conf) {                  goto err;          } +        memset (conf, 0, sizeof(*conf));          ret = dict_get_int32 (this->options, "rebalance-cmd", &cmd); @@ -602,6 +603,13 @@ init (xlator_t *this)                  goto err;          } +        GF_OPTION_INIT ("xattr-name", conf->xattr_name, str, err); +        gf_asprintf (&conf->link_xattr_name, "%s.linkto", conf->xattr_name); +        gf_asprintf (&conf->wild_xattr_name, "%s*", conf->xattr_name); +        if (!conf->link_xattr_name || !conf->wild_xattr_name) { +                goto err; +        } +          this->private = conf;          return 0; @@ -623,6 +631,10 @@ err:                  GF_FREE (conf->defrag); +                GF_FREE (conf->xattr_name); +                GF_FREE (conf->link_xattr_name); +                GF_FREE (conf->wild_xattr_name); +                  GF_FREE (conf);          } @@ -781,6 +793,13 @@ struct volume_options options[] = {          { .key = {"rebalance-filter"},            .type = GF_OPTION_TYPE_STR,          }, +        { .key = {"xattr-name"}, +          .type = GF_OPTION_TYPE_STR, +          .default_value = "trusted.glusterfs.dht", +          .description = "Base for extended attributes used by this " +          "translator instance, to avoid conflicts with others above or " +          "below it." +        },          { .key  = {NULL} },  }; diff --git a/xlators/cluster/dht/src/nufa.c b/xlators/cluster/dht/src/nufa.c index 52086e26..19f16d78 100644 --- a/xlators/cluster/dht/src/nufa.c +++ b/xlators/cluster/dht/src/nufa.c @@ -52,7 +52,8 @@ nufa_local_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1)                  goto out; -        is_linkfile = check_is_linkfile (inode, stbuf, xattr); +        is_linkfile = check_is_linkfile (inode, stbuf, xattr, +                                         conf->link_xattr_name);          is_dir      = check_is_dir (inode, stbuf, xattr);          if (!is_dir && !is_linkfile) { @@ -201,7 +202,7 @@ nufa_lookup (call_frame_t *frame, xlator_t *this,                   *       revalidates directly go to the cached-subvolume.                   */                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  if (ret < 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to set dict value."); @@ -222,7 +223,7 @@ nufa_lookup (call_frame_t *frame, xlator_t *this,          } else {          do_fresh_lookup:                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  if (ret < 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to set dict value."); @@ -231,7 +232,7 @@ nufa_lookup (call_frame_t *frame, xlator_t *this,                  }                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht.linkto", 256); +                                       conf->link_xattr_name, 256);                  if (ret < 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to set dict value."); @@ -330,9 +331,8 @@ nufa_create (call_frame_t *frame, xlator_t *this,                  local->flags = flags;                  local->umask = umask;                  local->cached_subvol = avail_subvol; -                dht_linkfile_create (frame, -                                     nufa_create_linkfile_create_cbk, -                                     avail_subvol, subvol, loc); +                dht_linkfile_create (frame, nufa_create_linkfile_create_cbk, +                                     this, avail_subvol, subvol, loc);                  return 0;          } @@ -437,7 +437,7 @@ nufa_mknod (call_frame_t *frame, xlator_t *this,                  local->rdev = rdev;                  local->cached_subvol = avail_subvol; -                dht_linkfile_create (frame, nufa_mknod_linkfile_cbk, +                dht_linkfile_create (frame, nufa_mknod_linkfile_cbk, this,                                       avail_subvol, subvol, loc);                  return 0;          } diff --git a/xlators/cluster/dht/src/switch.c b/xlators/cluster/dht/src/switch.c index 6ec34310..8e0b6988 100644 --- a/xlators/cluster/dht/src/switch.c +++ b/xlators/cluster/dht/src/switch.c @@ -135,7 +135,8 @@ switch_local_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1)                  goto out; -        is_linkfile = check_is_linkfile (inode, stbuf, xattr); +        is_linkfile = check_is_linkfile (inode, stbuf, xattr, +                                         conf->link_xattr_name);          is_dir      = check_is_dir (inode, stbuf, xattr);          if (!is_dir && !is_linkfile) { @@ -289,11 +290,11 @@ switch_lookup (call_frame_t *frame, xlator_t *this,                   * attribute, revalidates directly go to the cached-subvolume.                   */                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  if (ret < 0)                          gf_log (this->name, GF_LOG_WARNING, -                                "failed to set dict value for " -                                "trusted.glusterfs.dht"); +                                "failed to set dict value for %s", +                                conf->xattr_name);                  for (i = 0; i < layout->cnt; i++) {                          subvol = layout->list[i].xlator; @@ -308,18 +309,18 @@ switch_lookup (call_frame_t *frame, xlator_t *this,          } else {          do_fresh_lookup:                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht", 4 * 4); +                                       conf->xattr_name, 4 * 4);                  if (ret < 0)                          gf_log (this->name, GF_LOG_WARNING, -                                "failed to set dict value for " -                                "trusted.glusterfs.dht"); +                                "failed to set dict value for %s", +                                conf->xattr_name);                  ret = dict_set_uint32 (local->xattr_req, -                                       "trusted.glusterfs.dht.linkto", 256); +                                       conf->link_xattr_name, 256);                  if (ret < 0)                          gf_log (this->name, GF_LOG_WARNING, -                                "failed to set dict value for " -                                "trusted.glusterfs.dht.linkto"); +                                "failed to set dict value for %s", +                                conf->link_xattr_name);                  if (!hashed_subvol) {                          gf_log (this->name, GF_LOG_DEBUG, @@ -443,9 +444,8 @@ switch_create (call_frame_t *frame, xlator_t *this,                  local->flags = flags;                  local->umask = umask;                  local->cached_subvol = avail_subvol; -                dht_linkfile_create (frame, -                                     switch_create_linkfile_create_cbk, -                                     avail_subvol, subvol, loc); +                dht_linkfile_create (frame, switch_create_linkfile_create_cbk, +                                     this, avail_subvol, subvol, loc);                  return 0;          } @@ -547,7 +547,7 @@ switch_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,                  local->cached_subvol = avail_subvol;                  dht_linkfile_create (frame, switch_mknod_linkfile_cbk, -                                     avail_subvol, subvol, loc); +                                     this, avail_subvol, subvol, loc);                  return 0;          } diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index bc8d53e8..4a91c435 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -389,6 +389,12 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .type        = NO_DOC,            .op_version  = 2          }, +        { .key         = "cluster.dht-xattr-name", +          .voltype     = "cluster/distribute", +          .option      = "xattr-name", +          .type        = NO_DOC, +          .op_version  = 2 +        },          /* AFR xlator options */          { .key         = "cluster.entry-change-log",  | 
