Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d8d9a4d authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Ensure the AUTH_UNIX credcache is allocated dynamically

parent d05dd4e9
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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);
+16 −3
Original line number Diff line number Diff line
@@ -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);
}
+3 −9
Original line number Diff line number Diff line
@@ -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 = {
+7 −8
Original line number Diff line number Diff line
@@ -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
+10 −5
Original line number Diff line number Diff line
@@ -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;
}