diff options
Diffstat (limited to 'xlators/nfs/server/src/nfs.c')
| -rw-r--r-- | xlators/nfs/server/src/nfs.c | 3417 | 
1 files changed, 1657 insertions, 1760 deletions
diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index 7f741695fb5..a20fab3ef79 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -12,7 +12,6 @@   * Every other protocol version gets initialized from here.   */ -  #include "defaults.h"  #include "rpcsvc.h"  #include "dict.h" @@ -33,1449 +32,1393 @@  #include "rpcsvc.h"  #include "nfs-messages.h" -#define OPT_SERVER_AUX_GIDS             "nfs.server-aux-gids" -#define OPT_SERVER_GID_CACHE_TIMEOUT    "nfs.server.aux-gid-timeout" -#define OPT_SERVER_RPC_STATD             "nfs.rpc-statd" -#define OPT_SERVER_RPC_STATD_PIDFILE     "nfs.rpc-statd-pidfile" +#define OPT_SERVER_AUX_GIDS "nfs.server-aux-gids" +#define OPT_SERVER_GID_CACHE_TIMEOUT "nfs.server.aux-gid-timeout" +#define OPT_SERVER_RPC_STATD "nfs.rpc-statd" +#define OPT_SERVER_RPC_STATD_PIDFILE "nfs.rpc-statd-pidfile"  #define OPT_SERVER_RPC_STATD_NOTIFY_PIDFILE "nfs.rpc-statd-notify-pidfile" -#define NFS_DATADIR                     GLUSTERD_DEFAULT_WORKDIR "/nfs" +#define NFS_DATADIR GLUSTERD_DEFAULT_WORKDIR "/nfs"  /* Forward declaration */ -static int nfs_add_initer (struct list_head *list, nfs_version_initer_t init, -                           gf_boolean_t required); +static int +nfs_add_initer(struct list_head *list, nfs_version_initer_t init, +               gf_boolean_t required);  static int -nfs_init_version (xlator_t *this, nfs_version_initer_t init, -                  gf_boolean_t required) +nfs_init_version(xlator_t *this, nfs_version_initer_t init, +                 gf_boolean_t required)  { -        int                       ret       = -1; -        struct nfs_initer_list    *version  = NULL; -        struct nfs_initer_list    *tmp      = NULL; -        rpcsvc_program_t          *prog     = NULL; -        struct list_head          *versions = NULL; -        struct nfs_state          *nfs      = NULL; -        gf_boolean_t              found     = _gf_false; - -        if ((!this) || (!this->private) || (!init)) -                return (-1); - -        nfs = (struct nfs_state *)this->private; - -        ret = nfs_add_initer (&nfs->versions, init, required); -        if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, -                        "Failed to add protocol initializer"); -                goto err; -        } - -        versions = &nfs->versions; -        list_for_each_entry_safe (version, tmp, versions, list) { -                prog = version->program; -                if (version->init == init) { -                        prog = init(this); -                        if (!prog) { -                                ret = -1; -                                goto err; -                        } -                        version->program = prog; -                        found = _gf_true; -                        break; -                } -        } - -        /* program not added */ -        if (!found) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_NOT_FOUND, -                        "Program: %s NOT found", prog->progname); -                goto err; -        } - -        /* Check if nfs.port is configured */ -        if (nfs->override_portnum) -                prog->progport = nfs->override_portnum; - -        gf_msg_debug (GF_NFS, 0, "Starting program: %s", prog->progname); - -        ret = rpcsvc_program_register (nfs->rpcsvc, prog, _gf_false); -        if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_INIT_FAIL, -                        "Program: %s init failed", prog->progname); -                goto err; -        } - -        /* Registration with portmapper is disabled, Nothing to do */ -        if (!nfs->register_portmap) -                goto err; +    int ret = -1; +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    rpcsvc_program_t *prog = NULL; +    struct list_head *versions = NULL; +    struct nfs_state *nfs = NULL; +    gf_boolean_t found = _gf_false; + +    if ((!this) || (!this->private) || (!init)) +        return (-1); -        ret = rpcsvc_program_register_portmap (prog, prog->progport); -        if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_REG_FAIL, -                        "Program  %s registration failed", prog->progname); +    nfs = (struct nfs_state *)this->private; + +    ret = nfs_add_initer(&nfs->versions, init, required); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +               "Failed to add protocol initializer"); +        goto err; +    } + +    versions = &nfs->versions; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        prog = version->program; +        if (version->init == init) { +            prog = init(this); +            if (!prog) { +                ret = -1;                  goto err; -        } -        ret = 0; /* All well */ +            } +            version->program = prog; +            found = _gf_true; +            break; +        } +    } + +    /* program not added */ +    if (!found) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_NOT_FOUND, +               "Program: %s NOT found", prog->progname); +        goto err; +    } + +    /* Check if nfs.port is configured */ +    if (nfs->override_portnum) +        prog->progport = nfs->override_portnum; + +    gf_msg_debug(GF_NFS, 0, "Starting program: %s", prog->progname); + +    ret = rpcsvc_program_register(nfs->rpcsvc, prog, _gf_false); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_INIT_FAIL, +               "Program: %s init failed", prog->progname); +        goto err; +    } + +    /* Registration with portmapper is disabled, Nothing to do */ +    if (!nfs->register_portmap) +        goto err; + +    ret = rpcsvc_program_register_portmap(prog, prog->progport); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_REG_FAIL, +               "Program  %s registration failed", prog->progname); +        goto err; +    } +    ret = 0; /* All well */  err: -        return ret; +    return ret;  }  static int -nfs_deinit_version (struct nfs_state *nfs, nfs_version_initer_t init) +nfs_deinit_version(struct nfs_state *nfs, nfs_version_initer_t init)  { -        int                       ret       = -1; -        struct nfs_initer_list    *version  = NULL; -        struct nfs_initer_list    *tmp      = NULL; -        rpcsvc_program_t          *prog     = NULL; -        struct list_head          *versions = NULL; +    int ret = -1; +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    rpcsvc_program_t *prog = NULL; +    struct list_head *versions = NULL; -        if ((!nfs) || (!init)) -                return (-1); +    if ((!nfs) || (!init)) +        return (-1); -        versions = &nfs->versions; -        list_for_each_entry_safe (version, tmp, versions, list) { -                prog = version->program; -                if (version->init == init) { -                        prog = version->program; -                        ret = rpcsvc_program_unregister (nfs->rpcsvc, prog); -                        if (ret != 0) -                                return (-1); -                        list_del (&version->list); -                        GF_FREE (version); -                        return (0); -                } +    versions = &nfs->versions; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        prog = version->program; +        if (version->init == init) { +            prog = version->program; +            ret = rpcsvc_program_unregister(nfs->rpcsvc, prog); +            if (ret != 0) +                return (-1); +            list_del(&version->list); +            GF_FREE(version); +            return (0);          } +    } -        return (-1); +    return (-1);  }  static int -nfs_reconfigure_acl3 (xlator_t *this) +nfs_reconfigure_acl3(xlator_t *this)  { -        struct nfs_state          *nfs     = NULL; +    struct nfs_state *nfs = NULL; -        if ((!this) || (!this->private)) -                return (-1); +    if ((!this) || (!this->private)) +        return (-1); -        nfs = (struct nfs_state *)this->private; +    nfs = (struct nfs_state *)this->private; -        /* ACL is enabled */ -        if (nfs->enable_acl) -                return nfs_init_version (this, acl3svc_init, _gf_false); +    /* ACL is enabled */ +    if (nfs->enable_acl) +        return nfs_init_version(this, acl3svc_init, _gf_false); -        /* ACL is disabled */ -        return nfs_deinit_version (nfs, acl3svc_init); +    /* ACL is disabled */ +    return nfs_deinit_version(nfs, acl3svc_init);  }  static int -nfs_reconfigure_nlm4 (xlator_t *this) +nfs_reconfigure_nlm4(xlator_t *this)  { -        struct nfs_state          *nfs     = NULL; +    struct nfs_state *nfs = NULL; -        if ((!this) || (!this->private)) -                return (-1); +    if ((!this) || (!this->private)) +        return (-1); -        nfs = (struct nfs_state *)this->private; +    nfs = (struct nfs_state *)this->private; -        /* NLM is enabled */ -        if (nfs->enable_nlm) -                return nfs_init_version (this, nlm4svc_init, _gf_false); +    /* NLM is enabled */ +    if (nfs->enable_nlm) +        return nfs_init_version(this, nlm4svc_init, _gf_false); -        /* NLM is disabled */ -        return nfs_deinit_version (nfs, nlm4svc_init); +    /* NLM is disabled */ +    return nfs_deinit_version(nfs, nlm4svc_init);  }  static int -nfs_program_register_portmap_all (struct nfs_state *nfs) +nfs_program_register_portmap_all(struct nfs_state *nfs)  { -        struct list_head                *versions = NULL; -        struct nfs_initer_list          *version = NULL; -        struct nfs_initer_list          *tmp = NULL; -        rpcsvc_program_t                *prog = NULL; +    struct list_head *versions = NULL; +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    rpcsvc_program_t *prog = NULL; -        if (nfs == NULL) -                return (-1); +    if (nfs == NULL) +        return (-1); -        versions = &nfs->versions; -        list_for_each_entry_safe (version, tmp, versions, list) { -                prog = version->program; -                if (prog == NULL) -                        continue; -                if (nfs->override_portnum) -                        prog->progport = nfs->override_portnum; -                (void) rpcsvc_program_register_portmap (prog, prog->progport); +    versions = &nfs->versions; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        prog = version->program; +        if (prog == NULL) +            continue; +        if (nfs->override_portnum) +            prog->progport = nfs->override_portnum; +        (void)rpcsvc_program_register_portmap(prog, prog->progport);  #ifdef IPV6_DEFAULT -                (void) rpcsvc_program_register_rpcbind6 (prog, prog->progport); +        (void)rpcsvc_program_register_rpcbind6(prog, prog->progport);  #endif +    } -        } - -        return (0); +    return (0);  }  static int -nfs_program_unregister_portmap_all (struct nfs_state *nfs) +nfs_program_unregister_portmap_all(struct nfs_state *nfs)  { -        struct list_head                *versions = NULL; -        struct nfs_initer_list          *version = NULL; -        struct nfs_initer_list          *tmp = NULL; -        rpcsvc_program_t                *prog = NULL; +    struct list_head *versions = NULL; +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    rpcsvc_program_t *prog = NULL; -        if (nfs == NULL) -                return (-1); +    if (nfs == NULL) +        return (-1); -        versions = &nfs->versions; -        list_for_each_entry_safe (version, tmp, versions, list) { -                prog = version->program; -                if (prog == NULL) -                        continue; -                (void) rpcsvc_program_unregister_portmap (prog); +    versions = &nfs->versions; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        prog = version->program; +        if (prog == NULL) +            continue; +        (void)rpcsvc_program_unregister_portmap(prog);  #ifdef IPV6_DEFAULT -                (void) rpcsvc_program_unregister_rpcbind6 (prog); +        (void)rpcsvc_program_unregister_rpcbind6(prog);  #endif -        } +    } -        return (0); +    return (0);  }  /* Every NFS version must call this function with the init function   * for its particular version.   */  static int -nfs_add_initer (struct list_head *list, nfs_version_initer_t init, -                gf_boolean_t required) +nfs_add_initer(struct list_head *list, nfs_version_initer_t init, +               gf_boolean_t required)  { -        struct nfs_initer_list  *new = NULL; -        if ((!list) || (!init)) -                return -1; - -        new = GF_CALLOC (1, sizeof (*new), gf_nfs_mt_nfs_initer_list); -        if (!new) { -                gf_msg (GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, -                        "Memory allocation failed"); -                return -1; -        } - -        new->init = init; -        new->required = required; -        list_add_tail (&new->list, list); -        return 0; +    struct nfs_initer_list *new = NULL; +    if ((!list) || (!init)) +        return -1; + +    new = GF_CALLOC(1, sizeof(*new), gf_nfs_mt_nfs_initer_list); +    if (!new) { +        gf_msg(GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, +               "Memory allocation failed"); +        return -1; +    } + +    new->init = init; +    new->required = required; +    list_add_tail(&new->list, list); +    return 0;  } -  int -nfs_deinit_versions (struct list_head *versions, xlator_t *this) +nfs_deinit_versions(struct list_head *versions, xlator_t *this)  { -        struct nfs_initer_list          *version = NULL; -        struct nfs_initer_list          *tmp = NULL; -        struct nfs_state                *nfs = NULL; - -        if ((!versions) || (!this)) -                return -1; - -        nfs = (struct nfs_state *)this->private; -        list_for_each_entry_safe (version, tmp, versions, list) { -                /* TODO: Add version specific destructor. -                 * if (!version->deinit) -                        goto err; - -                   version->deinit (this); -                */ -                if (version->program) -                        rpcsvc_program_unregister (nfs->rpcsvc, -                                                   (version->program)); - -                list_del (&version->list); -                GF_FREE (version); -        } +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    struct nfs_state *nfs = NULL; + +    if ((!versions) || (!this)) +        return -1; + +    nfs = (struct nfs_state *)this->private; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        /* TODO: Add version specific destructor. +         * if (!version->deinit) +                goto err; -        return 0; +           version->deinit (this); +        */ +        if (version->program) +            rpcsvc_program_unregister(nfs->rpcsvc, (version->program)); + +        list_del(&version->list); +        GF_FREE(version); +    } + +    return 0;  }  int -nfs_init_versions (struct nfs_state *nfs, xlator_t *this) +nfs_init_versions(struct nfs_state *nfs, xlator_t *this)  { -        struct nfs_initer_list          *version = NULL; -        struct nfs_initer_list          *tmp = NULL; -        rpcsvc_program_t                *prog = NULL; -        int                             ret = -1; -        struct list_head                *versions = NULL; - -        if ((!nfs) || (!this)) -                return -1; - -        gf_msg_debug (GF_NFS, 0, "Initing protocol versions"); -        versions = &nfs->versions; -        list_for_each_entry_safe (version, tmp, versions, list) { -                if (!version->init) { -                        ret = -1; -                        goto err; -                } - -                prog = version->init (this); -                if (!prog) { -                        ret = -1; -                        goto err; -                } - -                version->program = prog; -                if (nfs->override_portnum) -                        prog->progport = nfs->override_portnum; -                gf_msg_debug (GF_NFS, 0, "Starting program: %s", -                        prog->progname); - -                ret = rpcsvc_program_register (nfs->rpcsvc, prog, _gf_false); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_PGM_INIT_FAIL, -                                "Program: %s init failed", prog->progname); -                        goto err; -                } -                if (nfs->register_portmap) { -                        ret = rpcsvc_program_register_portmap (prog, -                                                               prog->progport); -                        if (ret == -1) { -                                gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                        NFS_MSG_PGM_REG_FAIL, -                                        "%s program  %s registration failed", -                                        version->required ? -                                        "Required" : "Optional", -                                        prog->progname); - -                                /* fatal error if the program is required */ -                                if (version->required) -                                        goto err; -                        } +    struct nfs_initer_list *version = NULL; +    struct nfs_initer_list *tmp = NULL; +    rpcsvc_program_t *prog = NULL; +    int ret = -1; +    struct list_head *versions = NULL; + +    if ((!nfs) || (!this)) +        return -1; + +    gf_msg_debug(GF_NFS, 0, "Initing protocol versions"); +    versions = &nfs->versions; +    list_for_each_entry_safe(version, tmp, versions, list) +    { +        if (!version->init) { +            ret = -1; +            goto err; +        } + +        prog = version->init(this); +        if (!prog) { +            ret = -1; +            goto err; +        } + +        version->program = prog; +        if (nfs->override_portnum) +            prog->progport = nfs->override_portnum; +        gf_msg_debug(GF_NFS, 0, "Starting program: %s", prog->progname); + +        ret = rpcsvc_program_register(nfs->rpcsvc, prog, _gf_false); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_INIT_FAIL, +                   "Program: %s init failed", prog->progname); +            goto err; +        } +        if (nfs->register_portmap) { +            ret = rpcsvc_program_register_portmap(prog, prog->progport); +            if (ret == -1) { +                gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_REG_FAIL, +                       "%s program  %s registration failed", +                       version->required ? "Required" : "Optional", +                       prog->progname); + +                /* fatal error if the program is required */ +                if (version->required) +                    goto err; +            }  #ifdef IPV6_DEFAULT -                        ret = rpcsvc_program_register_rpcbind6 (prog, -                                                                prog->progport); -                        if (ret == -1) { -                                gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                        NFS_MSG_PGM_REG_FAIL, -                                        "Program (ipv6) %s registration failed", -                                        prog->progname); -                                goto err; -                        } +            ret = rpcsvc_program_register_rpcbind6(prog, prog->progport); +            if (ret == -1) { +                gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PGM_REG_FAIL, +                       "Program (ipv6) %s registration failed", prog->progname); +                goto err; +            }  #endif -                } -          } +    } -        ret = 0; +    ret = 0;  err: -        return ret; +    return ret;  } -  int -nfs_add_all_initiators (struct nfs_state *nfs) +nfs_add_all_initiators(struct nfs_state *nfs)  { -        int     ret = 0; - -        /* Add the initializers for all versions. */ -        ret = nfs_add_initer (&nfs->versions, mnt3svc_init, _gf_true); +    int ret = 0; + +    /* Add the initializers for all versions. */ +    ret = nfs_add_initer(&nfs->versions, mnt3svc_init, _gf_true); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +               "Failed to add MOUNT3 protocol initializer"); +        goto ret; +    } + +    ret = nfs_add_initer(&nfs->versions, mnt1svc_init, _gf_true); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +               "Failed to add MOUNT1 protocol initializer"); +        goto ret; +    } + +    ret = nfs_add_initer(&nfs->versions, nfs3svc_init, _gf_true); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +               "Failed to add NFS3 protocol initializer"); +        goto ret; +    } + +    if (nfs->enable_nlm == _gf_true) { +        ret = nfs_add_initer(&nfs->versions, nlm4svc_init, _gf_false);          if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, -                        "Failed to add MOUNT3 protocol initializer"); -                goto ret; +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +                   "Failed to add protocol initializer"); +            goto ret;          } +    } -        ret = nfs_add_initer (&nfs->versions, mnt1svc_init, _gf_true); +    if (nfs->enable_acl == _gf_true) { +        ret = nfs_add_initer(&nfs->versions, acl3svc_init, _gf_false);          if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, -                        "Failed to add MOUNT1 protocol initializer"); -                goto ret; -        } - -        ret = nfs_add_initer (&nfs->versions, nfs3svc_init, _gf_true); -        if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, -                        "Failed to add NFS3 protocol initializer"); -                goto ret; -        } - -        if (nfs->enable_nlm == _gf_true) { -                ret = nfs_add_initer (&nfs->versions, nlm4svc_init, _gf_false); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_PROT_INIT_ADD_FAIL, -                                "Failed to add protocol initializer"); -                        goto ret; -                } -        } - -        if (nfs->enable_acl == _gf_true) { -                ret = nfs_add_initer (&nfs->versions, acl3svc_init, _gf_false); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_PROT_INIT_ADD_FAIL, -                                "Failed to add ACL protocol initializer"); -                        goto ret; -                } +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_PROT_INIT_ADD_FAIL, +                   "Failed to add ACL protocol initializer"); +            goto ret;          } +    } -        ret = 0; +    ret = 0;  ret: -        return ret; +    return ret;  } -  int -nfs_subvolume_started (struct nfs_state *nfs, xlator_t *xl) +nfs_subvolume_started(struct nfs_state *nfs, xlator_t *xl)  { -        int     x = 0; -        int     started = 0; - -        if ((!nfs) || (!xl)) -                return 1; - -        LOCK (&nfs->svinitlock); -        { -                for (;x < nfs->allsubvols; ++x) { -                        if (nfs->initedxl[x] == xl) { -                                started = 1; -                                goto unlock; -                       } -               } +    int x = 0; +    int started = 0; + +    if ((!nfs) || (!xl)) +        return 1; + +    LOCK(&nfs->svinitlock); +    { +        for (; x < nfs->allsubvols; ++x) { +            if (nfs->initedxl[x] == xl) { +                started = 1; +                goto unlock; +            }          } +    }  unlock: -        UNLOCK (&nfs->svinitlock); +    UNLOCK(&nfs->svinitlock); -        return started; +    return started;  } -  int -nfs_subvolume_set_started (struct nfs_state *nfs, xlator_t *xl) +nfs_subvolume_set_started(struct nfs_state *nfs, xlator_t *xl)  { -        int     x = 0; - -        if ((!nfs) || (!xl)) -                return 1; - -        LOCK (&nfs->svinitlock); -        { -                for (;x < nfs->allsubvols; ++x) { -                        if (nfs->initedxl[x] == xl) { -                                gf_msg_debug (GF_NFS, 0, -                                        "Volume already started %s", -                                        xl->name); -                                break; -                        } - -                        if (nfs->initedxl[x] == NULL) { -                                nfs->initedxl[x] = xl; -                                ++nfs->upsubvols; -                                gf_msg_debug (GF_NFS, 0, "Starting up: %s " -                                        ", vols started till now: %d", xl->name, -                                        nfs->upsubvols); -                                goto unlock; -                        } -               } -        } +    int x = 0; + +    if ((!nfs) || (!xl)) +        return 1; + +    LOCK(&nfs->svinitlock); +    { +        for (; x < nfs->allsubvols; ++x) { +            if (nfs->initedxl[x] == xl) { +                gf_msg_debug(GF_NFS, 0, "Volume already started %s", xl->name); +                break; +            } + +            if (nfs->initedxl[x] == NULL) { +                nfs->initedxl[x] = xl; +                ++nfs->upsubvols; +                gf_msg_debug(GF_NFS, 0, +                             "Starting up: %s " +                             ", vols started till now: %d", +                             xl->name, nfs->upsubvols); +                goto unlock; +            } +        } +    }  unlock: -        UNLOCK (&nfs->svinitlock); +    UNLOCK(&nfs->svinitlock); -        return 0; +    return 0;  } -  int32_t -nfs_start_subvol_lookup_cbk (call_frame_t *frame, void *cookie, -                             xlator_t *this, int32_t op_ret, int32_t op_errno, -                             inode_t *inode, struct iatt *buf, dict_t *xattr, -                             struct iatt *postparent) +nfs_start_subvol_lookup_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                            int32_t op_ret, int32_t op_errno, inode_t *inode, +                            struct iatt *buf, dict_t *xattr, +                            struct iatt *postparent)  { -        if (op_ret == -1) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, op_errno, -                        NFS_MSG_LOOKUP_ROOT_FAIL, -                        "Failed to lookup root: %s", -                        strerror (op_errno)); -                goto err; -        } - -        nfs_subvolume_set_started (this->private, ((xlator_t *)cookie)); -        gf_msg_trace (GF_NFS, 0, "Started %s", ((xlator_t *)cookie)->name); +    if (op_ret == -1) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, op_errno, NFS_MSG_LOOKUP_ROOT_FAIL, +               "Failed to lookup root: %s", strerror(op_errno)); +        goto err; +    } + +    nfs_subvolume_set_started(this->private, ((xlator_t *)cookie)); +    gf_msg_trace(GF_NFS, 0, "Started %s", ((xlator_t *)cookie)->name);  err: -        return 0; +    return 0;  } -  int -nfs_startup_subvolume (xlator_t *nfsx, xlator_t *xl) +nfs_startup_subvolume(xlator_t *nfsx, xlator_t *xl)  { -        int             ret = -1; -        loc_t           rootloc = {0, }; -        nfs_user_t      nfu = {0, }; - -        if ((!nfsx) || (!xl)) -                return -1; - -        if (nfs_subvolume_started (nfsx->private, xl)) { -                gf_msg_trace (GF_NFS, 0, "Subvolume already started: %s", -                        xl->name); -                ret = 0; -                goto err; -        } - -        ret = nfs_root_loc_fill (xl->itable, &rootloc); -        if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, -                        NFS_MSG_ROOT_LOC_INIT_FAIL, -                        "Failed to init root loc"); -                goto err; -        } - -        nfs_user_root_create (&nfu); -        ret = nfs_fop_lookup (nfsx, xl, &nfu, &rootloc, -                              nfs_start_subvol_lookup_cbk, -                              (void *)nfsx->private); -        if (ret < 0) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, -ret, -                        NFS_MSG_LOOKUP_ROOT_FAIL, -                        "Failed to lookup root: %s", strerror (-ret)); -                goto err; -        } - -        nfs_loc_wipe (&rootloc); +    int ret = -1; +    loc_t rootloc = { +        0, +    }; +    nfs_user_t nfu = { +        0, +    }; + +    if ((!nfsx) || (!xl)) +        return -1; + +    if (nfs_subvolume_started(nfsx->private, xl)) { +        gf_msg_trace(GF_NFS, 0, "Subvolume already started: %s", xl->name); +        ret = 0; +        goto err; +    } + +    ret = nfs_root_loc_fill(xl->itable, &rootloc); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_ROOT_LOC_INIT_FAIL, +               "Failed to init root loc"); +        goto err; +    } + +    nfs_user_root_create(&nfu); +    ret = nfs_fop_lookup(nfsx, xl, &nfu, &rootloc, nfs_start_subvol_lookup_cbk, +                         (void *)nfsx->private); +    if (ret < 0) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, -ret, NFS_MSG_LOOKUP_ROOT_FAIL, +               "Failed to lookup root: %s", strerror(-ret)); +        goto err; +    } + +    nfs_loc_wipe(&rootloc);  err: -        return ret; +    return ret;  }  int -nfs_startup_subvolumes (xlator_t *nfsx) +nfs_startup_subvolumes(xlator_t *nfsx)  { -        int                     ret = -1; -        xlator_list_t           *cl = NULL; -        struct nfs_state        *nfs = NULL; - -        if (!nfsx) -                return -1; - -        nfs = nfsx->private; -        cl = nfs->subvols; -        while (cl) { -                gf_msg_debug (GF_NFS, 0, "Starting subvolume: %s", -                        cl->xlator->name); -                ret = nfs_startup_subvolume (nfsx, cl->xlator); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, -                                NFS_MSG_STARTUP_FAIL, -                                "Failed to start-up xlator: %s", -                                cl->xlator->name); -                        goto err; -                } -                cl = cl->next; +    int ret = -1; +    xlator_list_t *cl = NULL; +    struct nfs_state *nfs = NULL; + +    if (!nfsx) +        return -1; + +    nfs = nfsx->private; +    cl = nfs->subvols; +    while (cl) { +        gf_msg_debug(GF_NFS, 0, "Starting subvolume: %s", cl->xlator->name); +        ret = nfs_startup_subvolume(nfsx, cl->xlator); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_STARTUP_FAIL, +                   "Failed to start-up xlator: %s", cl->xlator->name); +            goto err;          } +        cl = cl->next; +    } -        ret = 0; +    ret = 0;  err: -        return ret; +    return ret;  } -  int -nfs_init_subvolume (struct nfs_state *nfs, xlator_t *xl) +nfs_init_subvolume(struct nfs_state *nfs, xlator_t *xl)  { -        unsigned int    lrusize = 0; -        int             ret = -1; - -        if ((!nfs) || (!xl)) -                return -1; - -        lrusize = nfs->memfactor * GF_NFS_INODE_LRU_MULT; -        xl->itable = inode_table_new (lrusize, xl); -        if (!xl->itable) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, ENOMEM, NFS_MSG_NO_MEMORY, -                        "Failed to allocate inode table"); -                goto err; -        } -        ret = 0; +    unsigned int lrusize = 0; +    int ret = -1; + +    if ((!nfs) || (!xl)) +        return -1; + +    lrusize = nfs->memfactor * GF_NFS_INODE_LRU_MULT; +    xl->itable = inode_table_new(lrusize, xl); +    if (!xl->itable) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, ENOMEM, NFS_MSG_NO_MEMORY, +               "Failed to allocate inode table"); +        goto err; +    } +    ret = 0;  err: -        return ret; +    return ret;  }  int -nfs_init_subvolumes (struct nfs_state *nfs, xlator_list_t *cl) +nfs_init_subvolumes(struct nfs_state *nfs, xlator_list_t *cl)  { -        int             ret = -1; -        unsigned int    lrusize = 0; -        int             svcount = 0; - -        if ((!nfs) || (!cl)) -                return -1; - -        lrusize = nfs->memfactor * GF_NFS_INODE_LRU_MULT; -        nfs->subvols = cl; -        gf_msg_trace (GF_NFS, 0, "inode table lru: %d", lrusize); - -        while (cl) { -                gf_msg_debug (GF_NFS, 0, "Initing subvolume: %s", -                        cl->xlator->name); -                ret = nfs_init_subvolume (nfs, cl->xlator); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, -                                NFS_MSG_XLATOR_INIT_FAIL, "Failed to init " -                                "xlator: %s", cl->xlator->name); -                        goto err; -                } -                ++svcount; -                cl = cl->next; -        } +    int ret = -1; +    unsigned int lrusize = 0; +    int svcount = 0; -        LOCK_INIT (&nfs->svinitlock); -        nfs->initedxl = GF_CALLOC (svcount, sizeof (xlator_t *), -                                   gf_nfs_mt_xlator_t ); -        if (!nfs->initedxl) { -                gf_msg (GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, -                        "Failed to allocated inited xls"); -                ret = -1; -                goto err; -        } +    if ((!nfs) || (!cl)) +        return -1; -        gf_msg_trace (GF_NFS, 0, "Inited volumes: %d", svcount); -        nfs->allsubvols = svcount; -        ret = 0; +    lrusize = nfs->memfactor * GF_NFS_INODE_LRU_MULT; +    nfs->subvols = cl; +    gf_msg_trace(GF_NFS, 0, "inode table lru: %d", lrusize); + +    while (cl) { +        gf_msg_debug(GF_NFS, 0, "Initing subvolume: %s", cl->xlator->name); +        ret = nfs_init_subvolume(nfs, cl->xlator); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_XLATOR_INIT_FAIL, +                   "Failed to init " +                   "xlator: %s", +                   cl->xlator->name); +            goto err; +        } +        ++svcount; +        cl = cl->next; +    } + +    LOCK_INIT(&nfs->svinitlock); +    nfs->initedxl = GF_CALLOC(svcount, sizeof(xlator_t *), gf_nfs_mt_xlator_t); +    if (!nfs->initedxl) { +        gf_msg(GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, +               "Failed to allocated inited xls"); +        ret = -1; +        goto err; +    } + +    gf_msg_trace(GF_NFS, 0, "Inited volumes: %d", svcount); +    nfs->allsubvols = svcount; +    ret = 0;  err: -        return ret; +    return ret;  } -  int -nfs_user_root_create (nfs_user_t *newnfu) +nfs_user_root_create(nfs_user_t *newnfu)  { -        if (!newnfu) -                return -1; +    if (!newnfu) +        return -1; -        newnfu->uid = 0; -        newnfu->gids[0] = 0; -        newnfu->ngrps = 1; +    newnfu->uid = 0; +    newnfu->gids[0] = 0; +    newnfu->ngrps = 1; -        return 0; +    return 0;  } -  int -nfs_user_create (nfs_user_t *newnfu, uid_t uid, gid_t gid, -                 rpc_transport_t *trans, gid_t *auxgids, int auxcount) +nfs_user_create(nfs_user_t *newnfu, uid_t uid, gid_t gid, +                rpc_transport_t *trans, gid_t *auxgids, int auxcount)  { -        int     x = 1; -        int     y = 0; - -        /* We test for GF_REQUEST_MAXGROUPS instead of  NFS_FOP_NGROUPS because -         * the latter accounts for the @gid being in @auxgids, which is not the -         * case here. -         */ -        if ((!newnfu) || (auxcount > GF_REQUEST_MAXGROUPS)) -                return -1; - -        newnfu->uid = uid; -        newnfu->gids[0] = gid; -        newnfu->ngrps = 1; -        if (trans) { -                memcpy (&newnfu->identifier, trans->peerinfo.identifier, -                       UNIX_PATH_MAX); -        } - -        gf_msg_trace (GF_NFS, 0, "uid: %d, gid %d, gids: %d", uid, gid, -                auxcount); - -        if (!auxgids) -                return 0; +    int x = 1; +    int y = 0; + +    /* We test for GF_REQUEST_MAXGROUPS instead of  NFS_FOP_NGROUPS because +     * the latter accounts for the @gid being in @auxgids, which is not the +     * case here. +     */ +    if ((!newnfu) || (auxcount > GF_REQUEST_MAXGROUPS)) +        return -1; + +    newnfu->uid = uid; +    newnfu->gids[0] = gid; +    newnfu->ngrps = 1; +    if (trans) { +        memcpy(&newnfu->identifier, trans->peerinfo.identifier, UNIX_PATH_MAX); +    } + +    gf_msg_trace(GF_NFS, 0, "uid: %d, gid %d, gids: %d", uid, gid, auxcount); + +    if (!auxgids) +        return 0; -        for (; y < auxcount; ++x,++y) { -                newnfu->gids[x] = auxgids[y]; -                ++newnfu->ngrps; -                gf_msg_trace (GF_NFS, 0, "gid: %d", auxgids[y]); -        } +    for (; y < auxcount; ++x, ++y) { +        newnfu->gids[x] = auxgids[y]; +        ++newnfu->ngrps; +        gf_msg_trace(GF_NFS, 0, "gid: %d", auxgids[y]); +    } -        return 0; +    return 0;  } -  void -nfs_request_user_init (nfs_user_t *nfu, rpcsvc_request_t *req) +nfs_request_user_init(nfs_user_t *nfu, rpcsvc_request_t *req)  { -        gid_t           *gidarr = NULL; -        int             gids = 0; +    gid_t *gidarr = NULL; +    int gids = 0; -        if ((!req) || (!nfu)) -                return; +    if ((!req) || (!nfu)) +        return; -        gidarr = rpcsvc_auth_unix_auxgids (req, &gids); -        nfs_user_create (nfu, rpcsvc_request_uid (req), -                         rpcsvc_request_gid (req), -                         rpcsvc_request_transport (req), -                         gidarr, gids); +    gidarr = rpcsvc_auth_unix_auxgids(req, &gids); +    nfs_user_create(nfu, rpcsvc_request_uid(req), rpcsvc_request_gid(req), +                    rpcsvc_request_transport(req), gidarr, gids); -        return; +    return;  }  void -nfs_request_primary_user_init (nfs_user_t *nfu, rpcsvc_request_t *req, -                               uid_t uid, gid_t gid) +nfs_request_primary_user_init(nfs_user_t *nfu, rpcsvc_request_t *req, uid_t uid, +                              gid_t gid)  { -        gid_t           *gidarr = NULL; -        int             gids = 0; +    gid_t *gidarr = NULL; +    int gids = 0; -        if ((!req) || (!nfu)) -                return; +    if ((!req) || (!nfu)) +        return; -        gidarr = rpcsvc_auth_unix_auxgids (req, &gids); -        nfs_user_create (nfu, uid, gid, rpcsvc_request_transport (req), -                         gidarr, gids); +    gidarr = rpcsvc_auth_unix_auxgids(req, &gids); +    nfs_user_create(nfu, uid, gid, rpcsvc_request_transport(req), gidarr, gids); -        return; +    return;  } -  int32_t -mem_acct_init (xlator_t *this) +mem_acct_init(xlator_t *this)  { -        int     ret = -1; - -        if (!this) -                return ret; +    int ret = -1; -        ret = xlator_mem_acct_init (this, gf_nfs_mt_end + 1); +    if (!this) +        return ret; -        if (ret != 0) { -                gf_msg (this->name, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, -                        "Memory accounting init failed"); -                return ret; -        } +    ret = xlator_mem_acct_init(this, gf_nfs_mt_end + 1); +    if (ret != 0) { +        gf_msg(this->name, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, +               "Memory accounting init failed");          return ret; -} +    } +    return ret; +}  struct nfs_state * -nfs_init_state (xlator_t *this) +nfs_init_state(xlator_t *this)  { -        struct nfs_state        *nfs = NULL; -        int                     i = 0, ret = -1; -        unsigned int            fopspoolsize = 0; -        char                    *optstr = NULL; -        gf_boolean_t            boolt = _gf_false; -        struct stat             stbuf = {0,}; - -        if (!this) -                return NULL; - -        if (!this->children) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NFS_MAN_DISABLE, -                        "NFS is manually disabled: Exiting"); -                /* Nothing for nfs process to do, exit cleanly */ -                kill (getpid (), SIGTERM); -        } - -        nfs = GF_CALLOC (1, sizeof (*nfs), gf_nfs_mt_nfs_state); -        if (!nfs) { -                gf_msg (GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, -                        "memory allocation failed"); -                return NULL; +    struct nfs_state *nfs = NULL; +    int i = 0, ret = -1; +    unsigned int fopspoolsize = 0; +    char *optstr = NULL; +    gf_boolean_t boolt = _gf_false; +    struct stat stbuf = { +        0, +    }; + +    if (!this) +        return NULL; + +    if (!this->children) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NFS_MAN_DISABLE, +               "NFS is manually disabled: Exiting"); +        /* Nothing for nfs process to do, exit cleanly */ +        kill(getpid(), SIGTERM); +    } + +    nfs = GF_CALLOC(1, sizeof(*nfs), gf_nfs_mt_nfs_state); +    if (!nfs) { +        gf_msg(GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, +               "memory allocation failed"); +        return NULL; +    } + +    nfs->memfactor = GF_NFS_DEFAULT_MEMFACTOR; +    if (dict_get(this->options, "nfs.mem-factor")) { +        ret = dict_get_str(this->options, "nfs.mem-factor", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_DICT_GET_FAILED, +                   "Failed to parse dict"); +            goto free_rpcsvc;          } -        nfs->memfactor = GF_NFS_DEFAULT_MEMFACTOR; -        if (dict_get (this->options, "nfs.mem-factor")) { -                ret = dict_get_str (this->options, "nfs.mem-factor", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, -                                NFS_MSG_DICT_GET_FAILED, -                                "Failed to parse dict"); -                        goto free_rpcsvc; -                } - -                ret = gf_string2uint (optstr, &nfs->memfactor); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse uint string"); -                        goto free_rpcsvc; -                } +        ret = gf_string2uint(optstr, &nfs->memfactor); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse uint string"); +            goto free_rpcsvc; +        } +    } + +    fopspoolsize = nfs->memfactor * GF_NFS_CONCURRENT_OPS_MULT; +    /* FIXME: Really saddens me to see this as xlator wide. */ +    nfs->foppool = mem_pool_new(struct nfs_fop_local, fopspoolsize); +    if (!nfs->foppool) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, ENOMEM, NFS_MSG_NO_MEMORY, +               "Failed to allocate fops local pool"); +        goto free_rpcsvc; +    } + +    nfs->dynamicvolumes = GF_NFS_DVM_OFF; +    if (dict_get(this->options, "nfs.dynamic-volumes")) { +        ret = dict_get_str(this->options, "nfs.dynamic-volumes", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_DICT_GET_FAILED, +                   "Failed to parse dict"); +            goto free_foppool;          } -        fopspoolsize = nfs->memfactor * GF_NFS_CONCURRENT_OPS_MULT; -        /* FIXME: Really saddens me to see this as xlator wide. */ -        nfs->foppool = mem_pool_new (struct nfs_fop_local, fopspoolsize); -        if (!nfs->foppool) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, ENOMEM, NFS_MSG_NO_MEMORY, -                        "Failed to allocate fops local pool"); -                goto free_rpcsvc; +        ret = gf_string2boolean(optstr, &boolt); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool string"); +            goto free_foppool; +        } + +        if (boolt == _gf_true) +            nfs->dynamicvolumes = GF_NFS_DVM_ON; +    } + +    nfs->enable_nlm = _gf_true; +    ret = dict_get_str_boolean(this->options, "nfs.nlm", _gf_true); +    if (ret == _gf_false) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NLM_MAN_DISABLE, +               "NLM is manually disabled"); +        nfs->enable_nlm = _gf_false; +    } + +    nfs->enable_acl = _gf_true; +    ret = dict_get_str_boolean(this->options, "nfs.acl", _gf_true); +    if (ret == _gf_false) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_ACL_MAN_DISABLE, +               "ACL is manually disabled"); +        nfs->enable_acl = _gf_false; +    } + +    nfs->enable_ino32 = 0; +    if (dict_get(this->options, "nfs.enable-ino32")) { +        ret = dict_get_str(this->options, "nfs.enable-ino32", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        nfs->dynamicvolumes = GF_NFS_DVM_OFF; -        if (dict_get (this->options, "nfs.dynamic-volumes")) { -                ret = dict_get_str (this->options, "nfs.dynamic-volumes", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, -                                NFS_MSG_DICT_GET_FAILED, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_true) -                        nfs->dynamicvolumes = GF_NFS_DVM_ON; +        ret = gf_string2boolean(optstr, &boolt); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool string"); +            goto free_foppool;          } -        nfs->enable_nlm = _gf_true; -        ret = dict_get_str_boolean (this->options, "nfs.nlm", _gf_true); -        if (ret == _gf_false) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NLM_MAN_DISABLE, -                        "NLM is manually disabled"); -                nfs->enable_nlm = _gf_false; -        } +        if (boolt == _gf_true) +            nfs->enable_ino32 = 1; +    } -        nfs->enable_acl = _gf_true; -        ret = dict_get_str_boolean (this->options, "nfs.acl", _gf_true); -        if (ret == _gf_false) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_ACL_MAN_DISABLE, -                        "ACL is manually disabled"); -                nfs->enable_acl = _gf_false; +    if (dict_get(this->options, "nfs.port")) { +        ret = dict_get_str(this->options, "nfs.port", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        nfs->enable_ino32 = 0; -        if (dict_get (this->options, "nfs.enable-ino32")) { -                ret = dict_get_str (this->options, "nfs.enable-ino32", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_true) -                        nfs->enable_ino32 = 1; +        ret = gf_string2uint(optstr, &nfs->override_portnum); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse uint string"); +            goto free_foppool;          } +    } -        if (dict_get (this->options, "nfs.port")) { -                ret = dict_get_str (this->options, "nfs.port", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2uint (optstr, &nfs->override_portnum); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse uint string"); -                        goto free_foppool; -                } +    if (dict_get(this->options, "transport.socket.bind-address")) { +        ret = dict_get_str(this->options, "transport.socket.bind-address", +                           &optstr); +        if (ret < 0) { +            gf_log(GF_NFS, GF_LOG_ERROR, +                   "Failed to parse " +                   "transport.socket.bind-address string"); +        } else { +            this->instance_name = gf_strdup(optstr); +            for (i = 0; i < strlen(this->instance_name); i++) { +                if (this->instance_name[i] == '.' || +                    this->instance_name[i] == ':') +                    this->instance_name[i] = '_'; +            }          } +    } -        if (dict_get (this->options, "transport.socket.bind-address")) { -                ret = dict_get_str (this->options, -                        "transport.socket.bind-address", -                        &optstr); -                if (ret < 0) { -                        gf_log (GF_NFS, GF_LOG_ERROR, "Failed to parse " -                                "transport.socket.bind-address string"); -                } else { -                        this->instance_name = gf_strdup (optstr); -                        for (i = 0; i < strlen (this->instance_name); i++) { -                                if (this->instance_name[i] == '.' || -                                    this->instance_name[i] == ':') -                                        this->instance_name[i] = '_'; -                        } -                } +    if (dict_get(this->options, "transport.socket.listen-port") == NULL) { +        if (nfs->override_portnum) +            ret = gf_asprintf(&optstr, "%d", nfs->override_portnum); +        else +            ret = gf_asprintf(&optstr, "%d", GF_NFS3_PORT); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, +                   "failed mem-allocation"); +            goto free_foppool;          } - -        if (dict_get(this->options, "transport.socket.listen-port") == NULL) { -                if (nfs->override_portnum) -                        ret = gf_asprintf (&optstr, "%d", -                                           nfs->override_portnum); -                else -                        ret = gf_asprintf (&optstr, "%d", GF_NFS3_PORT); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, ENOMEM, NFS_MSG_NO_MEMORY, -                                "failed mem-allocation"); -                        goto free_foppool; -                } -                ret = dict_set_dynstr (this->options, -                                       "transport.socket.listen-port", optstr); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_DICT_SET_FAILED, -                                "dict_set_dynstr error"); -                        goto free_foppool; -                } +        ret = dict_set_dynstr(this->options, "transport.socket.listen-port", +                              optstr); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_DICT_SET_FAILED, +                   "dict_set_dynstr error"); +            goto free_foppool;          } +    }  #ifdef IPV6_DEFAULT -        ret = dict_set_str (this->options, "transport.address-family", -                            "inet6"); -        if (ret == -1) { -                gf_log (GF_NFS, GF_LOG_ERROR, "dict_set_str error"); -                goto free_foppool; -        } +    ret = dict_set_str(this->options, "transport.address-family", "inet6"); +    if (ret == -1) { +        gf_log(GF_NFS, GF_LOG_ERROR, "dict_set_str error"); +        goto free_foppool; +    }  #endif -        /* Right only socket support exists between nfs client and -         * gluster nfs, so we can set default value as socket -         */ -        ret = dict_set_str (this->options, "transport-type", "socket"); +    /* Right only socket support exists between nfs client and +     * gluster nfs, so we can set default value as socket +     */ +    ret = dict_set_str(this->options, "transport-type", "socket"); +    if (ret == -1) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_DICT_SET_FAILED, +               "dict_set_str error"); +        goto free_foppool; +    } + +    nfs->mount_udp = 0; +    if (dict_get(this->options, "nfs.mount-udp")) { +        ret = dict_get_str(this->options, "nfs.mount-udp", &optstr);          if (ret == -1) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_DICT_SET_FAILED, -                        "dict_set_str error"); -                goto free_foppool; +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        nfs->mount_udp = 0; -        if (dict_get(this->options, "nfs.mount-udp")) { -                ret = dict_get_str (this->options, "nfs.mount-udp", &optstr); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool " -                                "string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_true) -                        nfs->mount_udp = 1; +        ret = gf_string2boolean(optstr, &boolt); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool " +                   "string"); +            goto free_foppool;          } -        nfs->exports_auth = GF_NFS_DEFAULT_EXPORT_AUTH; -        if (dict_get(this->options, "nfs.exports-auth-enable")) { -                ret = dict_get_str (this->options, "nfs.exports-auth-enable", -                                    &optstr); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_true) -                        nfs->exports_auth = 1; -        } +        if (boolt == _gf_true) +            nfs->mount_udp = 1; +    } -        nfs->auth_refresh_time_secs = GF_NFS_DEFAULT_AUTH_REFRESH_INTERVAL_SEC; -        if (dict_get (this->options, "nfs.auth-refresh-interval-sec")) { -                ret = dict_get_str (this->options, -                                    "nfs.auth-refresh-interval-sec", &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2uint (optstr, &nfs->auth_refresh_time_secs); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse uint string"); -                        goto free_foppool; -                } +    nfs->exports_auth = GF_NFS_DEFAULT_EXPORT_AUTH; +    if (dict_get(this->options, "nfs.exports-auth-enable")) { +        ret = dict_get_str(this->options, "nfs.exports-auth-enable", &optstr); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        nfs->auth_cache_ttl_sec = GF_NFS_DEFAULT_AUTH_CACHE_TTL_SEC; -        if (dict_get (this->options, "nfs.auth-cache-ttl-sec")) { -                ret = dict_get_str (this->options, -                                    "nfs.auth-cache-ttl-sec", &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2uint (optstr, &nfs->auth_cache_ttl_sec); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse uint string"); -                        goto free_foppool; -                } +        ret = gf_string2boolean(optstr, &boolt); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool string"); +            goto free_foppool;          } -        /* TODO: Make this a configurable option in case we don't want to read -         * exports/netgroup files off disk when they change. */ -        nfs->refresh_auth = 1; - -        nfs->rmtab = gf_strdup (NFS_DATADIR "/rmtab"); -        if (dict_get(this->options, "nfs.mount-rmtab")) { -                ret = dict_get_str (this->options, "nfs.mount-rmtab", &nfs->rmtab); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                /* check if writing the rmtab is disabled*/ -                if (nfs->rmtab && strcmp ("/-", nfs->rmtab) == 0) { -                        GF_FREE (nfs->rmtab); -                        nfs->rmtab = NULL; -                } -        } +        if (boolt == _gf_true) +            nfs->exports_auth = 1; +    } -        /* support both options rpc-auth.ports.insecure and -         * rpc-auth-allow-insecure for backward compatibility -         */ -        nfs->allow_insecure = 1; -        if (dict_get(this->options, "rpc-auth.ports.insecure")) { -                ret = dict_get_str (this->options, "rpc-auth.ports.insecure", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool " -                                "string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_false) -                        nfs->allow_insecure = 0; +    nfs->auth_refresh_time_secs = GF_NFS_DEFAULT_AUTH_REFRESH_INTERVAL_SEC; +    if (dict_get(this->options, "nfs.auth-refresh-interval-sec")) { +        ret = dict_get_str(this->options, "nfs.auth-refresh-interval-sec", +                           &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        if (dict_get(this->options, "rpc-auth-allow-insecure")) { -                ret = dict_get_str (this->options, "rpc-auth-allow-insecure", -                                    &optstr); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, -                                "Failed to parse dict"); -                        goto free_foppool; -                } - -                ret = gf_string2boolean (optstr, &boolt); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, -                                "Failed to parse bool string"); -                        goto free_foppool; -                } - -                if (boolt == _gf_false) -                        nfs->allow_insecure = 0; +        ret = gf_string2uint(optstr, &nfs->auth_refresh_time_secs); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse uint string"); +            goto free_foppool;          } +    } -        if (nfs->allow_insecure) { -                /* blindly set both the options */ -                ret = dict_set_str (this->options, -                                    "rpc-auth-allow-insecure", "on"); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_DICT_SET_FAILED, "dict_set_str error"); -                        goto free_foppool; -                } -                ret = dict_set_str (this->options, -                                    "rpc-auth.ports.insecure", "on"); -                if (ret == -1) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_DICT_SET_FAILED, "dict_set_str error"); -                        goto free_foppool; -                } +    nfs->auth_cache_ttl_sec = GF_NFS_DEFAULT_AUTH_CACHE_TTL_SEC; +    if (dict_get(this->options, "nfs.auth-cache-ttl-sec")) { +        ret = dict_get_str(this->options, "nfs.auth-cache-ttl-sec", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        GF_OPTION_INIT ("nfs.rdirplus", nfs->rdirplus, bool, free_foppool); - -	GF_OPTION_INIT (OPT_SERVER_RPC_STATD, nfs->rpc_statd, path, free_foppool); - -	GF_OPTION_INIT (OPT_SERVER_RPC_STATD_PIDFILE, nfs->rpc_statd_pid_file, path, free_foppool); +        ret = gf_string2uint(optstr, &nfs->auth_cache_ttl_sec); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse uint string"); +            goto free_foppool; +        } +    } -        GF_OPTION_INIT (OPT_SERVER_AUX_GIDS, nfs->server_aux_gids, -                        bool, free_foppool); -        GF_OPTION_INIT (OPT_SERVER_GID_CACHE_TIMEOUT, -                        nfs->server_aux_gids_max_age, -                        uint32, free_foppool); +    /* TODO: Make this a configurable option in case we don't want to read +     * exports/netgroup files off disk when they change. */ +    nfs->refresh_auth = 1; -        if (gid_cache_init(&nfs->gid_cache, nfs->server_aux_gids_max_age) < 0) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                        NFS_MSG_INIT_GRP_CACHE_FAIL, -                        "Failed to initialize group cache."); -                goto free_foppool; +    nfs->rmtab = gf_strdup(NFS_DATADIR "/rmtab"); +    if (dict_get(this->options, "nfs.mount-rmtab")) { +        ret = dict_get_str(this->options, "nfs.mount-rmtab", &nfs->rmtab); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        ret = sys_access (nfs->rpc_statd, X_OK); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_WARNING, EPERM, NFS_MSG_NO_PERM, -                        "%s not enough permissions to access. Disabling NLM", -                        nfs->rpc_statd); -                nfs->enable_nlm = _gf_false; +        /* check if writing the rmtab is disabled*/ +        if (nfs->rmtab && strcmp("/-", nfs->rmtab) == 0) { +            GF_FREE(nfs->rmtab); +            nfs->rmtab = NULL; +        } +    } + +    /* support both options rpc-auth.ports.insecure and +     * rpc-auth-allow-insecure for backward compatibility +     */ +    nfs->allow_insecure = 1; +    if (dict_get(this->options, "rpc-auth.ports.insecure")) { +        ret = dict_get_str(this->options, "rpc-auth.ports.insecure", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        ret = sys_stat (nfs->rpc_statd, &stbuf); -        if (ret || !S_ISREG (stbuf.st_mode)) { -                gf_msg (GF_NFS, GF_LOG_WARNING, 0, NFS_MSG_REG_FILE_ERROR, -                        "%s not a regular file. Disabling NLM", nfs->rpc_statd); -                nfs->enable_nlm = _gf_false; +        ret = gf_string2boolean(optstr, &boolt); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool " +                   "string"); +            goto free_foppool;          } -        nfs->rpcsvc =  rpcsvc_init (this, this->ctx, -                                    this->options, fopspoolsize); -        if (!nfs->rpcsvc) { -                ret = -1; -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RPC_INIT_FAIL, -                        "RPC service init failed"); -                goto free_foppool; -        } +        if (boolt == _gf_false) +            nfs->allow_insecure = 0; +    } -        ret = rpcsvc_set_throttle_on (nfs->rpcsvc); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_ENABLE_THROTTLE_FAIL, -                        "Enabling throttle failed"); -                goto free_foppool; +    if (dict_get(this->options, "rpc-auth-allow-insecure")) { +        ret = dict_get_str(this->options, "rpc-auth-allow-insecure", &optstr); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, -ret, NFS_MSG_PARSE_FAIL, +                   "Failed to parse dict"); +            goto free_foppool;          } -        ret = rpcsvc_set_outstanding_rpc_limit (nfs->rpcsvc, -                                                this->options, -                                                RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT); +        ret = gf_string2boolean(optstr, &boolt);          if (ret < 0) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RPC_CONFIG_FAIL, -                        "Failed to configure outstanding-rpc-limit"); -                goto free_foppool; +            gf_msg(GF_NFS, GF_LOG_ERROR, errno, NFS_MSG_PARSE_FAIL, +                   "Failed to parse bool string"); +            goto free_foppool;          } -        nfs->register_portmap = rpcsvc_register_portmap_enabled (nfs->rpcsvc); +        if (boolt == _gf_false) +            nfs->allow_insecure = 0; +    } -        GF_OPTION_INIT ("nfs.event-threads", -                        nfs->event_threads, uint32, free_foppool); -        event_reconfigure_threads (this->ctx->event_pool, nfs->event_threads); - -        this->private = (void *)nfs; -        INIT_LIST_HEAD (&nfs->versions); -        nfs->generation = 1965; - -        ret = 0; +    if (nfs->allow_insecure) { +        /* blindly set both the options */ +        ret = dict_set_str(this->options, "rpc-auth-allow-insecure", "on"); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_DICT_SET_FAILED, +                   "dict_set_str error"); +            goto free_foppool; +        } +        ret = dict_set_str(this->options, "rpc-auth.ports.insecure", "on"); +        if (ret == -1) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_DICT_SET_FAILED, +                   "dict_set_str error"); +            goto free_foppool; +        } +    } + +    GF_OPTION_INIT("nfs.rdirplus", nfs->rdirplus, bool, free_foppool); + +    GF_OPTION_INIT(OPT_SERVER_RPC_STATD, nfs->rpc_statd, path, free_foppool); + +    GF_OPTION_INIT(OPT_SERVER_RPC_STATD_PIDFILE, nfs->rpc_statd_pid_file, path, +                   free_foppool); + +    GF_OPTION_INIT(OPT_SERVER_AUX_GIDS, nfs->server_aux_gids, bool, +                   free_foppool); +    GF_OPTION_INIT(OPT_SERVER_GID_CACHE_TIMEOUT, nfs->server_aux_gids_max_age, +                   uint32, free_foppool); + +    if (gid_cache_init(&nfs->gid_cache, nfs->server_aux_gids_max_age) < 0) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_GRP_CACHE_FAIL, +               "Failed to initialize group cache."); +        goto free_foppool; +    } + +    ret = sys_access(nfs->rpc_statd, X_OK); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_WARNING, EPERM, NFS_MSG_NO_PERM, +               "%s not enough permissions to access. Disabling NLM", +               nfs->rpc_statd); +        nfs->enable_nlm = _gf_false; +    } + +    ret = sys_stat(nfs->rpc_statd, &stbuf); +    if (ret || !S_ISREG(stbuf.st_mode)) { +        gf_msg(GF_NFS, GF_LOG_WARNING, 0, NFS_MSG_REG_FILE_ERROR, +               "%s not a regular file. Disabling NLM", nfs->rpc_statd); +        nfs->enable_nlm = _gf_false; +    } + +    nfs->rpcsvc = rpcsvc_init(this, this->ctx, this->options, fopspoolsize); +    if (!nfs->rpcsvc) { +        ret = -1; +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RPC_INIT_FAIL, +               "RPC service init failed"); +        goto free_foppool; +    } + +    ret = rpcsvc_set_throttle_on(nfs->rpcsvc); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_ENABLE_THROTTLE_FAIL, +               "Enabling throttle failed"); +        goto free_foppool; +    } + +    ret = rpcsvc_set_outstanding_rpc_limit( +        nfs->rpcsvc, this->options, RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT); +    if (ret < 0) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RPC_CONFIG_FAIL, +               "Failed to configure outstanding-rpc-limit"); +        goto free_foppool; +    } + +    nfs->register_portmap = rpcsvc_register_portmap_enabled(nfs->rpcsvc); + +    GF_OPTION_INIT("nfs.event-threads", nfs->event_threads, uint32, +                   free_foppool); +    event_reconfigure_threads(this->ctx->event_pool, nfs->event_threads); + +    this->private = (void *)nfs; +    INIT_LIST_HEAD(&nfs->versions); +    nfs->generation = 1965; + +    ret = 0;  free_foppool: -        if (ret < 0) -                mem_pool_destroy (nfs->foppool); +    if (ret < 0) +        mem_pool_destroy(nfs->foppool);  free_rpcsvc: -        /* -         * rpcsvc_deinit */ -        if (ret < 0) { -                GF_FREE (nfs); -                nfs = NULL; -        } - -        return nfs; +    /* +     * rpcsvc_deinit */ +    if (ret < 0) { +        GF_FREE(nfs); +        nfs = NULL; +    } + +    return nfs;  }  int -nfs_drc_init (xlator_t *this) +nfs_drc_init(xlator_t *this)  { -        int       ret     = -1; -        rpcsvc_t *svc     = NULL; +    int ret = -1; +    rpcsvc_t *svc = NULL; -        GF_VALIDATE_OR_GOTO (GF_NFS, this, out); -        GF_VALIDATE_OR_GOTO (GF_NFS, this->private, out); +    GF_VALIDATE_OR_GOTO(GF_NFS, this, out); +    GF_VALIDATE_OR_GOTO(GF_NFS, this->private, out); -        svc = ((struct nfs_state *)(this->private))->rpcsvc; -        if (!svc) -                goto out; +    svc = ((struct nfs_state *)(this->private))->rpcsvc; +    if (!svc) +        goto out; -        ret = rpcsvc_drc_init (svc, this->options); +    ret = rpcsvc_drc_init(svc, this->options); - out: -        return ret; +out: +    return ret;  }  int -nfs_reconfigure_state (xlator_t *this, dict_t *options) +nfs_reconfigure_state(xlator_t *this, dict_t *options)  { -        int                 ret = 0; -        int                 keyindx = 0; -        char                *rmtab = NULL; -        char                *rpc_statd = NULL; -        gf_boolean_t        optbool; -        uint32_t            optuint32; -        struct nfs_state    *nfs = NULL; -        char                *blacklist_keys[] = { -                                        "nfs.port", -                                        "nfs.transport-type", -                                        "nfs.mem-factor", -                                        NULL}; - -        GF_VALIDATE_OR_GOTO (GF_NFS, this, out); -        GF_VALIDATE_OR_GOTO (GF_NFS, this->private, out); -        GF_VALIDATE_OR_GOTO (GF_NFS, options, out); - -        nfs = (struct nfs_state *)this->private; - -        /* Black listed options can't be reconfigured, they need -         * NFS to be restarted. There are two cases 1. SET 2. UNSET. -         * 1. SET */ -        while (blacklist_keys[keyindx]) { -                if (dict_get (options, blacklist_keys[keyindx])) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, -                                NFS_MSG_RECONFIG_FAIL, -                                "Reconfiguring %s needs NFS restart", -                                blacklist_keys[keyindx]); -                        goto out; -                } -                keyindx ++; -        } - -        /* UNSET for nfs.mem-factor */ -        if ((!dict_get (options, "nfs.mem-factor")) && -            (nfs->memfactor != GF_NFS_DEFAULT_MEMFACTOR)) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_FAIL, -                        "Reconfiguring nfs.mem-factor needs NFS restart"); -                goto out; -        } - -        /* UNSET for nfs.port */ -        if ((!dict_get (options, "nfs.port")) && -            (nfs->override_portnum)) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "Reconfiguring nfs.port needs NFS restart"); -                goto out; -        } - -        /* reconfig nfs.rpc-statd...  */ -        rpc_statd = GF_RPC_STATD_PROG; -        if (dict_get (options, OPT_SERVER_RPC_STATD_PIDFILE)) { -                ret = dict_get_str (options, "nfs.rpc-statd", &rpc_statd); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, -                                "Failed to read reconfigured option: " -                                "nfs.rpc-statd"); -                        goto out; -                } -        } - -        if (strcmp(nfs->rpc_statd, rpc_statd) != 0) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_FAIL, -                        "Reconfiguring nfs.rpc-statd needs NFS restart"); -                goto out; -        } - -        /* reconfig nfs.mount-rmtab */ -        rmtab = NFS_DATADIR "/rmtab"; -        if (dict_get (options, "nfs.mount-rmtab")) { -                ret = dict_get_str (options, "nfs.mount-rmtab", &rmtab); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, -                                "Failed to read reconfigured option:" -                                " nfs.mount-rmtab"); -                        goto out; -                } -                gf_path_strip_trailing_slashes (rmtab); -        } -        /* check if writing the rmtab is disabled*/ -        if (strcmp ("/-", rmtab) == 0) { -                GF_FREE (nfs->rmtab); -                nfs->rmtab = NULL; -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_WRITE_FAIL, -                        "Disabled writing of nfs.mount-rmtab"); -        } else if (!nfs->rmtab || strcmp (nfs->rmtab, rmtab) != 0) { -                mount_rewrite_rmtab (nfs->mstate, rmtab); -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_PATH, -                        "Reconfigured nfs.mount-rmtab path: %s", nfs->rmtab); -        } - -        GF_OPTION_RECONF (OPT_SERVER_AUX_GIDS, optbool, -                                               options, bool, out); -        if (nfs->server_aux_gids != optbool) { -                nfs->server_aux_gids = optbool; -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, -                        "Reconfigured %s with value %d", OPT_SERVER_AUX_GIDS, -                        optbool); -        } - -        GF_OPTION_RECONF (OPT_SERVER_GID_CACHE_TIMEOUT, optuint32, -                                               options, uint32, out); -        if (nfs->server_aux_gids_max_age != optuint32) { -                nfs->server_aux_gids_max_age = optuint32; -                gid_cache_reconf (&nfs->gid_cache, optuint32); -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, -                        "Reconfigured %s with value %d", -                        OPT_SERVER_GID_CACHE_TIMEOUT, optuint32); -        } - -        GF_OPTION_RECONF ("nfs.rdirplus", optbool, -                                          options, bool, out); -        if (nfs->rdirplus != optbool) { -                nfs->rdirplus = optbool; -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, -                        "Reconfigured nfs.rdirplus with value %d", optbool); -        } - -        /* reconfig nfs.dynamic-volumes */ -        ret = dict_get_str_boolean (options, "nfs.dynamic-volumes", -                                             GF_NFS_DVM_OFF); -        switch (ret) { +    int ret = 0; +    int keyindx = 0; +    char *rmtab = NULL; +    char *rpc_statd = NULL; +    gf_boolean_t optbool; +    uint32_t optuint32; +    struct nfs_state *nfs = NULL; +    char *blacklist_keys[] = {"nfs.port", "nfs.transport-type", +                              "nfs.mem-factor", NULL}; + +    GF_VALIDATE_OR_GOTO(GF_NFS, this, out); +    GF_VALIDATE_OR_GOTO(GF_NFS, this->private, out); +    GF_VALIDATE_OR_GOTO(GF_NFS, options, out); + +    nfs = (struct nfs_state *)this->private; + +    /* Black listed options can't be reconfigured, they need +     * NFS to be restarted. There are two cases 1. SET 2. UNSET. +     * 1. SET */ +    while (blacklist_keys[keyindx]) { +        if (dict_get(options, blacklist_keys[keyindx])) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +                   "Reconfiguring %s needs NFS restart", +                   blacklist_keys[keyindx]); +            goto out; +        } +        keyindx++; +    } + +    /* UNSET for nfs.mem-factor */ +    if ((!dict_get(options, "nfs.mem-factor")) && +        (nfs->memfactor != GF_NFS_DEFAULT_MEMFACTOR)) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_FAIL, +               "Reconfiguring nfs.mem-factor needs NFS restart"); +        goto out; +    } + +    /* UNSET for nfs.port */ +    if ((!dict_get(options, "nfs.port")) && (nfs->override_portnum)) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "Reconfiguring nfs.port needs NFS restart"); +        goto out; +    } + +    /* reconfig nfs.rpc-statd...  */ +    rpc_statd = GF_RPC_STATD_PROG; +    if (dict_get(options, OPT_SERVER_RPC_STATD_PIDFILE)) { +        ret = dict_get_str(options, "nfs.rpc-statd", &rpc_statd); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, +                   "Failed to read reconfigured option: " +                   "nfs.rpc-statd"); +            goto out; +        } +    } + +    if (strcmp(nfs->rpc_statd, rpc_statd) != 0) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_FAIL, +               "Reconfiguring nfs.rpc-statd needs NFS restart"); +        goto out; +    } + +    /* reconfig nfs.mount-rmtab */ +    rmtab = NFS_DATADIR "/rmtab"; +    if (dict_get(options, "nfs.mount-rmtab")) { +        ret = dict_get_str(options, "nfs.mount-rmtab", &rmtab); +        if (ret < 0) { +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, +                   "Failed to read reconfigured option:" +                   " nfs.mount-rmtab"); +            goto out; +        } +        gf_path_strip_trailing_slashes(rmtab); +    } +    /* check if writing the rmtab is disabled*/ +    if (strcmp("/-", rmtab) == 0) { +        GF_FREE(nfs->rmtab); +        nfs->rmtab = NULL; +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_WRITE_FAIL, +               "Disabled writing of nfs.mount-rmtab"); +    } else if (!nfs->rmtab || strcmp(nfs->rmtab, rmtab) != 0) { +        mount_rewrite_rmtab(nfs->mstate, rmtab); +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_PATH, +               "Reconfigured nfs.mount-rmtab path: %s", nfs->rmtab); +    } + +    GF_OPTION_RECONF(OPT_SERVER_AUX_GIDS, optbool, options, bool, out); +    if (nfs->server_aux_gids != optbool) { +        nfs->server_aux_gids = optbool; +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, +               "Reconfigured %s with value %d", OPT_SERVER_AUX_GIDS, optbool); +    } + +    GF_OPTION_RECONF(OPT_SERVER_GID_CACHE_TIMEOUT, optuint32, options, uint32, +                     out); +    if (nfs->server_aux_gids_max_age != optuint32) { +        nfs->server_aux_gids_max_age = optuint32; +        gid_cache_reconf(&nfs->gid_cache, optuint32); +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, +               "Reconfigured %s with value %d", OPT_SERVER_GID_CACHE_TIMEOUT, +               optuint32); +    } + +    GF_OPTION_RECONF("nfs.rdirplus", optbool, options, bool, out); +    if (nfs->rdirplus != optbool) { +        nfs->rdirplus = optbool; +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VALUE, +               "Reconfigured nfs.rdirplus with value %d", optbool); +    } + +    /* reconfig nfs.dynamic-volumes */ +    ret = dict_get_str_boolean(options, "nfs.dynamic-volumes", GF_NFS_DVM_OFF); +    switch (ret) {          case GF_NFS_DVM_ON:          case GF_NFS_DVM_OFF: -                optbool = ret; -                break; +            optbool = ret; +            break;          default: -                optbool = GF_NFS_DVM_OFF; -                break; -        } -        if (nfs->dynamicvolumes != optbool) { -                nfs->dynamicvolumes = optbool; -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VOL, -                        "Reconfigured nfs.dynamic-volumes with value %d", -                        optbool); -        } - -        optbool = _gf_false; -        if (dict_get (options, "nfs.enable-ino32")) { -                ret = dict_get_str_boolean (options, "nfs.enable-ino32", -                                                      _gf_false); -                if (ret < 0) { -                        gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, -                                "Failed to read reconfigured option: " -                                "nfs.enable-ino32"); -                        goto out; -                } -                optbool = ret; -        } -        if (nfs->enable_ino32 != optbool) { -                nfs->enable_ino32 = optbool; -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_ENABLE, -                        "Reconfigured nfs.enable-ino32 with value %d", optbool); -        } - -        /* nfs.nlm is enabled by default */ -        ret = dict_get_str_boolean (options, "nfs.nlm", _gf_true); +            optbool = GF_NFS_DVM_OFF; +            break; +    } +    if (nfs->dynamicvolumes != optbool) { +        nfs->dynamicvolumes = optbool; +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_VOL, +               "Reconfigured nfs.dynamic-volumes with value %d", optbool); +    } + +    optbool = _gf_false; +    if (dict_get(options, "nfs.enable-ino32")) { +        ret = dict_get_str_boolean(options, "nfs.enable-ino32", _gf_false);          if (ret < 0) { -                optbool = _gf_true; -        } else { -                optbool = ret; -        } -        if (nfs->enable_nlm != optbool) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NLM_INFO, "NLM is" -                        " manually %s", (optbool ? "enabled":"disabled")); -                nfs->enable_nlm = optbool; -                nfs_reconfigure_nlm4 (this); -        } - -        /* nfs.acl is enabled by default */ -        ret = dict_get_str_boolean (options, "nfs.acl", _gf_true); -        if (ret < 0) { -                optbool = _gf_true; -        } else { -                optbool = ret; -        } -        if (nfs->enable_acl != optbool) { -                gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_ACL_INFO, "ACL is " -                        "manually %s", (optbool ? "enabled":"disabled")); -                nfs->enable_acl = optbool; -                nfs_reconfigure_acl3 (this); -        } - -        GF_OPTION_RECONF ("nfs.event-threads", -                            nfs->event_threads, options, uint32, out); -        event_reconfigure_threads (this->ctx->event_pool, nfs->event_threads); - - -        ret = 0; +            gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_READ_FAIL, +                   "Failed to read reconfigured option: " +                   "nfs.enable-ino32"); +            goto out; +        } +        optbool = ret; +    } +    if (nfs->enable_ino32 != optbool) { +        nfs->enable_ino32 = optbool; +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_RECONFIG_ENABLE, +               "Reconfigured nfs.enable-ino32 with value %d", optbool); +    } + +    /* nfs.nlm is enabled by default */ +    ret = dict_get_str_boolean(options, "nfs.nlm", _gf_true); +    if (ret < 0) { +        optbool = _gf_true; +    } else { +        optbool = ret; +    } +    if (nfs->enable_nlm != optbool) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_NLM_INFO, +               "NLM is" +               " manually %s", +               (optbool ? "enabled" : "disabled")); +        nfs->enable_nlm = optbool; +        nfs_reconfigure_nlm4(this); +    } + +    /* nfs.acl is enabled by default */ +    ret = dict_get_str_boolean(options, "nfs.acl", _gf_true); +    if (ret < 0) { +        optbool = _gf_true; +    } else { +        optbool = ret; +    } +    if (nfs->enable_acl != optbool) { +        gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_ACL_INFO, +               "ACL is " +               "manually %s", +               (optbool ? "enabled" : "disabled")); +        nfs->enable_acl = optbool; +        nfs_reconfigure_acl3(this); +    } + +    GF_OPTION_RECONF("nfs.event-threads", nfs->event_threads, options, uint32, +                     out); +    event_reconfigure_threads(this->ctx->event_pool, nfs->event_threads); + +    ret = 0;  out: -        return ret; +    return ret;  } -  /*   * reconfigure() for NFS server xlator.   */  int -reconfigure (xlator_t *this, dict_t *options) +reconfigure(xlator_t *this, dict_t *options)  { -        int                      ret = 0; -        struct nfs_state         *nfs = NULL; -        gf_boolean_t             regpmap = _gf_true; - -        if ((!this) || (!this->private) || (!options)) -                return (-1); +    int ret = 0; +    struct nfs_state *nfs = NULL; +    gf_boolean_t regpmap = _gf_true; -        nfs = (struct nfs_state *)this->private; +    if ((!this) || (!this->private) || (!options)) +        return (-1); -        /* Reconfigure nfs options */ -        ret = nfs_reconfigure_state(this, options); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "nfs reconfigure state failed"); -                return (-1); -        } +    nfs = (struct nfs_state *)this->private; -        /* Reconfigure nfs3 options */ -        ret = nfs3_reconfigure_state(this, options); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "nfs3 reconfigure state failed"); -                return (-1); -        } +    /* Reconfigure nfs options */ +    ret = nfs_reconfigure_state(this, options); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "nfs reconfigure state failed"); +        return (-1); +    } -        /* Reconfigure mount options */ -        ret = mount_reconfigure_state(this, options); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "mount reconfigure state failed"); -                return (-1); -        } +    /* Reconfigure nfs3 options */ +    ret = nfs3_reconfigure_state(this, options); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "nfs3 reconfigure state failed"); +        return (-1); +    } -        /* Reconfigure rpc layer */ -        ret = rpcsvc_reconfigure_options (nfs->rpcsvc, options); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "rpcsvc reconfigure options failed"); -                return (-1); -        } +    /* Reconfigure mount options */ +    ret = mount_reconfigure_state(this, options); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "mount reconfigure state failed"); +        return (-1); +    } -        /* Reconfigure rpc.outstanding-rpc-limit */ -        ret = rpcsvc_set_outstanding_rpc_limit (nfs->rpcsvc, -                                       options, -                                       RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT); -        if (ret < 0) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "Failed to reconfigure outstanding-rpc-limit"); -                return (-1); -        } +    /* Reconfigure rpc layer */ +    ret = rpcsvc_reconfigure_options(nfs->rpcsvc, options); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "rpcsvc reconfigure options failed"); +        return (-1); +    } + +    /* Reconfigure rpc.outstanding-rpc-limit */ +    ret = rpcsvc_set_outstanding_rpc_limit( +        nfs->rpcsvc, options, RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT); +    if (ret < 0) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "Failed to reconfigure outstanding-rpc-limit"); +        return (-1); +    } -        regpmap = rpcsvc_register_portmap_enabled(nfs->rpcsvc); -        if (nfs->register_portmap != regpmap) { -                nfs->register_portmap = regpmap; -                if (regpmap) { -                        (void) nfs_program_register_portmap_all (nfs); -                } else { -                        (void) nfs_program_unregister_portmap_all (nfs); -                } +    regpmap = rpcsvc_register_portmap_enabled(nfs->rpcsvc); +    if (nfs->register_portmap != regpmap) { +        nfs->register_portmap = regpmap; +        if (regpmap) { +            (void)nfs_program_register_portmap_all(nfs); +        } else { +            (void)nfs_program_unregister_portmap_all(nfs);          } +    } -        /* Reconfigure drc */ -        ret = rpcsvc_drc_reconfigure (nfs->rpcsvc, options); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, -                        "rpcsvc DRC reconfigure failed"); -                return (-1); -        } +    /* Reconfigure drc */ +    ret = rpcsvc_drc_reconfigure(nfs->rpcsvc, options); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_RECONFIG_FAIL, +               "rpcsvc DRC reconfigure failed"); +        return (-1); +    } -        return (0); +    return (0);  }  /* Main init() routine for NFS server xlator. It inits NFS v3 protocol @@ -1496,650 +1439,604 @@ reconfigure (xlator_t *this, dict_t *options)   *      -1 (FAILURE) if any of them FAILS.   */  int -init (xlator_t *this) { - -        struct nfs_state        *nfs = NULL; -        int                     ret = -1; +init(xlator_t *this) +{ +    struct nfs_state *nfs = NULL; +    int ret = -1; -        if (!this) -                return (-1); +    if (!this) +        return (-1); -        nfs = nfs_init_state (this); -        if (!nfs) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_OPT_INIT_FAIL, -                        "Failed to init nfs option"); -                return (-1); -        } +    nfs = nfs_init_state(this); +    if (!nfs) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_OPT_INIT_FAIL, +               "Failed to init nfs option"); +        return (-1); +    } -        ret = nfs_add_all_initiators (nfs); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, -                        "Failed to add initiators"); -                return (-1); -        } +    ret = nfs_add_all_initiators(nfs); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, +               "Failed to add initiators"); +        return (-1); +    } -        ret = nfs_init_subvolumes (nfs, this->children); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, -                        "Failed to init NFS exports"); -                return (-1); -        } +    ret = nfs_init_subvolumes(nfs, this->children); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, +               "Failed to init NFS exports"); +        return (-1); +    } -        ret = mount_init_state (this); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, -                        "Failed to init Mount state"); -                return (-1); -        } +    ret = mount_init_state(this); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, +               "Failed to init Mount state"); +        return (-1); +    } -        ret = nlm4_init_state (this); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, -                        "Failed to init NLM state"); -                return (-1); -        } +    ret = nlm4_init_state(this); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_CRITICAL, 0, NFS_MSG_INIT_FAIL, +               "Failed to init NLM state"); +        return (-1); +    } -        ret = nfs_init_versions (nfs, this); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, -                        "Failed to initialize protocols"); -                return (-1); -        } +    ret = nfs_init_versions(nfs, this); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, +               "Failed to initialize protocols"); +        return (-1); +    } -        ret = nfs_drc_init (this); -        if (ret) { -                gf_msg (GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, -                        "Failed to initialize DRC"); -                return (-1); -        } +    ret = nfs_drc_init(this); +    if (ret) { +        gf_msg(GF_NFS, GF_LOG_ERROR, 0, NFS_MSG_INIT_FAIL, +               "Failed to initialize DRC"); +        return (-1); +    } -        gf_msg (GF_NFS, GF_LOG_INFO, 0, NFS_MSG_STARTED, -                "NFS service started"); -        return (0); /* SUCCESS */ +    gf_msg(GF_NFS, GF_LOG_INFO, 0, NFS_MSG_STARTED, "NFS service started"); +    return (0); /* SUCCESS */  } -  int -notify (xlator_t *this, int32_t event, void *data, ...) +notify(xlator_t *this, int32_t event, void *data, ...)  { -        xlator_t                *subvol = NULL; -        struct nfs_state        *priv   = NULL; +    xlator_t *subvol = NULL; +    struct nfs_state *priv = NULL; -        subvol = (xlator_t *)data; +    subvol = (xlator_t *)data; -        gf_msg_trace (GF_NFS, 0, "Notification received: %d", -                event); +    gf_msg_trace(GF_NFS, 0, "Notification received: %d", event); -        switch (event) { +    switch (event) {          case GF_EVENT_CHILD_UP: -                nfs_startup_subvolume (this, subvol); -                break; +            nfs_startup_subvolume(this, subvol); +            break;          case GF_EVENT_SOME_DESCENDENT_DOWN:          case GF_EVENT_SOME_DESCENDENT_UP: -                priv = this->private; -                ++(priv->generation); -                break; +            priv = this->private; +            ++(priv->generation); +            break;          case GF_EVENT_PARENT_UP: -                default_notify (this, GF_EVENT_PARENT_UP, data); -                break; -        } +            default_notify(this, GF_EVENT_PARENT_UP, data); +            break; +    } -        return 0; +    return 0;  } -  int -fini (xlator_t *this) +fini(xlator_t *this)  { - -        struct nfs_state        *nfs = NULL; - -        mnt3svc_deinit (this); -        nfs = (struct nfs_state *)this->private; -        gf_msg_debug (GF_NFS, 0, "NFS service going down"); -        nfs_deinit_versions (&nfs->versions, this); -        GF_FREE (this->instance_name); -        return 0; +    struct nfs_state *nfs = NULL; + +    mnt3svc_deinit(this); +    nfs = (struct nfs_state *)this->private; +    gf_msg_debug(GF_NFS, 0, "NFS service going down"); +    nfs_deinit_versions(&nfs->versions, this); +    GF_FREE(this->instance_name); +    return 0;  }  int32_t -nfs_forget (xlator_t *this, inode_t *inode) +nfs_forget(xlator_t *this, inode_t *inode)  { -        uint64_t                 ctx    = 0; -        struct nfs_inode_ctx    *ictx   = NULL; +    uint64_t ctx = 0; +    struct nfs_inode_ctx *ictx = NULL; -        if (inode_ctx_del (inode, this, &ctx)) -                return -1; +    if (inode_ctx_del(inode, this, &ctx)) +        return -1; -        ictx = (struct nfs_inode_ctx *)ctx; -        GF_FREE (ictx); +    ictx = (struct nfs_inode_ctx *)ctx; +    GF_FREE(ictx); -        return 0; +    return 0;  }  gf_boolean_t -_nfs_export_is_for_vol (char *exname, char *volname) +_nfs_export_is_for_vol(char *exname, char *volname)  { -        gf_boolean_t    ret = _gf_false; -        char            *tmp = NULL; +    gf_boolean_t ret = _gf_false; +    char *tmp = NULL; -        tmp = exname; -        if (tmp[0] == '/') -                tmp++; +    tmp = exname; +    if (tmp[0] == '/') +        tmp++; -        if (!strcmp (tmp, volname)) -                ret = _gf_true; +    if (!strcmp(tmp, volname)) +        ret = _gf_true; -        return ret; +    return ret;  }  int -nfs_priv_to_dict (xlator_t *this, dict_t *dict, char *brickname) +nfs_priv_to_dict(xlator_t *this, dict_t *dict, char *brickname)  { -        int                     ret = -1; -        struct nfs_state        *priv = NULL; -        struct mountentry       *mentry = NULL; -        char                    *volname = NULL; -        char                    key[1024] = {0,}; -        int                     count = 0; - -        GF_VALIDATE_OR_GOTO (THIS->name, this, out); -        GF_VALIDATE_OR_GOTO (THIS->name, dict, out); - -        priv = this->private; -        GF_ASSERT (priv); +    int ret = -1; +    struct nfs_state *priv = NULL; +    struct mountentry *mentry = NULL; +    char *volname = NULL; +    char key[1024] = { +        0, +    }; +    int count = 0; + +    GF_VALIDATE_OR_GOTO(THIS->name, this, out); +    GF_VALIDATE_OR_GOTO(THIS->name, dict, out); + +    priv = this->private; +    GF_ASSERT(priv); + +    ret = dict_get_str(dict, "volname", &volname); +    if (ret) { +        gf_msg(this->name, GF_LOG_ERROR, -ret, NFS_MSG_VOL_NOT_FOUND, +               "Could not get volname"); +        goto out; +    } + +    list_for_each_entry(mentry, &priv->mstate->mountlist, mlist) +    { +        if (!_nfs_export_is_for_vol(mentry->exname, volname)) +            continue; + +        snprintf(key, sizeof(key), "client%d.hostname", count); +        ret = dict_set_str(dict, key, mentry->hostname); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, NFS_MSG_WRITE_FAIL, +                   "Error writing hostname to dict"); +            goto out; +        } -        ret = dict_get_str (dict, "volname", &volname); +        /* No connection data available yet in nfs server. +         * Hence, setting to 0 to prevent cli failing +         */ +        snprintf(key, sizeof(key), "client%d.bytesread", count); +        ret = dict_set_uint64(dict, key, 0);          if (ret) { -                gf_msg (this->name, GF_LOG_ERROR, -ret, NFS_MSG_VOL_NOT_FOUND, -                        "Could not get volname"); -                goto out; +            gf_msg(this->name, GF_LOG_ERROR, 0, NFS_MSG_WRITE_FAIL, +                   "Error writing bytes read to dict"); +            goto out;          } -        list_for_each_entry (mentry, &priv->mstate->mountlist, mlist) { -                if (!_nfs_export_is_for_vol (mentry->exname, volname)) -                        continue; - -                snprintf (key, sizeof (key), "client%d.hostname", count); -                ret = dict_set_str (dict, key, mentry->hostname); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                NFS_MSG_WRITE_FAIL, -                                "Error writing hostname to dict"); -                        goto out; -                } - -                /* No connection data available yet in nfs server. -                 * Hence, setting to 0 to prevent cli failing -                 */ -                snprintf (key, sizeof (key), "client%d.bytesread", count); -                ret = dict_set_uint64 (dict, key, 0); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                NFS_MSG_WRITE_FAIL, -                                "Error writing bytes read to dict"); -                        goto out; -                } - -                snprintf (key, sizeof (key), "client%d.byteswrite", count); -                ret = dict_set_uint64 (dict, key, 0); -                if (ret) { -                        gf_msg (this->name, GF_LOG_ERROR, 0, -                                NFS_MSG_WRITE_FAIL, -                                "Error writing bytes write to dict"); -                        goto out; -                } - -                count++; +        snprintf(key, sizeof(key), "client%d.byteswrite", count); +        ret = dict_set_uint64(dict, key, 0); +        if (ret) { +            gf_msg(this->name, GF_LOG_ERROR, 0, NFS_MSG_WRITE_FAIL, +                   "Error writing bytes write to dict"); +            goto out;          } -        ret = dict_set_int32 (dict, "clientcount", count); -        if (ret) -                gf_msg (this->name, GF_LOG_ERROR, 0, NFS_MSG_WRITE_FAIL, -                        "Error writing client count to dict"); +        count++; +    } + +    ret = dict_set_int32(dict, "clientcount", count); +    if (ret) +        gf_msg(this->name, GF_LOG_ERROR, 0, NFS_MSG_WRITE_FAIL, +               "Error writing client count to dict");  out: -        gf_msg_debug (THIS->name, 0, "Returning %d", ret); -        return ret; +    gf_msg_debug(THIS->name, 0, "Returning %d", ret); +    return ret;  }  extern int32_t -nlm_priv (xlator_t *this); +nlm_priv(xlator_t *this);  int32_t -nfs_priv (xlator_t *this) +nfs_priv(xlator_t *this)  { -        int32_t ret = -1; - -        /* DRC needs the global drc structure, xl is of no use to it. */ -        ret = rpcsvc_drc_priv (((struct nfs_state *)(this->private))->rpcsvc->drc); -        if (ret) { -                gf_msg_debug (this->name, 0, "Statedump of DRC failed"); -                goto out; -        } - -        ret = nlm_priv (this); -        if (ret) { -                gf_msg_debug (this->name, 0, "Statedump of NLM failed"); -                goto out; -        } - out: -        return ret; +    int32_t ret = -1; + +    /* DRC needs the global drc structure, xl is of no use to it. */ +    ret = rpcsvc_drc_priv(((struct nfs_state *)(this->private))->rpcsvc->drc); +    if (ret) { +        gf_msg_debug(this->name, 0, "Statedump of DRC failed"); +        goto out; +    } + +    ret = nlm_priv(this); +    if (ret) { +        gf_msg_debug(this->name, 0, "Statedump of NLM failed"); +        goto out; +    } +out: +    return ret;  } -  struct xlator_cbks cbks = { -        .forget      = nfs_forget, +    .forget = nfs_forget,  };  struct xlator_fops fops;  struct xlator_dumpops dumpops = { -        .priv           = nfs_priv, -        .priv_to_dict   = nfs_priv_to_dict, +    .priv = nfs_priv, +    .priv_to_dict = nfs_priv_to_dict,  };  /* TODO: If needed, per-volume options below can be extended to be export   * specific also because after export-dir is introduced, a volume is not   * necessarily an export whereas different subdirectories within that volume   * can be and may need these options to be specified separately. -*/ + */  struct volume_options options[] = { -        { .key  = {"nfs3.read-size"}, -          .type = GF_OPTION_TYPE_SIZET, -          .min  = GF_NFS3_RTMIN, -          .max  = GF_NFS3_RTMAX, -          .default_value = TOSTRING(GF_NFS3_RTPREF), -          .description = "Size in which the client should issue read requests " -                         "to the Gluster NFSv3 server. Must be a multiple of " -                         "4KB (4096). Min and Max supported values are 4KB " -                         "(4096) and 1MB (1048576) respectively. If the " -                         "specified value is within the supported range but " -                         "not a multiple of 4096, it is rounded up to the " -                         "nearest multiple of 4096." -        }, -        { .key  = {"nfs3.write-size"}, -          .type = GF_OPTION_TYPE_SIZET, -          .min  = GF_NFS3_WTMIN, -          .max  = GF_NFS3_WTMAX, -          .default_value = TOSTRING(GF_NFS3_WTPREF), -          .description = "Size in which the client should issue write requests " -                         "to the Gluster NFSv3 server. Must be a multiple of " -                         "1KB (1024). Min and Max supported values are " -                         "4KB (4096) and 1MB(1048576) respectively. If the " -                         "specified value is within the supported range but " -                         "not a multiple of 4096, it is rounded up to the " -                         "nearest multiple of 4096." -        }, -        { .key  = {"nfs3.readdir-size"}, -          .type = GF_OPTION_TYPE_SIZET, -          .min  = GF_NFS3_DTMIN, -          .max  = GF_NFS3_DTMAX, -          .default_value = TOSTRING(GF_NFS3_DTPREF), -          .description = "Size in which the client should issue directory " -                         "reading requests to the Gluster NFSv3 server. Must " -                         "be a multiple of 1KB (1024). Min and Max supported " -                         "values are 4KB (4096) and 1MB (1048576) respectively." -                         "If the specified value is within the supported range " -                         "but not a multiple of 4096, it is rounded up to the " -                         "nearest multiple of 4096." -        }, -        { .key  = {"nfs3.*.volume-access"}, -          .type = GF_OPTION_TYPE_STR, -          .value = {"read-only", "read-write"}, -          .default_value = "read-write", -          .description = "Type of access desired for this subvolume: " -                         " read-only, read-write(default)" -        }, -        { .key  = {"nfs3.*.trusted-write"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "On an UNSTABLE write from client, return STABLE flag" -                         " to force client to not send a COMMIT request. In " -                         "some environments, combined with a replicated " -                         "GlusterFS setup, this option can improve write " -                         "performance. This flag allows user to trust Gluster" -                         " replication logic to sync data to the disks and " -                         "recover when required. COMMIT requests if received " -                         "will be handled in a default manner by fsyncing." -                         " STABLE writes are still handled in a sync manner. " -                         "Off by default." - -        }, -        { .key  = {"nfs3.*.trusted-sync"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "All writes and COMMIT requests are treated as async." -                         " This implies that no write requests are guaranteed" -                         " to be on server disks when the write reply is " -                         "received at the NFS client. Trusted sync includes " -                         " trusted-write behaviour. Off by default." - -        }, -        { .key  = {"nfs3.*.export-dir"}, -          .type = GF_OPTION_TYPE_PATH, -          .default_value = "", -          .description = "By default, all subvolumes of nfs are exported as " -                         "individual exports. There are cases where a " -                         "subdirectory or subdirectories in the volume need to " -                         "be exported separately. This option can also be used " -                         "in conjunction with nfs3.export-volumes option to " -                         "restrict exports only to the subdirectories specified" -                         " through this option. Must be an absolute path. Along" -                         " with path allowed list of IPs/hostname can be " -                         "associated with each subdirectory. If provided " -                         "connection will allowed only from these IPs. By " -                         "default connections from all IPs are allowed. " -                         "Format: <dir>[(hostspec[|hostspec|...])][,...]. Where" -                         " hostspec can be an IP address, hostname or an IP " -                         "range in CIDR notation. " -                         "e.g. /foo(192.168.1.0/24|host1|10.1.1.8),/host2." -                         " NOTE: Care must be taken while configuring this " -                         "option as invalid entries and/or unreachable DNS " -                         "servers can introduce unwanted delay in all the mount" -                         " calls." -        }, -        { .key  = {"nfs3.export-dirs"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "By default, all subvolumes of nfs are exported as " -                         "individual exports. There are cases where a " -                         "subdirectory or subdirectories in the volume need to " -                         "be exported separately. Enabling this option allows " -                         "any directory on a volumes to be exported separately." -                         "Directory exports are enabled by default." -        }, -        { .key  = {"nfs3.export-volumes"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "Enable or disable exporting whole volumes, instead " -                         "if used in conjunction with nfs3.export-dir, can " -                         "allow setting up only subdirectories as exports. On " -                         "by default." -        }, -        { .key  = {"rpc-auth.auth-unix"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "Disable or enable the AUTH_UNIX authentication type." -                         "Must always be enabled for better interoperability. " -                         "However, can be disabled if needed. Enabled by " -                         "default" -        }, -        { .key  = {"rpc-auth.auth-null"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "Disable or enable the AUTH_NULL authentication type." -                         "Must always be enabled. This option is here only to" -                         " avoid unrecognized option warnings" -        }, -        { .key  = {"rpc-auth.auth-unix.*"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "Disable or enable the AUTH_UNIX authentication type " -                         "for a particular exported volume overriding defaults" -                         " and general setting for AUTH_UNIX scheme. Must " -                         "always be enabled for better interoperability. " -                         "However, can be disabled if needed. Enabled by " -                         "default." -        }, -        { .key  = {"rpc-auth.auth-unix.*.allow"}, -          .type = GF_OPTION_TYPE_STR, -          .default_value = "on", -          .description = "Disable or enable the AUTH_UNIX authentication type " -                         "for a particular exported volume overriding defaults" -                         " and general setting for AUTH_UNIX scheme. Must " -                         "always be enabled for better interoperability. " -                         "However, can be disabled if needed. Enabled by " -                         "default." -        }, -        { .key  = {"rpc-auth.auth-null.*"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "Disable or enable the AUTH_NULL authentication type " -                         "for a particular exported volume overriding defaults" -                         " and general setting for AUTH_NULL. Must always be " -                         "enabled. This option is here only to avoid " -                         "unrecognized option warnings." -        }, -        { .key  = {"rpc-auth.addr.allow"}, -          .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, -          .default_value = "all", -          .description = "Allow a comma separated list of addresses and/or" -                         " hostnames to connect to the server. By default, all" -                         " connections are allowed. This allows users to " -                         "define a general rule for all exported volumes." -        }, -        { .key  = {"rpc-auth.addr.reject"}, -          .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, -          .default_value = "none", -          .description = "Reject a comma separated list of addresses and/or" -                         " hostnames from connecting to the server. By default," -                         " all connections are allowed. This allows users to " -                         "define a general rule for all exported volumes." -        }, -        { .key  = {"rpc-auth.addr.*.allow"}, -          .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, -          .default_value = "all", -          .description = "Allow a comma separated list of addresses and/or" -                         " hostnames to connect to the server. By default, all" -                         " connections are allowed. This allows users to " -                         "define a rule for a specific exported volume." -        }, -        { .key  = {"rpc-auth.addr.*.reject"}, -          .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, -          .default_value = "none", -          .description = "Reject a comma separated list of addresses and/or" -                         " hostnames from connecting to the server. By default," -                         " all connections are allowed. This allows users to " -                         "define a rule for a specific exported volume." -        }, -        { .key  = {"rpc-auth.ports.insecure"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "Allow client connections from unprivileged ports. By " -                         "default only privileged ports are allowed. This is a" -                         "global setting in case insecure ports are to be " -                         "enabled for all exports using a single option." -        }, -        { .key  = {"rpc-auth.ports.*.insecure"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "Allow client connections from unprivileged ports. By " -                         "default only privileged ports are allowed. Use this" -                         " option to enable or disable insecure ports for " -                         "a specific subvolume and to override the global " -                         "setting set by the previous option." -        }, -        { .key  = {"rpc-auth.addr.namelookup"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "Users have the option of turning on name lookup for" -                  " incoming client connections using this option. Use this " -                  "option to turn on name lookups during address-based " -                  "authentication. Turning this on will enable you to" -                  " use hostnames in nfs.rpc-auth-* filters. In some " -                  "setups, the name server can take too long to reply to DNS " -                  "queries resulting in timeouts of mount requests. By " -                  "default, name lookup is off" -        }, -        { .key  = {"nfs.dynamic-volumes"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "Internal option set to tell gnfs to use a different" -                         " scheme for encoding file handles when DVM is being" -                         " used." -        }, -        { .key  = {"nfs3.*.volume-id"}, -          .type = GF_OPTION_TYPE_STR, -          .default_value = "", -          .description = "When nfs.dynamic-volumes is set, gnfs expects every " -                         "subvolume to have this option set for it, so that " -                         "gnfs can use this option to identify the volume. " -                         "If all subvolumes do not have this option set, an " -                         "error is reported." -        }, -        { .key  = {"nfs.enable-ino32"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "no", -          .description = "For nfs clients or apps that do not support 64-bit " -                         "inode numbers, use this option to make NFS return " -                         "32-bit inode numbers instead. Disabled by default, so" -                         " NFS returns 64-bit inode numbers." -        }, -        { .key  = {"rpc.register-with-portmap"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "For systems that need to run multiple nfs servers, " -                         "only one registration is possible with " -                         "portmap service. Use this option to turn off portmap " -                         "registration for Gluster NFS. On by default" -        }, -        { .key  = {"rpc.outstanding-rpc-limit"}, -          .type = GF_OPTION_TYPE_INT, -          .min  = RPCSVC_MIN_OUTSTANDING_RPC_LIMIT, -          .max  = RPCSVC_MAX_OUTSTANDING_RPC_LIMIT, -          .default_value = TOSTRING(RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT), -          .description = "Parameter to throttle the number of incoming RPC " -                         "requests from a client. 0 means no limit (can " -                         "potentially run out of memory)" -        }, -        { .key  = {"nfs.port"}, -          .type = GF_OPTION_TYPE_INT, -          .min  = 1, -          .max  = 0xffff, -          .default_value = TOSTRING(GF_NFS3_PORT), -          .description = "Use this option on systems that need Gluster NFS to " -                         "be associated with a non-default port number." -        }, -        { .key  = {"nfs.mem-factor"}, -          .type = GF_OPTION_TYPE_INT, -          .min  = 1, -          .max  = 1024, -          .default_value = TOSTRING(GF_NFS_DEFAULT_MEMFACTOR), -          .description = "Use this option to make NFS be faster on systems by " -                         "using more memory. This option specifies a multiple " -                         "that determines the total amount of memory used. " -                         "Default value is 15. Increase to use more memory in " -                         "order to improve performance for certain use cases." -                         "Please consult gluster-users list before using this " -                         "option." -        }, -        { .key  = {"nfs.*.disable"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "false", -          .description = "This option is used to start or stop the NFS server " -                         "for individual volumes." -        }, -        { .key  = {"nfs.nlm"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "This option, if set to 'off', disables NLM server " -                         "by not registering the service with the portmapper." -                         " Set it to 'on' to re-enable it. Default value: 'on'" -        }, - -        { .key = {"nfs.mount-udp"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "set the option to 'on' to enable mountd on UDP. " -                         "Required for some Solaris and AIX NFS clients. " -                         "The need for enabling this option often depends " -                         "on the usage of NLM." -        }, -        { .key = {"nfs.mount-rmtab"}, -          .type = GF_OPTION_TYPE_PATH, -          .default_value = NFS_DATADIR "/rmtab", -          .description = "Set the location of the cache file that is used to " -                         "list all the NFS-clients that have connected " -                         "through the MOUNT protocol. If this is on shared " -                         "storage, all GlusterFS servers will update and " -                         "output (with 'showmount') the same list. Set to " -                         "\"/-\" to disable." -        }, -        { .key = {OPT_SERVER_RPC_STATD}, -          .type = GF_OPTION_TYPE_PATH, -          .default_value = GF_RPC_STATD_PROG, -          .description = "The executable of RPC statd utility. " -                         "Defaults to " GF_RPC_STATD_PROG -        }, -        { .key = {OPT_SERVER_RPC_STATD_PIDFILE}, -          .type = GF_OPTION_TYPE_PATH, -          .default_value = GF_RPC_STATD_PIDFILE, -          .description = "The pid file of RPC statd utility. " -                         "Defaults to " GF_RPC_STATD_PIDFILE -        }, -        { .key = {OPT_SERVER_AUX_GIDS}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "off", -          .description = "Let the server look up which groups a user belongs " -                         "to, overwriting the list passed from the client. " -                         "This enables support for group lists longer than " -                         "can be passed through the NFS protocol, but is not " -                         "secure unless users and groups are well synchronized " -                         "between clients and servers." -        }, -        { .key = {OPT_SERVER_GID_CACHE_TIMEOUT}, -          .type = GF_OPTION_TYPE_INT, -          .min = 0, -          .max = 3600, -          .default_value = "300", -          .description = "Number of seconds to cache auxiliary-GID data, when " -                         OPT_SERVER_AUX_GIDS " is set." -        }, -        { .key = {"nfs.acl"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "This option is used to control ACL support for NFS." -        }, -        { .key  = {"nfs.drc"}, -          .type = GF_OPTION_TYPE_STR, -          .default_value = "off", -          .description = "Enable Duplicate Request Cache in gNFS server to " -                         "improve correctness of non-idempotent operations like " -                         "write, delete, link, et al" -        }, -        { .key  = {"nfs.drc-size"}, -          .type = GF_OPTION_TYPE_INT, -          .default_value = "0x20000", -          .description = "Sets the number of non-idempotent " -                         "requests to cache in drc" -        }, -        { .key = {"nfs.exports-auth-enable"}, -          .type = GF_OPTION_TYPE_BOOL, -          .description = "Set the option to 'on' to enable exports/netgroup " -                         "authentication in the NFS server and mount daemon." -        }, - -        { .key = {"nfs.auth-refresh-interval-sec"}, -          .type = GF_OPTION_TYPE_INT, -          .description = "Frequency in seconds that the daemon should check for" -                         " changes in the exports/netgroups file." -        }, - -       { .key = {"nfs.auth-cache-ttl-sec"}, -          .type = GF_OPTION_TYPE_INT, -          .description = "Sets the TTL of an entry in the auth cache. Value is " -                         "in seconds." -        }, -        { .key  = {"nfs.rdirplus"}, -          .type = GF_OPTION_TYPE_BOOL, -          .default_value = "on", -          .description = "When this option is set to off NFS falls back to " -                         "standard readdir instead of readdirp" -        }, -        { .key = {"nfs.event-threads"}, -          .type = GF_OPTION_TYPE_SIZET, -          .min = 1, -          .max = 32, -          .default_value = "1", -          .description = "Specifies the number of event threads to execute in" -                         "in parallel. Larger values would help process" -                         " responses faster, depending on available processing" -                         " power. Range 1-32 threads.", -          .op_version = {GD_OP_VERSION_4_0_0}, -          .flags = OPT_FLAG_SETTABLE, -        }, -        { .key  = {NULL} }, +    {.key = {"nfs3.read-size"}, +     .type = GF_OPTION_TYPE_SIZET, +     .min = GF_NFS3_RTMIN, +     .max = GF_NFS3_RTMAX, +     .default_value = TOSTRING(GF_NFS3_RTPREF), +     .description = "Size in which the client should issue read requests " +                    "to the Gluster NFSv3 server. Must be a multiple of " +                    "4KB (4096). Min and Max supported values are 4KB " +                    "(4096) and 1MB (1048576) respectively. If the " +                    "specified value is within the supported range but " +                    "not a multiple of 4096, it is rounded up to the " +                    "nearest multiple of 4096."}, +    {.key = {"nfs3.write-size"}, +     .type = GF_OPTION_TYPE_SIZET, +     .min = GF_NFS3_WTMIN, +     .max = GF_NFS3_WTMAX, +     .default_value = TOSTRING(GF_NFS3_WTPREF), +     .description = "Size in which the client should issue write requests " +                    "to the Gluster NFSv3 server. Must be a multiple of " +                    "1KB (1024). Min and Max supported values are " +                    "4KB (4096) and 1MB(1048576) respectively. If the " +                    "specified value is within the supported range but " +                    "not a multiple of 4096, it is rounded up to the " +                    "nearest multiple of 4096."}, +    {.key = {"nfs3.readdir-size"}, +     .type = GF_OPTION_TYPE_SIZET, +     .min = GF_NFS3_DTMIN, +     .max = GF_NFS3_DTMAX, +     .default_value = TOSTRING(GF_NFS3_DTPREF), +     .description = "Size in which the client should issue directory " +                    "reading requests to the Gluster NFSv3 server. Must " +                    "be a multiple of 1KB (1024). Min and Max supported " +                    "values are 4KB (4096) and 1MB (1048576) respectively." +                    "If the specified value is within the supported range " +                    "but not a multiple of 4096, it is rounded up to the " +                    "nearest multiple of 4096."}, +    {.key = {"nfs3.*.volume-access"}, +     .type = GF_OPTION_TYPE_STR, +     .value = {"read-only", "read-write"}, +     .default_value = "read-write", +     .description = "Type of access desired for this subvolume: " +                    " read-only, read-write(default)"}, +    {.key = {"nfs3.*.trusted-write"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "On an UNSTABLE write from client, return STABLE flag" +                    " to force client to not send a COMMIT request. In " +                    "some environments, combined with a replicated " +                    "GlusterFS setup, this option can improve write " +                    "performance. This flag allows user to trust Gluster" +                    " replication logic to sync data to the disks and " +                    "recover when required. COMMIT requests if received " +                    "will be handled in a default manner by fsyncing." +                    " STABLE writes are still handled in a sync manner. " +                    "Off by default." + +    }, +    {.key = {"nfs3.*.trusted-sync"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "All writes and COMMIT requests are treated as async." +                    " This implies that no write requests are guaranteed" +                    " to be on server disks when the write reply is " +                    "received at the NFS client. Trusted sync includes " +                    " trusted-write behaviour. Off by default." + +    }, +    {.key = {"nfs3.*.export-dir"}, +     .type = GF_OPTION_TYPE_PATH, +     .default_value = "", +     .description = "By default, all subvolumes of nfs are exported as " +                    "individual exports. There are cases where a " +                    "subdirectory or subdirectories in the volume need to " +                    "be exported separately. This option can also be used " +                    "in conjunction with nfs3.export-volumes option to " +                    "restrict exports only to the subdirectories specified" +                    " through this option. Must be an absolute path. Along" +                    " with path allowed list of IPs/hostname can be " +                    "associated with each subdirectory. If provided " +                    "connection will allowed only from these IPs. By " +                    "default connections from all IPs are allowed. " +                    "Format: <dir>[(hostspec[|hostspec|...])][,...]. Where" +                    " hostspec can be an IP address, hostname or an IP " +                    "range in CIDR notation. " +                    "e.g. /foo(192.168.1.0/24|host1|10.1.1.8),/host2." +                    " NOTE: Care must be taken while configuring this " +                    "option as invalid entries and/or unreachable DNS " +                    "servers can introduce unwanted delay in all the mount" +                    " calls."}, +    {.key = {"nfs3.export-dirs"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "By default, all subvolumes of nfs are exported as " +                    "individual exports. There are cases where a " +                    "subdirectory or subdirectories in the volume need to " +                    "be exported separately. Enabling this option allows " +                    "any directory on a volumes to be exported separately." +                    "Directory exports are enabled by default."}, +    {.key = {"nfs3.export-volumes"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "Enable or disable exporting whole volumes, instead " +                    "if used in conjunction with nfs3.export-dir, can " +                    "allow setting up only subdirectories as exports. On " +                    "by default."}, +    {.key = {"rpc-auth.auth-unix"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "Disable or enable the AUTH_UNIX authentication type." +                    "Must always be enabled for better interoperability. " +                    "However, can be disabled if needed. Enabled by " +                    "default"}, +    {.key = {"rpc-auth.auth-null"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "Disable or enable the AUTH_NULL authentication type." +                    "Must always be enabled. This option is here only to" +                    " avoid unrecognized option warnings"}, +    {.key = {"rpc-auth.auth-unix.*"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "Disable or enable the AUTH_UNIX authentication type " +                    "for a particular exported volume overriding defaults" +                    " and general setting for AUTH_UNIX scheme. Must " +                    "always be enabled for better interoperability. " +                    "However, can be disabled if needed. Enabled by " +                    "default."}, +    {.key = {"rpc-auth.auth-unix.*.allow"}, +     .type = GF_OPTION_TYPE_STR, +     .default_value = "on", +     .description = "Disable or enable the AUTH_UNIX authentication type " +                    "for a particular exported volume overriding defaults" +                    " and general setting for AUTH_UNIX scheme. Must " +                    "always be enabled for better interoperability. " +                    "However, can be disabled if needed. Enabled by " +                    "default."}, +    {.key = {"rpc-auth.auth-null.*"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "Disable or enable the AUTH_NULL authentication type " +                    "for a particular exported volume overriding defaults" +                    " and general setting for AUTH_NULL. Must always be " +                    "enabled. This option is here only to avoid " +                    "unrecognized option warnings."}, +    {.key = {"rpc-auth.addr.allow"}, +     .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, +     .default_value = "all", +     .description = "Allow a comma separated list of addresses and/or" +                    " hostnames to connect to the server. By default, all" +                    " connections are allowed. This allows users to " +                    "define a general rule for all exported volumes."}, +    {.key = {"rpc-auth.addr.reject"}, +     .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, +     .default_value = "none", +     .description = "Reject a comma separated list of addresses and/or" +                    " hostnames from connecting to the server. By default," +                    " all connections are allowed. This allows users to " +                    "define a general rule for all exported volumes."}, +    {.key = {"rpc-auth.addr.*.allow"}, +     .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, +     .default_value = "all", +     .description = "Allow a comma separated list of addresses and/or" +                    " hostnames to connect to the server. By default, all" +                    " connections are allowed. This allows users to " +                    "define a rule for a specific exported volume."}, +    {.key = {"rpc-auth.addr.*.reject"}, +     .type = GF_OPTION_TYPE_CLIENT_AUTH_ADDR, +     .default_value = "none", +     .description = "Reject a comma separated list of addresses and/or" +                    " hostnames from connecting to the server. By default," +                    " all connections are allowed. This allows users to " +                    "define a rule for a specific exported volume."}, +    {.key = {"rpc-auth.ports.insecure"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "Allow client connections from unprivileged ports. By " +                    "default only privileged ports are allowed. This is a" +                    "global setting in case insecure ports are to be " +                    "enabled for all exports using a single option."}, +    {.key = {"rpc-auth.ports.*.insecure"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "Allow client connections from unprivileged ports. By " +                    "default only privileged ports are allowed. Use this" +                    " option to enable or disable insecure ports for " +                    "a specific subvolume and to override the global " +                    "setting set by the previous option."}, +    {.key = {"rpc-auth.addr.namelookup"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "Users have the option of turning on name lookup for" +                    " incoming client connections using this option. Use this " +                    "option to turn on name lookups during address-based " +                    "authentication. Turning this on will enable you to" +                    " use hostnames in nfs.rpc-auth-* filters. In some " +                    "setups, the name server can take too long to reply to DNS " +                    "queries resulting in timeouts of mount requests. By " +                    "default, name lookup is off"}, +    {.key = {"nfs.dynamic-volumes"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "Internal option set to tell gnfs to use a different" +                    " scheme for encoding file handles when DVM is being" +                    " used."}, +    {.key = {"nfs3.*.volume-id"}, +     .type = GF_OPTION_TYPE_STR, +     .default_value = "", +     .description = "When nfs.dynamic-volumes is set, gnfs expects every " +                    "subvolume to have this option set for it, so that " +                    "gnfs can use this option to identify the volume. " +                    "If all subvolumes do not have this option set, an " +                    "error is reported."}, +    {.key = {"nfs.enable-ino32"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "no", +     .description = "For nfs clients or apps that do not support 64-bit " +                    "inode numbers, use this option to make NFS return " +                    "32-bit inode numbers instead. Disabled by default, so" +                    " NFS returns 64-bit inode numbers."}, +    {.key = {"rpc.register-with-portmap"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "For systems that need to run multiple nfs servers, " +                    "only one registration is possible with " +                    "portmap service. Use this option to turn off portmap " +                    "registration for Gluster NFS. On by default"}, +    {.key = {"rpc.outstanding-rpc-limit"}, +     .type = GF_OPTION_TYPE_INT, +     .min = RPCSVC_MIN_OUTSTANDING_RPC_LIMIT, +     .max = RPCSVC_MAX_OUTSTANDING_RPC_LIMIT, +     .default_value = TOSTRING(RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT), +     .description = "Parameter to throttle the number of incoming RPC " +                    "requests from a client. 0 means no limit (can " +                    "potentially run out of memory)"}, +    {.key = {"nfs.port"}, +     .type = GF_OPTION_TYPE_INT, +     .min = 1, +     .max = 0xffff, +     .default_value = TOSTRING(GF_NFS3_PORT), +     .description = "Use this option on systems that need Gluster NFS to " +                    "be associated with a non-default port number."}, +    {.key = {"nfs.mem-factor"}, +     .type = GF_OPTION_TYPE_INT, +     .min = 1, +     .max = 1024, +     .default_value = TOSTRING(GF_NFS_DEFAULT_MEMFACTOR), +     .description = "Use this option to make NFS be faster on systems by " +                    "using more memory. This option specifies a multiple " +                    "that determines the total amount of memory used. " +                    "Default value is 15. Increase to use more memory in " +                    "order to improve performance for certain use cases." +                    "Please consult gluster-users list before using this " +                    "option."}, +    {.key = {"nfs.*.disable"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "false", +     .description = "This option is used to start or stop the NFS server " +                    "for individual volumes."}, +    {.key = {"nfs.nlm"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "This option, if set to 'off', disables NLM server " +                    "by not registering the service with the portmapper." +                    " Set it to 'on' to re-enable it. Default value: 'on'"}, + +    {.key = {"nfs.mount-udp"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "set the option to 'on' to enable mountd on UDP. " +                    "Required for some Solaris and AIX NFS clients. " +                    "The need for enabling this option often depends " +                    "on the usage of NLM."}, +    {.key = {"nfs.mount-rmtab"}, +     .type = GF_OPTION_TYPE_PATH, +     .default_value = NFS_DATADIR "/rmtab", +     .description = "Set the location of the cache file that is used to " +                    "list all the NFS-clients that have connected " +                    "through the MOUNT protocol. If this is on shared " +                    "storage, all GlusterFS servers will update and " +                    "output (with 'showmount') the same list. Set to " +                    "\"/-\" to disable."}, +    {.key = {OPT_SERVER_RPC_STATD}, +     .type = GF_OPTION_TYPE_PATH, +     .default_value = GF_RPC_STATD_PROG, +     .description = "The executable of RPC statd utility. " +                    "Defaults to " GF_RPC_STATD_PROG}, +    {.key = {OPT_SERVER_RPC_STATD_PIDFILE}, +     .type = GF_OPTION_TYPE_PATH, +     .default_value = GF_RPC_STATD_PIDFILE, +     .description = "The pid file of RPC statd utility. " +                    "Defaults to " GF_RPC_STATD_PIDFILE}, +    {.key = {OPT_SERVER_AUX_GIDS}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "off", +     .description = "Let the server look up which groups a user belongs " +                    "to, overwriting the list passed from the client. " +                    "This enables support for group lists longer than " +                    "can be passed through the NFS protocol, but is not " +                    "secure unless users and groups are well synchronized " +                    "between clients and servers."}, +    {.key = {OPT_SERVER_GID_CACHE_TIMEOUT}, +     .type = GF_OPTION_TYPE_INT, +     .min = 0, +     .max = 3600, +     .default_value = "300", +     .description = "Number of seconds to cache auxiliary-GID data, " +                    "when " OPT_SERVER_AUX_GIDS " is set."}, +    {.key = {"nfs.acl"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "This option is used to control ACL support for NFS."}, +    {.key = {"nfs.drc"}, +     .type = GF_OPTION_TYPE_STR, +     .default_value = "off", +     .description = "Enable Duplicate Request Cache in gNFS server to " +                    "improve correctness of non-idempotent operations like " +                    "write, delete, link, et al"}, +    {.key = {"nfs.drc-size"}, +     .type = GF_OPTION_TYPE_INT, +     .default_value = "0x20000", +     .description = "Sets the number of non-idempotent " +                    "requests to cache in drc"}, +    {.key = {"nfs.exports-auth-enable"}, +     .type = GF_OPTION_TYPE_BOOL, +     .description = "Set the option to 'on' to enable exports/netgroup " +                    "authentication in the NFS server and mount daemon."}, + +    {.key = {"nfs.auth-refresh-interval-sec"}, +     .type = GF_OPTION_TYPE_INT, +     .description = "Frequency in seconds that the daemon should check for" +                    " changes in the exports/netgroups file."}, + +    {.key = {"nfs.auth-cache-ttl-sec"}, +     .type = GF_OPTION_TYPE_INT, +     .description = "Sets the TTL of an entry in the auth cache. Value is " +                    "in seconds."}, +    {.key = {"nfs.rdirplus"}, +     .type = GF_OPTION_TYPE_BOOL, +     .default_value = "on", +     .description = "When this option is set to off NFS falls back to " +                    "standard readdir instead of readdirp"}, +    { +        .key = {"nfs.event-threads"}, +        .type = GF_OPTION_TYPE_SIZET, +        .min = 1, +        .max = 32, +        .default_value = "1", +        .description = "Specifies the number of event threads to execute in" +                       "in parallel. Larger values would help process" +                       " responses faster, depending on available processing" +                       " power. Range 1-32 threads.", +        .op_version = {GD_OP_VERSION_4_0_0}, +        .flags = OPT_FLAG_SETTABLE, +    }, +    {.key = {NULL}},  };  | 
