|
@@ -132,6 +132,35 @@ static size_t nfs_parse_server_name(char *string, size_t len,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
|
|
|
+{
|
|
|
+ struct gss_api_mech *mech;
|
|
|
+ struct xdr_netobj oid;
|
|
|
+ int i;
|
|
|
+ rpc_authflavor_t pseudoflavor = RPC_AUTH_UNIX;
|
|
|
+
|
|
|
+ for (i = 0; i < flavors->num_flavors; i++) {
|
|
|
+ struct nfs4_secinfo_flavor *flavor;
|
|
|
+ flavor = &flavors->flavors[i];
|
|
|
+
|
|
|
+ if (flavor->flavor == RPC_AUTH_NULL || flavor->flavor == RPC_AUTH_UNIX) {
|
|
|
+ pseudoflavor = flavor->flavor;
|
|
|
+ break;
|
|
|
+ } else if (flavor->flavor == RPC_AUTH_GSS) {
|
|
|
+ oid.len = flavor->gss.sec_oid4.len;
|
|
|
+ oid.data = flavor->gss.sec_oid4.data;
|
|
|
+ mech = gss_mech_get_by_OID(&oid);
|
|
|
+ if (!mech)
|
|
|
+ continue;
|
|
|
+ pseudoflavor = gss_svc_to_pseudoflavor(mech, flavor->gss.service);
|
|
|
+ gss_mech_put(mech);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return pseudoflavor;
|
|
|
+}
|
|
|
+
|
|
|
static rpc_authflavor_t nfs4_negotiate_security(struct inode *inode, struct qstr *name)
|
|
|
{
|
|
|
struct page *page;
|