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

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
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -248,6 +248,8 @@ void nfs_free_client(struct nfs_client *clp)

	if (clp->cl_machine_cred != NULL)
		put_rpccred(clp->cl_machine_cred);
	if (clp->cl_root_cred != NULL)
		put_rpccred(clp->cl_root_cred);

	put_net(clp->cl_net);
	put_nfs_version(clp->cl_nfs_mod);
+12 −8
Original line number Diff line number Diff line
@@ -166,24 +166,28 @@ out:

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)
		cred = get_rpccred(clp->cl_machine_cred);
	if (!cred)
		cred = clp->cl_machine_cred;
	if (cred)
		return get_rpccred(cred);
	return cred;
}

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);
	spin_lock(&clp->cl_lock);
	cred = clp->cl_machine_cred;
	clp->cl_machine_cred = new;
	if (clp->cl_root_cred == NULL) {
		clp->cl_root_cred = new;
		new = NULL;
	}
	spin_unlock(&clp->cl_lock);
	if (cred != NULL)
		put_rpccred(cred);
	if (new != NULL)
		put_rpccred(new);
}

static struct rpc_cred *
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ struct nfs_client {

	u32			cl_minorversion;/* NFSv4 minorversion */
	struct rpc_cred		*cl_machine_cred;
	struct rpc_cred		*cl_root_cred;	/* Use when machine_cred is ineffective */

#if IS_ENABLED(CONFIG_NFS_V4)
	struct list_head	cl_ds_clients; /* auth flavor data servers */