diff options
Diffstat (limited to 'net/sunrpc/auth.c')
| -rw-r--r-- | net/sunrpc/auth.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 9b81be8d994..2bc0cc2196e 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)  EXPORT_SYMBOL_GPL(rpcauth_get_pseudoflavor);  /** + * rpcauth_get_gssinfo - find GSS tuple matching a GSS pseudoflavor + * @pseudoflavor: GSS pseudoflavor to match + * @info: rpcsec_gss_info structure to fill in + * + * Returns zero and fills in "info" if pseudoflavor matches a + * supported mechanism. + */ +int +rpcauth_get_gssinfo(rpc_authflavor_t pseudoflavor, struct rpcsec_gss_info *info) +{ +	rpc_authflavor_t flavor = pseudoflavor_to_flavor(pseudoflavor); +	const struct rpc_authops *ops; +	int result; + +	ops = auth_flavors[flavor]; +	if (ops == NULL) +		request_module("rpc-auth-%u", flavor); +	spin_lock(&rpc_authflavor_lock); +	ops = auth_flavors[flavor]; +	if (ops == NULL || !try_module_get(ops->owner)) { +		spin_unlock(&rpc_authflavor_lock); +		return -ENOENT; +	} +	spin_unlock(&rpc_authflavor_lock); + +	result = -ENOENT; +	if (ops->flavor2info != NULL) +		result = ops->flavor2info(pseudoflavor, info); + +	module_put(ops->owner); +	return result; +} +EXPORT_SYMBOL_GPL(rpcauth_get_gssinfo); + +/**   * rpcauth_list_flavors - discover registered flavors and pseudoflavors   * @array: array to fill in   * @size: size of "array"  |