aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2013-03-16 15:55:10 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2013-03-29 15:43:33 -0400
commita77c806fb9d097bb7733b64207cf52fc2c6438bb (patch)
tree198d62d0436f22e7288142eb7341880a1b99ee3e /net
parent83523d083a045a2069e5f3443d2e4f810a6e6d9a (diff)
SUNRPC: Refactor nfsd4_do_encode_secinfo()
Clean up. This matches a similar API for the client side, and keeps ULP fingers out the of the GSS mech switch. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Acked-by: J. Bruce Fields <bfields@redhat.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/auth.c35
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c1
-rw-r--r--net/sunrpc/auth_gss/gss_mech_switch.c35
3 files changed, 69 insertions, 2 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c
index 9b81be8d9946..2bc0cc2196e0 100644
--- a/net/sunrpc/auth.c
+++ b/net/sunrpc/auth.c
@@ -159,6 +159,41 @@ rpcauth_get_pseudoflavor(rpc_authflavor_t flavor, struct rpcsec_gss_info *info)
159EXPORT_SYMBOL_GPL(rpcauth_get_pseudoflavor); 159EXPORT_SYMBOL_GPL(rpcauth_get_pseudoflavor);
160 160
161/** 161/**
162 * rpcauth_get_gssinfo - find GSS tuple matching a GSS pseudoflavor
163 * @pseudoflavor: GSS pseudoflavor to match
164 * @info: rpcsec_gss_info structure to fill in
165 *
166 * Returns zero and fills in "info" if pseudoflavor matches a
167 * supported mechanism.
168 */
169int
170rpcauth_get_gssinfo(rpc_authflavor_t pseudoflavor, struct rpcsec_gss_info *info)
171{
172 rpc_authflavor_t flavor = pseudoflavor_to_flavor(pseudoflavor);
173 const struct rpc_authops *ops;
174 int result;
175
176 ops = auth_flavors[flavor];
177 if (ops == NULL)
178 request_module("rpc-auth-%u", flavor);
179 spin_lock(&rpc_authflavor_lock);
180 ops = auth_flavors[flavor];
181 if (ops == NULL || !try_module_get(ops->owner)) {
182 spin_unlock(&rpc_authflavor_lock);
183 return -ENOENT;
184 }
185 spin_unlock(&rpc_authflavor_lock);
186
187 result = -ENOENT;
188 if (ops->flavor2info != NULL)
189 result = ops->flavor2info(pseudoflavor, info);
190
191 module_put(ops->owner);
192 return result;
193}
194EXPORT_SYMBOL_GPL(rpcauth_get_gssinfo);
195
196/**
162 * rpcauth_list_flavors - discover registered flavors and pseudoflavors 197 * rpcauth_list_flavors - discover registered flavors and pseudoflavors
163 * @array: array to fill in 198 * @array: array to fill in
164 * @size: size of "array" 199 * @size: size of "array"
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index a7420076ef39..51415b07174e 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -1642,6 +1642,7 @@ static const struct rpc_authops authgss_ops = {
1642 .pipes_destroy = gss_pipes_dentries_destroy, 1642 .pipes_destroy = gss_pipes_dentries_destroy,
1643 .list_pseudoflavors = gss_mech_list_pseudoflavors, 1643 .list_pseudoflavors = gss_mech_list_pseudoflavors,
1644 .info2flavor = gss_mech_info2flavor, 1644 .info2flavor = gss_mech_info2flavor,
1645 .flavor2info = gss_mech_flavor2info,
1645}; 1646};
1646 1647
1647static const struct rpc_credops gss_credops = { 1648static const struct rpc_credops gss_credops = {
diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c
index 81fb6f3e2424..deaa7ae81cdf 100644
--- a/net/sunrpc/auth_gss/gss_mech_switch.c
+++ b/net/sunrpc/auth_gss/gss_mech_switch.c
@@ -240,8 +240,6 @@ gss_mech_get_by_pseudoflavor(u32 pseudoflavor)
240 return gm; 240 return gm;
241} 241}
242 242
243EXPORT_SYMBOL_GPL(gss_mech_get_by_pseudoflavor);
244
245/** 243/**
246 * gss_mech_list_pseudoflavors - Discover registered GSS pseudoflavors 244 * gss_mech_list_pseudoflavors - Discover registered GSS pseudoflavors
247 * @array: array to fill in 245 * @array: array to fill in
@@ -315,6 +313,39 @@ rpc_authflavor_t gss_mech_info2flavor(struct rpcsec_gss_info *info)
315 return pseudoflavor; 313 return pseudoflavor;
316} 314}
317 315
316/**
317 * gss_mech_flavor2info - look up a GSS tuple for a given pseudoflavor
318 * @pseudoflavor: GSS pseudoflavor to match
319 * @info: rpcsec_gss_info structure to fill in
320 *
321 * Returns zero and fills in "info" if pseudoflavor matches a
322 * supported mechanism. Otherwise a negative errno is returned.
323 */
324int gss_mech_flavor2info(rpc_authflavor_t pseudoflavor,
325 struct rpcsec_gss_info *info)
326{
327 struct gss_api_mech *gm;
328 int i;
329
330 gm = gss_mech_get_by_pseudoflavor(pseudoflavor);
331 if (gm == NULL)
332 return -ENOENT;
333
334 for (i = 0; i < gm->gm_pf_num; i++) {
335 if (gm->gm_pfs[i].pseudoflavor == pseudoflavor) {
336 memcpy(info->oid.data, gm->gm_oid.data, gm->gm_oid.len);
337 info->oid.len = gm->gm_oid.len;
338 info->qop = gm->gm_pfs[i].qop;
339 info->service = gm->gm_pfs[i].service;
340 gss_mech_put(gm);
341 return 0;
342 }
343 }
344
345 gss_mech_put(gm);
346 return -ENOENT;
347}
348
318u32 349u32
319gss_pseudoflavor_to_service(struct gss_api_mech *gm, u32 pseudoflavor) 350gss_pseudoflavor_to_service(struct gss_api_mech *gm, u32 pseudoflavor)
320{ 351{