Pull hotplug into release branch
[cascardo/linux.git] / net / sunrpc / auth_unix.c
index 29d50ff..5ed91e5 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;
 }
 
@@ -93,11 +90,23 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
 }
 
 static void
-unx_destroy_cred(struct rpc_cred *rcred)
+unx_free_cred(struct unx_cred *unx_cred)
 {
-       struct unx_cred *cred = container_of(rcred, struct unx_cred, uc_base);
+       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);
+}
 
-       kfree(cred);
+static void
+unx_destroy_cred(struct rpc_cred *cred)
+{
+       call_rcu(&cred->cr_rcu, unx_free_cred_callback);
 }
 
 /*
@@ -195,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,
@@ -215,7 +229,6 @@ const struct rpc_authops authunix_ops = {
 
 static
 struct rpc_cred_cache  unix_cred_cache = {
-       .expire         = UNX_CRED_EXPIRE,
 };
 
 static