Commit a534ecb0 authored by NeilBrown's avatar NeilBrown Committed by Anna Schumaker

NFSv4: add cl_root_cred for use when machine cred is not available.

NFSv4 state management tries a root credential when no machine
credential is available, as can happen with kerberos.
It does this by replacing the cl_machine_cred with a root credential.
This means that any user of the machine credential needs to take
a lock while getting a reference to the machine credential, which is
a little cumbersome.

So introduce an explicit cl_root_cred, and never free either
credential until client shutdown.  This means that no locking
is needed to reference these credentials.  Future patches
will make use of this.

This is only a temporary addition.  both cl_machine_cred and
cl_root_cred will disappear later in the series.
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 1a80810f
...@@ -248,6 +248,8 @@ void nfs_free_client(struct nfs_client *clp) ...@@ -248,6 +248,8 @@ void nfs_free_client(struct nfs_client *clp)
if (clp->cl_machine_cred != NULL) if (clp->cl_machine_cred != NULL)
put_rpccred(clp->cl_machine_cred); put_rpccred(clp->cl_machine_cred);
if (clp->cl_root_cred != NULL)
put_rpccred(clp->cl_root_cred);
put_net(clp->cl_net); put_net(clp->cl_net);
put_nfs_version(clp->cl_nfs_mod); put_nfs_version(clp->cl_nfs_mod);
......
...@@ -166,24 +166,28 @@ int nfs40_discover_server_trunking(struct nfs_client *clp, ...@@ -166,24 +166,28 @@ int nfs40_discover_server_trunking(struct nfs_client *clp,
struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp) struct rpc_cred *nfs4_get_machine_cred_locked(struct nfs_client *clp)
{ {
struct rpc_cred *cred = NULL; struct rpc_cred *cred = clp->cl_root_cred;
if (clp->cl_machine_cred != NULL) if (!cred)
cred = get_rpccred(clp->cl_machine_cred); cred = clp->cl_machine_cred;
if (cred)
return get_rpccred(cred);
return cred; return cred;
} }
static void nfs4_root_machine_cred(struct nfs_client *clp) static void nfs4_root_machine_cred(struct nfs_client *clp)
{ {
struct rpc_cred *cred, *new; struct rpc_cred *new;
new = rpc_lookup_machine_cred(NULL); new = rpc_lookup_machine_cred(NULL);
spin_lock(&clp->cl_lock); spin_lock(&clp->cl_lock);
cred = clp->cl_machine_cred; if (clp->cl_root_cred == NULL) {
clp->cl_machine_cred = new; clp->cl_root_cred = new;
new = NULL;
}
spin_unlock(&clp->cl_lock); spin_unlock(&clp->cl_lock);
if (cred != NULL) if (new != NULL)
put_rpccred(cred); put_rpccred(new);
} }
static struct rpc_cred * static struct rpc_cred *
......
...@@ -59,6 +59,7 @@ struct nfs_client { ...@@ -59,6 +59,7 @@ struct nfs_client {
u32 cl_minorversion;/* NFSv4 minorversion */ u32 cl_minorversion;/* NFSv4 minorversion */
struct rpc_cred *cl_machine_cred; struct rpc_cred *cl_machine_cred;
struct rpc_cred *cl_root_cred; /* Use when machine_cred is ineffective */
#if IS_ENABLED(CONFIG_NFS_V4) #if IS_ENABLED(CONFIG_NFS_V4)
struct list_head cl_ds_clients; /* auth flavor data servers */ struct list_head cl_ds_clients; /* auth flavor data servers */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment