From 0fbf226cdeb970f4b5829f92c6d27523f3ef4f04 Mon Sep 17 00:00:00 2001 From: Kaushik BV Date: Wed, 3 Nov 2010 05:29:49 +0000 Subject: mgmt/Glusterd: add nfs.enable-ino32 as an option to set from CLI Signed-off-by: Kaushik BV Signed-off-by: Anand V. Avati BUG: 1972 (xcs get doesn't work with gNFS) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1972 --- xlators/mgmt/glusterd/src/glusterd-volgen.c | 106 ++++++++++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd.h | 1 - xlators/nfs/server/src/nfs.c | 30 ++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index e27eb56cc..158a49654 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -135,6 +135,8 @@ static struct volopt_map_entry glusterd_volopt_map[] = { {"performance.quick-read", "performance/quick-read", "!perf", "on"}, /* NODOC */ {"performance.stat-prefetch", "performance/stat-prefetch", "!perf",}, /* NODOC */ + {"nfs.enable-ino32", "nfs.enable-ino32", "nfs.enable-ino32",}, + {NULL, } }; @@ -1231,6 +1233,75 @@ build_client_graph (glusterfs_graph_t *graph, glusterd_volinfo_t *volinfo, &client_graph_builder); } +static int +build_nfs_validation_graph (glusterfs_graph_t *graph, dict_t *dict) +{ + glusterfs_graph_t cgraph = {{0,},}; + glusterd_volinfo_t *voliter = NULL; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + xlator_t *nfsxl = NULL; + char *skey = NULL; + char volume_id[64] = {0,}; + int ret = 0; + data_t *data = NULL; + + this = THIS; + GF_ASSERT (this); + priv = this->private; + GF_ASSERT (priv); + + nfsxl = volgen_graph_add_as (graph, "nfs/server", "nfs-server"); + if (!nfsxl) + return -1; + ret = xlator_set_option (nfsxl, "nfs.dynamic-volumes", "on"); + if (ret) + return -1; + + list_for_each_entry (voliter, &priv->volumes, vol_list) { + ret = gf_asprintf (&skey, "rpc-auth.addr.%s.allow", + voliter->volname); + if (ret == -1) + goto oom; + ret = xlator_set_option (nfsxl, skey, "*"); + GF_FREE (skey); + if (ret) + return -1; + + ret = gf_asprintf (&skey, "nfs3.%s.volume-id", + voliter->volname); + if (ret == -1) + goto oom; + uuid_unparse (voliter->volume_id, volume_id); + ret = xlator_set_option (nfsxl, skey, volume_id); + GF_FREE (skey); + if (ret) + return -1; + + data = dict_get (dict, "nfs.enable-ino32"); + if (data) { + ret = xlator_set_option (nfsxl, + "nfs.enable-ino32", + data->data); + if (ret) + return -1; + } + + memset (&cgraph, 0, sizeof (cgraph)); + ret = build_client_graph (&cgraph, voliter, NULL); + if (ret) + return -1; + ret = volgen_graph_merge_sub (graph, &cgraph); + } + + return ret; + + oom: + gf_log ("", GF_LOG_ERROR, "Out of memory"); + + return -1; + +} /* builds a graph for nfs server role */ static int @@ -1244,6 +1315,7 @@ build_nfs_graph (glusterfs_graph_t *graph) char *skey = NULL; char volume_id[64] = {0,}; int ret = 0; + data_t *data = NULL; this = THIS; GF_ASSERT (this); @@ -1257,6 +1329,7 @@ build_nfs_graph (glusterfs_graph_t *graph) if (ret) return -1; + list_for_each_entry (voliter, &priv->volumes, vol_list) { if (voliter->status != GLUSTERD_STATUS_STARTED) continue; @@ -1280,6 +1353,17 @@ build_nfs_graph (glusterfs_graph_t *graph) if (ret) return -1; + data = dict_get (voliter->dict, "nfs.enable-ino32"); + if (data) { + if (!dict_get (nfsxl->options, "nfs.enable-ino32")) { + ret = xlator_set_option (nfsxl, + "nfs.enable-ino32", + data->data); + if (ret) + return -1; + } + } + memset (&cgraph, 0, sizeof (cgraph)); ret = build_client_graph (&cgraph, voliter, NULL); if (ret) @@ -1486,6 +1570,26 @@ glusterd_delete_volfile (glusterd_volinfo_t *volinfo, return unlink (filename); } +int +validate_nfsopts (glusterd_volinfo_t *volinfo, + dict_t *val_dict, + char **op_errstr) +{ + glusterfs_graph_t graph = {{0,},}; + int ret = -1; + + GF_ASSERT (volinfo); + + ret = build_nfs_validation_graph (&graph, val_dict); + if (!ret) + ret = graph_reconf_validateopt (&graph, op_errstr); + + volgen_graph_free (&graph); + + gf_log ("glusterd", GF_LOG_DEBUG, "Returning %d", ret); + return ret; +} + int validate_clientopts (glusterd_volinfo_t *volinfo, dict_t *val_dict, @@ -1577,6 +1681,8 @@ glusterd_validate_reconfopts (glusterd_volinfo_t *volinfo, dict_t *val_dict, goto out; } + ret = validate_nfsopts (volinfo, val_dict, op_errstr); + out: gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 185d36225..8853db813 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -188,7 +188,6 @@ struct glusterd_volinfo_ { uint32_t cksum; gf_transport_type transport_type; - /* All xlator options */ dict_t *dict; uuid_t volume_id; diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index c81e48322..d546ed3fb 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -560,6 +560,36 @@ free_nfs: return nfs; } +int +validate_options (xlator_t *this, dict_t *options, char **op_errstr) +{ + char *str=NULL; + gf_boolean_t nfs_ino32; + + int ret = 0; + + + + ret = dict_get_str (options, "nfs.enable-ino32", + &str); + if (ret == 0) { + ret = gf_string2boolean (str, + &nfs_ino32); + if (ret == -1) { + gf_log (this->name, GF_LOG_WARNING, + "'nfs.enable-ino32' takes only boolean" + " arguments"); + *op_errstr = gf_strdup ("Error, should be boolean"); + ret = -1; + goto out; + } + } + ret =0; +out: + return ret; + +} + int init (xlator_t *this) { -- cgit