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 *);
 
        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 */
 
 
 
        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)) {
        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)
 {
 
        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;
 
        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)
 
        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;
                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;
 }