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: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Родитель
1a80810fbf
Коммит
a534ecb013
|
@ -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);
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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 */
|
||||
|
|
Загрузка…
Ссылка в новой задаче