NFS/NFSD/SUNRPC: replace generic creds with 'struct cred'.
SUNRPC has two sorts of credentials, both of which appear as "struct rpc_cred". There are "generic credentials" which are supplied by clients such as NFS and passed in 'struct rpc_message' to indicate which user should be used to authorize the request, and there are low-level credentials such as AUTH_NULL, AUTH_UNIX, AUTH_GSS which describe the credential to be sent over the wires. This patch replaces all the generic credentials by 'struct cred' pointers - the credential structure used throughout Linux. For machine credentials, there is a special 'struct cred *' pointer which is statically allocated and recognized where needed as having a special meaning. A look-up of a low-level cred will map this to a machine credential. Signed-off-by: NeilBrown <neilb@suse.com> Acked-by: J. Bruce Fields <bfields@redhat.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:

committed by
Anna Schumaker

parent
684f39b4cf
commit
a52458b48a
@@ -39,15 +39,15 @@ static const struct rpc_authops __rcu *auth_flavors[RPC_AUTH_MAXFLAVOR] = {
|
||||
static LIST_HEAD(cred_unused);
|
||||
static unsigned long number_cred_unused;
|
||||
|
||||
static struct rpc_cred machine_cred = {
|
||||
.cr_count = REFCOUNT_INIT(1),
|
||||
static struct cred machine_cred = {
|
||||
.usage = ATOMIC_INIT(1),
|
||||
};
|
||||
|
||||
/*
|
||||
* Return the machine_cred pointer to be used whenever
|
||||
* the a generic machine credential is needed.
|
||||
*/
|
||||
struct rpc_cred *rpc_machine_cred(void)
|
||||
const struct cred *rpc_machine_cred(void)
|
||||
{
|
||||
return &machine_cred;
|
||||
}
|
||||
@@ -720,11 +720,15 @@ rpcauth_bind_new_cred(struct rpc_task *task, int lookupflags)
|
||||
}
|
||||
|
||||
static int
|
||||
rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
|
||||
rpcauth_bindcred(struct rpc_task *task, const struct cred *cred, int flags)
|
||||
{
|
||||
struct rpc_rqst *req = task->tk_rqstp;
|
||||
struct rpc_cred *new = NULL;
|
||||
int lookupflags = 0;
|
||||
struct rpc_auth *auth = task->tk_client->cl_auth;
|
||||
struct auth_cred acred = {
|
||||
.cred = cred,
|
||||
};
|
||||
|
||||
if (flags & RPC_TASK_ASYNC)
|
||||
lookupflags |= RPCAUTH_LOOKUP_NEW;
|
||||
@@ -733,7 +737,7 @@ rpcauth_bindcred(struct rpc_task *task, struct rpc_cred *cred, int flags)
|
||||
new = task->tk_op_cred->cr_ops->crbind(task, task->tk_op_cred,
|
||||
lookupflags);
|
||||
else if (cred != NULL && cred != &machine_cred)
|
||||
new = cred->cr_ops->crbind(task, cred, lookupflags);
|
||||
new = auth->au_ops->lookup_cred(auth, &acred, lookupflags);
|
||||
else if (cred == &machine_cred)
|
||||
new = rpcauth_bind_machine_cred(task, lookupflags);
|
||||
|
||||
|
Reference in New Issue
Block a user