mirror of https://gitee.com/openkylin/linux.git
cred: add get_cred_rcu()
Sometimes we want to opportunistically get a ref to a cred in an rcu_read_lock protected section. get_task_cred() does this, and NFS does as similar thing with its own credential structures. To prepare for NFS converting to use 'struct cred' more uniformly, define get_cred_rcu(), and use it in get_task_cred(). Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
d89b22d46a
commit
97d0fb239c
|
@ -252,6 +252,17 @@ static inline const struct cred *get_cred(const struct cred *cred)
|
|||
return get_new_cred(nonconst_cred);
|
||||
}
|
||||
|
||||
static inline const struct cred *get_cred_rcu(const struct cred *cred)
|
||||
{
|
||||
struct cred *nonconst_cred = (struct cred *) cred;
|
||||
if (!cred)
|
||||
return NULL;
|
||||
if (!atomic_inc_not_zero(&nonconst_cred->usage))
|
||||
return NULL;
|
||||
validate_creds(cred);
|
||||
return cred;
|
||||
}
|
||||
|
||||
/**
|
||||
* put_cred - Release a reference to a set of credentials
|
||||
* @cred: The credentials to release
|
||||
|
|
|
@ -195,7 +195,7 @@ const struct cred *get_task_cred(struct task_struct *task)
|
|||
do {
|
||||
cred = __task_cred((task));
|
||||
BUG_ON(!cred);
|
||||
} while (!atomic_inc_not_zero(&((struct cred *)cred)->usage));
|
||||
} while (!get_cred_rcu(cred));
|
||||
|
||||
rcu_read_unlock();
|
||||
return cred;
|
||||
|
|
Loading…
Reference in New Issue