SUNRPC: Add a backpointer from the struct rpc_cred to the rpc_auth
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 7 Jun 2007 14:14:14 +0000 (10:14 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 11 Jul 2007 03:40:31 +0000 (23:40 -0400)
Cleans up an issue whereby rpcsec_gss uses the rpc_clnt->cl_auth. If we want
to be able to add several rpc_auths to a single rpc_clnt, then this abuse
must go.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/auth.h
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/auth_null.c
net/sunrpc/auth_unix.c

index 534cdc7be58dbbef6350ddef8fd89983bb7f6e41..8ef27afeea73ddbf276c412854350998ebe9f361 100644 (file)
@@ -30,8 +30,11 @@ struct auth_cred {
 /*
  * Client user credentials
  */
+struct rpc_auth;
+struct rpc_credops;
 struct rpc_cred {
        struct hlist_node       cr_hash;        /* hash chain */
+       struct rpc_auth *       cr_auth;
        struct rpc_credops *    cr_ops;
        unsigned long           cr_expire;      /* when to gc */
        atomic_t                cr_count;       /* ref count */
@@ -60,6 +63,7 @@ struct rpc_cred_cache {
        unsigned long           expire;         /* cache expiry interval */
 };
 
+struct rpc_authops;
 struct rpc_auth {
        unsigned int            au_cslack;      /* call cred size estimate */
                                /* guess at number of u32's auth adds before
index 4e4ccc5b6fea905131bab2cc6d1a7dd39fd14b97..e894e2fc360d28a2cb37cd6206a14cd3802e0b02 100644 (file)
@@ -386,7 +386,7 @@ static inline int
 gss_refresh_upcall(struct rpc_task *task)
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
-       struct gss_auth *gss_auth = container_of(task->tk_client->cl_auth,
+       struct gss_auth *gss_auth = container_of(cred->cr_auth,
                        struct gss_auth, rpc_auth);
        struct gss_cred *gss_cred = container_of(cred,
                        struct gss_cred, gc_base);
@@ -741,6 +741,7 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
         * fail to flag the credential as RPCAUTH_CRED_UPTODATE.
         */
        cred->gc_flags = 0;
+       cred->gc_base.cr_auth = auth;
        cred->gc_base.cr_ops = &gss_credops;
        cred->gc_base.cr_flags = RPCAUTH_CRED_NEW;
        cred->gc_service = gss_auth->service;
index 3df9fccab2f8b34c17b7d04208a0c46f3d9d4219..890bd9b3794bfedf47cd779f58dc197439762a0b 100644 (file)
@@ -133,6 +133,7 @@ struct rpc_credops  null_credops = {
 
 static
 struct rpc_cred null_cred = {
+       .cr_auth        = &null_auth,
        .cr_ops         = &null_credops,
        .cr_count       = ATOMIC_INIT(1),
        .cr_flags       = RPCAUTH_CRED_UPTODATE,
index 4e7733aee36e8f42dafa178cceabdfa028a3dbae..82300b83045ec228a0941d25265b5ed6177c6366 100644 (file)
@@ -92,6 +92,7 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
                if (i < NFS_NGROUPS)
                  cred->uc_gids[i] = NOGROUP;
        }
+       cred->uc_base.cr_auth = &unix_auth;
        cred->uc_base.cr_ops = &unix_credops;
 
        return (struct rpc_cred *) cred;