diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd.c | 19 | ||||
| -rw-r--r-- | glusterfsd/src/glusterfsd.h | 1 | ||||
| -rw-r--r-- | libglusterfs/src/glusterfs.h | 2 | ||||
| -rw-r--r-- | libglusterfs/src/graph.c | 23 | ||||
| -rw-r--r-- | libglusterfs/src/inode.c | 26 | ||||
| -rw-r--r-- | libglusterfs/src/inode.h | 1 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 6 | ||||
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 16 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 14 | 
9 files changed, 86 insertions, 22 deletions
diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index d51ff4bc66f..9ef2d00a3c9 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -146,6 +146,10 @@ static struct argp_option gf_options[] = {           "Mount the filesystem with POSIX ACL support"},          {"selinux", ARGP_SELINUX_KEY, 0, 0,           "Enable SELinux label (extened attributes) support on inodes"}, +#ifdef GF_LINUX_HOST_OS +        {"aux-gfid-mount", ARGP_AUX_GFID_MOUNT_KEY, 0, 0, +         "Enable access to filesystem through gfid directly"}, +#endif          {"enable-ino32", ARGP_INODE32_KEY, "BOOL", OPTION_ARG_OPTIONAL,           "Use 32-bit inodes when mounting to workaround broken applications"           "that don't support 64-bit inodes"}, @@ -350,6 +354,17 @@ set_fuse_mount_options (glusterfs_ctx_t *ctx, dict_t *options)                  }          } +        if (cmd_args->aux_gfid_mount) { +                ret = dict_set_static_ptr (options, "virtual-gfid-access", +                                           "on"); +                if (ret < 0) { +                        gf_log ("glusterfsd", GF_LOG_ERROR, +                                "failed to set dict value for key " +                                "aux-gfid-mount"); +                        goto err; +                } +        } +          if (cmd_args->enable_ino32) {                  ret = dict_set_static_ptr (options, "enable-ino32", "on");                  if (ret < 0) { @@ -689,6 +704,10 @@ parse_opts (int key, char *arg, struct argp_state *state)  					   "*-md-cache.cache-selinux=true");                  break; +        case ARGP_AUX_GFID_MOUNT_KEY: +                cmd_args->aux_gfid_mount = 1; +                break; +          case ARGP_INODE32_KEY:                  cmd_args->enable_ino32 = 1;                  break; diff --git a/glusterfsd/src/glusterfsd.h b/glusterfsd/src/glusterfsd.h index be91ce54866..06b4aacc833 100644 --- a/glusterfsd/src/glusterfsd.h +++ b/glusterfsd/src/glusterfsd.h @@ -85,6 +85,7 @@ enum argp_option_keys {          ARGP_INODE32_KEY                  = 163,  	ARGP_FUSE_MOUNTOPTS_KEY		  = 164,          ARGP_FUSE_USE_READDIRP_KEY        = 165, +	ARGP_AUX_GFID_MOUNT_KEY		  = 166,  };  struct _gfd_vol_top_priv_t { diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index 14f0130ef26..324e3f5b45c 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -325,6 +325,7 @@ struct _cmd_args {          int              mac_compat;  	int		 fopen_keep_cache;  	int		 gid_timeout; +        int              aux_gfid_mount;  	struct list_head xlator_options;  /* list of xlator_option_t */  	/* fuse options */ @@ -353,6 +354,7 @@ struct _cmd_args {          int             brick_port;          char           *brick_name;          int             brick_port2; +  };  typedef struct _cmd_args cmd_args_t; diff --git a/libglusterfs/src/graph.c b/libglusterfs/src/graph.c index 8a84d4cbc16..1dba63fc052 100644 --- a/libglusterfs/src/graph.c +++ b/libglusterfs/src/graph.c @@ -213,6 +213,21 @@ glusterfs_graph_mac_compat (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)          return ret;  } +int +glusterfs_graph_gfid_access (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx) +{ +        int ret = 0; +        cmd_args_t      *cmd_args = NULL; + +        cmd_args = &ctx->cmd_args; + +        if (!cmd_args->aux_gfid_mount) +                return 0; + +        ret = glusterfs_graph_insert (graph, ctx, "features/gfid-access", +                                      "gfid-access-autoload", 1); +        return ret; +}  static void  gf_add_cmdline_options (glusterfs_graph_t *graph, cmd_args_t *cmd_args) @@ -441,6 +456,14 @@ glusterfs_graph_prepare (glusterfs_graph_t *graph, glusterfs_ctx_t *ctx)                  return -1;          } +        /* XXX: gfid-access */ +        ret = glusterfs_graph_gfid_access (graph, ctx); +        if (ret) { +                gf_log ("graph", GF_LOG_ERROR, +                        "glusterfs graph 'gfid-access' failed"); +                return -1; +        } +          /* XXX: this->ctx setting */          for (trav = graph->first; trav; trav = trav->next) {                  trav->ctx = ctx; diff --git a/libglusterfs/src/inode.c b/libglusterfs/src/inode.c index 6f1c8ec3f25..add686fd208 100644 --- a/libglusterfs/src/inode.c +++ b/libglusterfs/src/inode.c @@ -310,7 +310,7 @@ __inode_destroy (inode_t *inode)                  goto noctx;          } -        for (index = 0; index < inode->table->xl->graph->xl_count; index++) { +        for (index = 0; index < inode->table->ctxcount; index++) {                  if (inode->_ctx[index].xl_key) {                          xl = (xlator_t *)(long)inode->_ctx[index].xl_key;                          old_THIS = THIS; @@ -528,10 +528,9 @@ __inode_create (inode_table_t *table)          INIT_LIST_HEAD (&newi->hash);          INIT_LIST_HEAD (&newi->dentry_list); -        newi->_ctx = GF_CALLOC (1, (sizeof (struct _inode_ctx) * -                                    table->xl->graph->xl_count), +        newi->_ctx = GF_CALLOC (1, +                                (sizeof (struct _inode_ctx) * table->ctxcount),                                  gf_common_mt_inode_ctx); -          if (newi->_ctx == NULL) {                  LOCK_DESTROY (&newi->lock);                  mem_put (newi); @@ -1316,6 +1315,7 @@ inode_table_new (size_t lru_limit, xlator_t *xl)                  return NULL;          new->xl = xl; +        new->ctxcount = xl->graph->xl_count + 1;          new->lru_limit = lru_limit; @@ -1466,7 +1466,7 @@ __inode_ctx_set2 (inode_t *inode, xlator_t *xlator, uint64_t *value1_p,          if (!inode || !xlator)                  return -1; -        for (index = 0; index < xlator->graph->xl_count; index++) { +        for (index = 0; index < inode->table->ctxcount; index++) {                  if (!inode->_ctx[index].xl_key) {                          if (set_idx == -1)                                  set_idx = index; @@ -1523,12 +1523,12 @@ __inode_ctx_get2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,          if (!inode || !xlator)                  return -1; -        for (index = 0; index < xlator->graph->xl_count; index++) { +        for (index = 0; index < inode->table->ctxcount; index++) {                  if (inode->_ctx[index].xl_key == xlator)                          break;          } -        if (index == xlator->graph->xl_count) { +        if (index == inode->table->ctxcount) {                  ret = -1;                  goto out;          } @@ -1575,12 +1575,13 @@ inode_ctx_del2 (inode_t *inode, xlator_t *xlator, uint64_t *value1,          LOCK (&inode->lock);          { -                for (index = 0; index < xlator->graph->xl_count; index++) { +                for (index = 0; index < inode->table->ctxcount; +                     index++) {                          if (inode->_ctx[index].xl_key == xlator)                                  break;                  } -                if (index == xlator->graph->xl_count) { +                if (index == inode->table->ctxcount) {                          ret = -1;                          goto unlock;                  } @@ -1628,14 +1629,15 @@ inode_dump (inode_t *inode, char *prefix)                  gf_proc_dump_write("ref", "%u", inode->ref);                  gf_proc_dump_write("ia_type", "%d", inode->ia_type);                  if (inode->_ctx) { -                        inode_ctx = GF_CALLOC (inode->table->xl->graph->xl_count, +                        inode_ctx = GF_CALLOC (inode->table->ctxcount,                                                 sizeof (*inode_ctx),                                                 gf_common_mt_inode_ctx);                          if (inode_ctx == NULL) {                                  goto unlock;                          } -                        for (i = 0; i < inode->table->xl->graph->xl_count; i++) { +                        for (i = 0; i < inode->table->ctxcount; +                             i++) {                                  inode_ctx[i] = inode->_ctx[i];                          }                  } @@ -1652,7 +1654,7 @@ unlock:          UNLOCK(&inode->lock);          if (inode_ctx && (dump_options.xl_options.dump_inodectx == _gf_true)) { -                for (i = 0; i < inode->table->xl->graph->xl_count; i++) { +                for (i = 0; i < inode->table->ctxcount; i++) {                          if (inode_ctx[i].xl_key) {                                  xl = (xlator_t *)(long)inode_ctx[i].xl_key;                                  if (xl->dumpops && xl->dumpops->inodectx) diff --git a/libglusterfs/src/inode.h b/libglusterfs/src/inode.h index 199ce44849a..cf766a31bc6 100644 --- a/libglusterfs/src/inode.h +++ b/libglusterfs/src/inode.h @@ -56,6 +56,7 @@ struct _inode_table {          struct mem_pool   *inode_pool;  /* memory pool for inodes */          struct mem_pool   *dentry_pool; /* memory pool for dentrys */          struct mem_pool   *fd_mem_pool; /* memory pool for fd_t */ +        int                ctxcount;    /* number of slots in inode->ctx */  }; diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 71588ddcda5..b1fee655b12 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1436,7 +1436,6 @@ dht_lookup (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          conf = this->private;          if (!conf) @@ -2144,7 +2143,6 @@ dht_getxattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          VALIDATE_OR_GOTO (this->private, err);          conf   = this->private; @@ -2503,7 +2501,6 @@ dht_setxattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          conf   = this->private; @@ -2717,7 +2714,6 @@ dht_removexattr (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (frame, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          local = dht_local_init (frame, loc, NULL, GF_FOP_REMOVEXATTR);          if (!local) { @@ -2949,7 +2945,6 @@ dht_statfs (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata)          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          VALIDATE_OR_GOTO (this->private, err);          conf = this->private; @@ -4892,7 +4887,6 @@ dht_entrylk (call_frame_t *frame, xlator_t *this,          VALIDATE_OR_GOTO (this, err);          VALIDATE_OR_GOTO (loc, err);          VALIDATE_OR_GOTO (loc->inode, err); -        VALIDATE_OR_GOTO (loc->path, err);          local = dht_local_init (frame, loc, NULL, GF_FOP_ENTRYLK);          if (!local) { diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index 84bcfaa525e..3e8fa40427c 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -120,6 +120,10 @@ start_glusterfs ()          cmd_line=$(echo "$cmd_line --mem-accounting");      fi +    if [ -n "$aux_gfid_mount" ]; then +        cmd_line=$(echo "$cmd_line --aux-gfid-mount"); +    fi +  #options with values start here      if [ -n "$log_level" ]; then          cmd_line=$(echo "$cmd_line --log-level=$log_level"); @@ -266,13 +270,13 @@ mount.glusterfs --version"  # check for recursive mounts. i.e, mounting over an existing brick  check_recursive_mount ()  { -    if [ $2 = "/" ]; then +    if [ $1 = "/" ]; then          echo Cannot mount over root;          exit 2;      fi      # GFID check first      # remove trailing / from mount point -    mnt_dir=${2%/}; +    mnt_dir=${1%/};      export PATH;      # check whether getfattr exists @@ -331,7 +335,6 @@ check_recursive_mount ()  main ()  {      helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p'); -      in_opt="no"      pos_args=0      for opt in "$@"; do @@ -346,6 +349,11 @@ main ()  		    "fopen-keep-cache")	fopen_keep_cache=1 ;;                      "enable-ino32")     enable_ino32=1 ;;                      "mem-accounting")   mem_accounting=1;; +                    "aux-gfid-mount") +                        if [ `uname -s` = "Linux" ]; then +                            aux_gfid_mount=1 +                        fi +                        ;;                      # "mount -t glusterfs" sends this, but it's useless.                      "rw")       ;;                      # these ones are interpreted during system initialization @@ -435,7 +443,7 @@ main ()          exit 0;      fi -    check_recursive_mount "$@"; +    check_recursive_mount "$mount_point";      # Append fuse.glusterfs to PRUNEFS variable in updatedb.conf(5). updatedb(8)      # should not index files under GlusterFS, indexing will slow down GlusteFS diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 3c7816cfb8c..fc7c259e948 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -842,6 +842,7 @@ posix_mknod (call_frame_t *frame, xlator_t *this,          struct iatt           preparent = {0,};          struct iatt           postparent = {0,};          void *                uuid_req  = NULL; +        mode_t                st_mode   = 0;          DECLARE_OLD_FS_ID_VAR; @@ -917,6 +918,19 @@ real_op:                                  strerror (op_errno));                          goto out;                  } +        } else { +                op_ret = dict_get_uint32 (xdata, GLUSTERFS_CREATE_MODE_KEY, +                                          &st_mode); + +                if (op_ret >= 0) { +                        op_ret = chmod (real_path, st_mode); +                        if (op_ret < 0) { +                                gf_log (this->name, GF_LOG_WARNING, +                                        "chmod failed (%s)", strerror (errno)); +                        } + +                        dict_del (xdata, GLUSTERFS_CREATE_MODE_KEY); +                }          }          op_ret = posix_gfid_set (this, real_path, loc, xdata);  | 
