]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4: add cl_root_cred for use when machine cred is not available.
authorNeilBrown <neilb@suse.com>
Mon, 3 Dec 2018 00:30:30 +0000 (11:30 +1100)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 19 Dec 2018 18:52:45 +0000 (13:52 -0500)
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>
fs/nfs/client.c
fs/nfs/nfs4state.c
include/linux/nfs_fs_sb.h

index 96d5f8135eb99bd84a05ea95962dd37500da8a57..cce151776709b9fcca0ddc544c2fa53b0bac0c2d 100644 (file)
@@ -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);
index d8decf2ec48fa15131dd2135f0c266678c56eec5..511bcdee98f5f5e74c5d8504c52f64d6686cea49 100644 (file)
@@ -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 *
index 0fc0b9135d461bc81e1aa06b2fc8040583db3dc9..fea51b44fe509de6ecd4daaa8bdfbd99a3fb4209 100644 (file)
@@ -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 */