]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/sunrpc/auth_unix.c
svc: Add svc API that queries for a transport instance
[linux-2.6-omap-h63xx.git] / net / sunrpc / auth_unix.c
index 2f1bdb5c86b3e707bc1730fd1a0844b700389016..5ed91e5bcee4a9ce04e22a167450b6c612362970 100644 (file)
@@ -21,8 +21,6 @@ struct unx_cred {
 };
 #define uc_uid                 uc_base.cr_uid
 
-#define UNX_CRED_EXPIRE                (60 * HZ)
-
 #define UNX_WRITESLACK         (21 + (UNX_MAXNODENAME >> 2))
 
 #ifdef RPC_DEBUG
@@ -38,8 +36,7 @@ unx_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
 {
        dprintk("RPC:       creating UNIX authenticator for client %p\n",
                        clnt);
-       if (atomic_inc_return(&unix_auth.au_count) == 1)
-               unix_cred_cache.nextgc = jiffies + (unix_cred_cache.expire >> 1);
+       atomic_inc(&unix_auth.au_count);
        return &unix_auth;
 }
 
@@ -72,7 +69,7 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
                return ERR_PTR(-ENOMEM);
 
        rpcauth_init_cred(&cred->uc_base, acred, auth, &unix_credops);
-       cred->uc_base.cr_flags = RPCAUTH_CRED_UPTODATE;
+       cred->uc_base.cr_flags = 1UL << RPCAUTH_CRED_UPTODATE;
        if (flags & RPCAUTH_LOOKUP_ROOTCREDS) {
                cred->uc_uid = 0;
                cred->uc_gid = 0;
@@ -89,13 +86,27 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
                  cred->uc_gids[i] = NOGROUP;
        }
 
-       return (struct rpc_cred *) cred;
+       return &cred->uc_base;
+}
+
+static void
+unx_free_cred(struct unx_cred *unx_cred)
+{
+       dprintk("RPC:       unx_free_cred %p\n", unx_cred);
+       kfree(unx_cred);
+}
+
+static void
+unx_free_cred_callback(struct rcu_head *head)
+{
+       struct unx_cred *unx_cred = container_of(head, struct unx_cred, uc_base.cr_rcu);
+       unx_free_cred(unx_cred);
 }
 
 static void
 unx_destroy_cred(struct rpc_cred *cred)
 {
-       kfree(cred);
+       call_rcu(&cred->cr_rcu, unx_free_cred_callback);
 }
 
 /*
@@ -106,7 +117,7 @@ unx_destroy_cred(struct rpc_cred *cred)
 static int
 unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)
 {
-       struct unx_cred *cred = (struct unx_cred *) rcred;
+       struct unx_cred *cred = container_of(rcred, struct unx_cred, uc_base);
        int             i;
 
        if (!(flags & RPCAUTH_LOOKUP_ROOTCREDS)) {
@@ -137,7 +148,7 @@ static __be32 *
 unx_marshal(struct rpc_task *task, __be32 *p)
 {
        struct rpc_clnt *clnt = task->tk_client;
-       struct unx_cred *cred = (struct unx_cred *) task->tk_msg.rpc_cred;
+       struct unx_cred *cred = container_of(task->tk_msg.rpc_cred, struct unx_cred, uc_base);
        __be32          *base, *hold;
        int             i;
 
@@ -170,7 +181,7 @@ unx_marshal(struct rpc_task *task, __be32 *p)
 static int
 unx_refresh(struct rpc_task *task)
 {
-       task->tk_msg.rpc_cred->cr_flags |= RPCAUTH_CRED_UPTODATE;
+       set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_msg.rpc_cred->cr_flags);
        return 0;
 }
 
@@ -193,12 +204,17 @@ unx_validate(struct rpc_task *task, __be32 *p)
                printk("RPC: giant verf size: %u\n", size);
                return NULL;
        }
-       task->tk_auth->au_rslack = (size >> 2) + 2;
+       task->tk_msg.rpc_cred->cr_auth->au_rslack = (size >> 2) + 2;
        p += (size >> 2);
 
        return p;
 }
 
+void __init rpc_init_authunix(void)
+{
+       spin_lock_init(&unix_cred_cache.lock);
+}
+
 const struct rpc_authops authunix_ops = {
        .owner          = THIS_MODULE,
        .au_flavor      = RPC_AUTH_UNIX,
@@ -213,7 +229,6 @@ const struct rpc_authops authunix_ops = {
 
 static
 struct rpc_cred_cache  unix_cred_cache = {
-       .expire         = UNX_CRED_EXPIRE,
 };
 
 static