NFS: Ensure the AUTH_UNIX credcache is allocated dynamically

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust 2010-07-31 14:29:07 -04:00
parent d05dd4e98f
commit 5d8d9a4d9f
5 changed files with 40 additions and 28 deletions

View File

@ -125,11 +125,12 @@ struct rpc_credops {
extern const struct rpc_authops authunix_ops; extern const struct rpc_authops authunix_ops;
extern const struct rpc_authops authnull_ops; extern const struct rpc_authops authnull_ops;
void __init rpc_init_authunix(void); int __init rpc_init_authunix(void);
void __init rpc_init_generic_auth(void); int __init rpc_init_generic_auth(void);
void __init rpcauth_init_module(void); int __init rpcauth_init_module(void);
void __exit rpcauth_remove_module(void); void __exit rpcauth_remove_module(void);
void __exit rpc_destroy_generic_auth(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_cred(void);
struct rpc_cred * rpc_lookup_machine_cred(void); struct rpc_cred * rpc_lookup_machine_cred(void);

View File

@ -587,14 +587,27 @@ static struct shrinker rpc_cred_shrinker = {
.seeks = DEFAULT_SEEKS, .seeks = DEFAULT_SEEKS,
}; };
void __init rpcauth_init_module(void) int __init rpcauth_init_module(void)
{ {
rpc_init_authunix(); int err;
rpc_init_generic_auth();
err = rpc_init_authunix();
if (err < 0)
goto out1;
err = rpc_init_generic_auth();
if (err < 0)
goto out2;
register_shrinker(&rpc_cred_shrinker); register_shrinker(&rpc_cred_shrinker);
return 0;
out2:
rpc_destroy_authunix();
out1:
return err;
} }
void __exit rpcauth_remove_module(void) void __exit rpcauth_remove_module(void)
{ {
rpc_destroy_authunix();
rpc_destroy_generic_auth();
unregister_shrinker(&rpc_cred_shrinker); unregister_shrinker(&rpc_cred_shrinker);
} }

View File

@ -27,7 +27,6 @@ struct generic_cred {
}; };
static struct rpc_auth generic_auth; static struct rpc_auth generic_auth;
static struct rpc_cred_cache generic_cred_cache;
static const struct rpc_credops generic_credops; static const struct rpc_credops generic_credops;
/* /*
@ -159,20 +158,16 @@ out_nomatch:
return 0; 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) 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 = { static const struct rpc_authops generic_auth_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.au_name = "Generic", .au_name = "Generic",
@ -183,7 +178,6 @@ static const struct rpc_authops generic_auth_ops = {
static struct rpc_auth generic_auth = { static struct rpc_auth generic_auth = {
.au_ops = &generic_auth_ops, .au_ops = &generic_auth_ops,
.au_count = ATOMIC_INIT(0), .au_count = ATOMIC_INIT(0),
.au_credcache = &generic_cred_cache,
}; };
static const struct rpc_credops generic_credops = { static const struct rpc_credops generic_credops = {

View File

@ -29,7 +29,6 @@ struct unx_cred {
#endif #endif
static struct rpc_auth unix_auth; static struct rpc_auth unix_auth;
static struct rpc_cred_cache unix_cred_cache;
static const struct rpc_credops unix_credops; static const struct rpc_credops unix_credops;
static struct rpc_auth * static struct rpc_auth *
@ -203,9 +202,14 @@ unx_validate(struct rpc_task *task, __be32 *p)
return 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 = { const struct rpc_authops authunix_ops = {
@ -218,10 +222,6 @@ const struct rpc_authops authunix_ops = {
.crcreate = unx_create_cred, .crcreate = unx_create_cred,
}; };
static
struct rpc_cred_cache unix_cred_cache = {
};
static static
struct rpc_auth unix_auth = { struct rpc_auth unix_auth = {
.au_cslack = UNX_WRITESLACK, .au_cslack = UNX_WRITESLACK,
@ -229,7 +229,6 @@ struct rpc_auth unix_auth = {
.au_ops = &authunix_ops, .au_ops = &authunix_ops,
.au_flavor = RPC_AUTH_UNIX, .au_flavor = RPC_AUTH_UNIX,
.au_count = ATOMIC_INIT(0), .au_count = ATOMIC_INIT(0),
.au_credcache = &unix_cred_cache,
}; };
static static

View File

@ -33,10 +33,11 @@ init_sunrpc(void)
if (err) if (err)
goto out; goto out;
err = rpc_init_mempool(); err = rpc_init_mempool();
if (err) { if (err)
unregister_rpc_pipefs(); goto out2;
goto out; err = rpcauth_init_module();
} if (err)
goto out3;
#ifdef RPC_DEBUG #ifdef RPC_DEBUG
rpc_register_sysctl(); rpc_register_sysctl();
#endif #endif
@ -47,7 +48,11 @@ init_sunrpc(void)
cache_register(&unix_gid_cache); cache_register(&unix_gid_cache);
svc_init_xprt_sock(); /* svc sock transport */ svc_init_xprt_sock(); /* svc sock transport */
init_socket_xprt(); /* clnt sock transport */ init_socket_xprt(); /* clnt sock transport */
rpcauth_init_module(); return 0;
out3:
rpc_destroy_mempool();
out2:
unregister_rpc_pipefs();
out: out:
return err; return err;
} }