NFS: Ensure the AUTH_UNIX credcache is allocated dynamically
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 31 Jul 2010 18:29:07 +0000 (14:29 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 4 Aug 2010 12:52:57 +0000 (08:52 -0400)
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/auth.h
net/sunrpc/auth.c
net/sunrpc/auth_generic.c
net/sunrpc/auth_unix.c
net/sunrpc/sunrpc_syms.c

index 87d7ec0bf779f549b82011166c59b8282d415574..784e78c73ec519817f92b4d7b68298e3d3ad954b 100644 (file)
@@ -125,11 +125,12 @@ struct rpc_credops {
 extern const struct rpc_authops        authunix_ops;
 extern const struct rpc_authops        authnull_ops;
 
-void __init            rpc_init_authunix(void);
-void __init            rpc_init_generic_auth(void);
-void __init            rpcauth_init_module(void);
+int __init             rpc_init_authunix(void);
+int __init             rpc_init_generic_auth(void);
+int __init             rpcauth_init_module(void);
 void __exit            rpcauth_remove_module(void);
 void __exit            rpc_destroy_generic_auth(void);
+void                   rpc_destroy_authunix(void);
 
 struct rpc_cred *      rpc_lookup_cred(void);
 struct rpc_cred *      rpc_lookup_machine_cred(void);
index 73affb8624faa06ee95c6ce5bf5e7ea364908d02..db135543d21eaf845ad1ae63f49763654d56b040 100644 (file)
@@ -587,14 +587,27 @@ static struct shrinker rpc_cred_shrinker = {
        .seeks = DEFAULT_SEEKS,
 };
 
-void __init rpcauth_init_module(void)
+int __init rpcauth_init_module(void)
 {
-       rpc_init_authunix();
-       rpc_init_generic_auth();
+       int err;
+
+       err = rpc_init_authunix();
+       if (err < 0)
+               goto out1;
+       err = rpc_init_generic_auth();
+       if (err < 0)
+               goto out2;
        register_shrinker(&rpc_cred_shrinker);
+       return 0;
+out2:
+       rpc_destroy_authunix();
+out1:
+       return err;
 }
 
 void __exit rpcauth_remove_module(void)
 {
+       rpc_destroy_authunix();
+       rpc_destroy_generic_auth();
        unregister_shrinker(&rpc_cred_shrinker);
 }
index 8f623b0f03dd3880bb57a96fce0b7951b572294c..8bae33b36cc6f5757296327de3f11dfa11e628c6 100644 (file)
@@ -27,7 +27,6 @@ struct generic_cred {
 };
 
 static struct rpc_auth generic_auth;
-static struct rpc_cred_cache generic_cred_cache;
 static const struct rpc_credops generic_credops;
 
 /*
@@ -159,20 +158,16 @@ out_nomatch:
        return 0;
 }
 
-void __init rpc_init_generic_auth(void)
+int __init rpc_init_generic_auth(void)
 {
-       spin_lock_init(&generic_cred_cache.lock);
+       return rpcauth_init_credcache(&generic_auth);
 }
 
 void __exit rpc_destroy_generic_auth(void)
 {
-       rpcauth_clear_credcache(&generic_cred_cache);
+       rpcauth_destroy_credcache(&generic_auth);
 }
 
-static struct rpc_cred_cache generic_cred_cache = {
-       {{ NULL, },},
-};
-
 static const struct rpc_authops generic_auth_ops = {
        .owner = THIS_MODULE,
        .au_name = "Generic",
@@ -183,7 +178,6 @@ static const struct rpc_authops generic_auth_ops = {
 static struct rpc_auth generic_auth = {
        .au_ops = &generic_auth_ops,
        .au_count = ATOMIC_INIT(0),
-       .au_credcache = &generic_cred_cache,
 };
 
 static const struct rpc_credops generic_credops = {
index aac2f8b4ee214290796bf76c97aae6051b4fed47..d5e37dbf207bd101307ad16600324da42a72b4b9 100644 (file)
@@ -29,7 +29,6 @@ struct unx_cred {
 #endif
 
 static struct rpc_auth         unix_auth;
-static struct rpc_cred_cache   unix_cred_cache;
 static const struct rpc_credops        unix_credops;
 
 static struct rpc_auth *
@@ -203,9 +202,14 @@ unx_validate(struct rpc_task *task, __be32 *p)
        return p;
 }
 
-void __init rpc_init_authunix(void)
+int __init rpc_init_authunix(void)
 {
-       spin_lock_init(&unix_cred_cache.lock);
+       return rpcauth_init_credcache(&unix_auth);
+}
+
+void rpc_destroy_authunix(void)
+{
+       rpcauth_destroy_credcache(&unix_auth);
 }
 
 const struct rpc_authops authunix_ops = {
@@ -218,10 +222,6 @@ const struct rpc_authops authunix_ops = {
        .crcreate       = unx_create_cred,
 };
 
-static
-struct rpc_cred_cache  unix_cred_cache = {
-};
-
 static
 struct rpc_auth                unix_auth = {
        .au_cslack      = UNX_WRITESLACK,
@@ -229,7 +229,6 @@ struct rpc_auth             unix_auth = {
        .au_ops         = &authunix_ops,
        .au_flavor      = RPC_AUTH_UNIX,
        .au_count       = ATOMIC_INIT(0),
-       .au_credcache   = &unix_cred_cache,
 };
 
 static
index f438347d817b2bb5889ea6d364db5abeceb819e9..34b58f9e704ad6c3656e10c941f04dd4f4025ec1 100644 (file)
@@ -33,10 +33,11 @@ init_sunrpc(void)
        if (err)
                goto out;
        err = rpc_init_mempool();
-       if (err) {
-               unregister_rpc_pipefs();
-               goto out;
-       }
+       if (err)
+               goto out2;
+       err = rpcauth_init_module();
+       if (err)
+               goto out3;
 #ifdef RPC_DEBUG
        rpc_register_sysctl();
 #endif
@@ -47,7 +48,11 @@ init_sunrpc(void)
        cache_register(&unix_gid_cache);
        svc_init_xprt_sock();   /* svc sock transport */
        init_socket_xprt();     /* clnt sock transport */
-       rpcauth_init_module();
+       return 0;
+out3:
+       rpc_destroy_mempool();
+out2:
+       unregister_rpc_pipefs();
 out:
        return err;
 }