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

Commit 97d0fb23 authored by NeilBrown's avatar NeilBrown Committed by Anna Schumaker
Browse files

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: default avatarNeilBrown <neilb@suse.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent d89b22d4
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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;