-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 92878 b: refs/heads/master c: 9a559ef h: refs/heads/master v: v3
- Loading branch information
Trond Myklebust
authored and
Trond Myklebust
committed
Mar 14, 2008
1 parent
bd8383d
commit 4585e18
Showing
5 changed files
with
148 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 4ccda2cdd8d156b6f49440653d5d6997e0facf97 | ||
refs/heads/master: 9a559efd4199c9812d339e23cc1b6055366b224f |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
/* | ||
* Generic RPC credential | ||
* | ||
* Copyright (C) 2008, Trond Myklebust <Trond.Myklebust@netapp.com> | ||
*/ | ||
|
||
#include <linux/err.h> | ||
#include <linux/types.h> | ||
#include <linux/module.h> | ||
#include <linux/sched.h> | ||
#include <linux/sunrpc/auth.h> | ||
#include <linux/sunrpc/clnt.h> | ||
#include <linux/sunrpc/debug.h> | ||
#include <linux/sunrpc/sched.h> | ||
|
||
#ifdef RPC_DEBUG | ||
# define RPCDBG_FACILITY RPCDBG_AUTH | ||
#endif | ||
|
||
struct generic_cred { | ||
struct rpc_cred gc_base; | ||
struct auth_cred acred; | ||
}; | ||
|
||
static struct rpc_auth generic_auth; | ||
static struct rpc_cred_cache generic_cred_cache; | ||
static const struct rpc_credops generic_credops; | ||
|
||
/* | ||
* Public call interface | ||
*/ | ||
struct rpc_cred *rpc_lookup_cred(void) | ||
{ | ||
return rpcauth_lookupcred(&generic_auth, 0); | ||
} | ||
EXPORT_SYMBOL_GPL(rpc_lookup_cred); | ||
|
||
/* | ||
* Lookup generic creds for current process | ||
*/ | ||
static struct rpc_cred * | ||
generic_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) | ||
{ | ||
return rpcauth_lookup_credcache(&generic_auth, acred, flags); | ||
} | ||
|
||
static struct rpc_cred * | ||
generic_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) | ||
{ | ||
struct generic_cred *gcred; | ||
|
||
gcred = kmalloc(sizeof(*gcred), GFP_KERNEL); | ||
if (gcred == NULL) | ||
return ERR_PTR(-ENOMEM); | ||
|
||
rpcauth_init_cred(&gcred->gc_base, acred, &generic_auth, &generic_credops); | ||
gcred->gc_base.cr_flags = 1UL << RPCAUTH_CRED_UPTODATE; | ||
|
||
gcred->acred.uid = acred->uid; | ||
gcred->acred.gid = acred->gid; | ||
gcred->acred.group_info = acred->group_info; | ||
if (gcred->acred.group_info != NULL) | ||
get_group_info(gcred->acred.group_info); | ||
|
||
dprintk("RPC: allocated generic cred %p for uid %d gid %d\n", | ||
gcred, acred->uid, acred->gid); | ||
return &gcred->gc_base; | ||
} | ||
|
||
static void | ||
generic_free_cred(struct rpc_cred *cred) | ||
{ | ||
struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | ||
|
||
dprintk("RPC: generic_free_cred %p\n", gcred); | ||
if (gcred->acred.group_info != NULL) | ||
put_group_info(gcred->acred.group_info); | ||
kfree(gcred); | ||
} | ||
|
||
static void | ||
generic_free_cred_callback(struct rcu_head *head) | ||
{ | ||
struct rpc_cred *cred = container_of(head, struct rpc_cred, cr_rcu); | ||
generic_free_cred(cred); | ||
} | ||
|
||
static void | ||
generic_destroy_cred(struct rpc_cred *cred) | ||
{ | ||
call_rcu(&cred->cr_rcu, generic_free_cred_callback); | ||
} | ||
|
||
/* | ||
* Match credentials against current process creds. | ||
*/ | ||
static int | ||
generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) | ||
{ | ||
struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); | ||
|
||
if (gcred->acred.uid != acred->uid || | ||
gcred->acred.gid != acred->gid || | ||
gcred->acred.group_info != acred->group_info) | ||
return 0; | ||
return 1; | ||
} | ||
|
||
void __init rpc_init_generic_auth(void) | ||
{ | ||
spin_lock_init(&generic_cred_cache.lock); | ||
} | ||
|
||
void __exit rpc_destroy_generic_auth(void) | ||
{ | ||
rpcauth_clear_credcache(&generic_cred_cache); | ||
} | ||
|
||
static struct rpc_cred_cache generic_cred_cache = { | ||
{{ NULL, },}, | ||
}; | ||
|
||
static const struct rpc_authops generic_auth_ops = { | ||
.owner = THIS_MODULE, | ||
#ifdef RPC_DEBUG | ||
.au_name = "Generic", | ||
#endif | ||
.lookup_cred = generic_lookup_cred, | ||
.crcreate = generic_create_cred, | ||
}; | ||
|
||
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 = { | ||
.cr_name = "Generic cred", | ||
.crdestroy = generic_destroy_cred, | ||
.crmatch = generic_match, | ||
}; |