SUNRPC: Clean up rpc credential initialisation
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 23 Jun 2007 23:55:31 +0000 (19:55 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 11 Jul 2007 03:40:35 +0000 (23:40 -0400)
Add a helper rpc_cred_init()

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

index e606c28..d5bfc67 100644 (file)
@@ -127,6 +127,7 @@ int                 rpcauth_unregister(const struct rpc_authops *);
 struct rpc_auth *      rpcauth_create(rpc_authflavor_t, struct rpc_clnt *);
 void                   rpcauth_release(struct rpc_auth *);
 struct rpc_cred *      rpcauth_lookup_credcache(struct rpc_auth *, struct auth_cred *, int);
+void                   rpcauth_init_cred(struct rpc_cred *, const struct auth_cred *, struct rpc_auth *, const struct rpc_credops *);
 struct rpc_cred *      rpcauth_lookupcred(struct rpc_auth *, int);
 struct rpc_cred *      rpcauth_bindcred(struct rpc_task *);
 void                   rpcauth_holdcred(struct rpc_task *);
index 2db2fbf..0bd1d06 100644 (file)
@@ -85,11 +85,6 @@ struct gss_cred {
        struct gss_upcall_msg   *gc_upcall;
 };
 
-#define gc_uid                 gc_base.cr_uid
-#define gc_count               gc_base.cr_count
-#define gc_flags               gc_base.cr_flags
-#define gc_expire              gc_base.cr_expire
-
 #endif /* __KERNEL__ */
 #endif /* _LINUX_SUNRPC_AUTH_GSS_H */
 
index d3f0f94..2156327 100644 (file)
@@ -264,13 +264,9 @@ retry:
 
        if (!cred) {
                new = auth->au_ops->crcreate(auth, acred, flags);
-               if (!IS_ERR(new)) {
-#ifdef RPC_DEBUG
-                       new->cr_magic = RPCAUTH_CRED_MAGIC;
-#endif
+               if (!IS_ERR(new))
                        goto retry;
-               } else
-                       cred = new;
+               cred = new;
        } else if ((cred->cr_flags & RPCAUTH_CRED_NEW)
                        && cred->cr_ops->cr_init != NULL
                        && !(flags & RPCAUTH_LOOKUP_NEW)) {
@@ -302,6 +298,22 @@ rpcauth_lookupcred(struct rpc_auth *auth, int flags)
        return ret;
 }
 
+void
+rpcauth_init_cred(struct rpc_cred *cred, const struct auth_cred *acred,
+                 struct rpc_auth *auth, const struct rpc_credops *ops)
+{
+       INIT_HLIST_NODE(&cred->cr_hash);
+       atomic_set(&cred->cr_count, 1);
+       cred->cr_auth = auth;
+       cred->cr_ops = ops;
+       cred->cr_expire = jiffies;
+#ifdef RPC_DEBUG
+       cred->cr_magic = RPCAUTH_CRED_MAGIC;
+#endif
+       cred->cr_uid = acred->uid;
+}
+EXPORT_SYMBOL(rpcauth_init_cred);
+
 struct rpc_cred *
 rpcauth_bindcred(struct rpc_task *task)
 {
index 177a9e4..766de0a 100644 (file)
@@ -727,15 +727,11 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
        if (!(cred = kzalloc(sizeof(*cred), GFP_KERNEL)))
                goto out_err;
 
-       atomic_set(&cred->gc_count, 1);
-       cred->gc_uid = acred->uid;
+       rpcauth_init_cred(&cred->gc_base, acred, auth, &gss_credops);
        /*
         * Note: in order to force a call to call_refresh(), we deliberately
         * 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;
        return &cred->gc_base;
index 6600c7a..2f1bdb5 100644 (file)
@@ -20,9 +20,6 @@ struct unx_cred {
        gid_t                   uc_gids[NFS_NGROUPS];
 };
 #define uc_uid                 uc_base.cr_uid
-#define uc_count               uc_base.cr_count
-#define uc_flags               uc_base.cr_flags
-#define uc_expire              uc_base.cr_expire
 
 #define UNX_CRED_EXPIRE                (60 * HZ)
 
@@ -74,8 +71,8 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
        if (!(cred = kmalloc(sizeof(*cred), GFP_KERNEL)))
                return ERR_PTR(-ENOMEM);
 
-       atomic_set(&cred->uc_count, 1);
-       cred->uc_flags = RPCAUTH_CRED_UPTODATE;
+       rpcauth_init_cred(&cred->uc_base, acred, auth, &unix_credops);
+       cred->uc_base.cr_flags = RPCAUTH_CRED_UPTODATE;
        if (flags & RPCAUTH_LOOKUP_ROOTCREDS) {
                cred->uc_uid = 0;
                cred->uc_gid = 0;
@@ -85,15 +82,12 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
                if (groups > NFS_NGROUPS)
                        groups = NFS_NGROUPS;
 
-               cred->uc_uid = acred->uid;
                cred->uc_gid = acred->gid;
                for (i = 0; i < groups; i++)
                        cred->uc_gids[i] = GROUP_AT(acred->group_info, i);
                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;
 }