Commit da70d310 authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

ucounts: Add get_ucounts_or_wrap for clarity

Add a helper function get_ucounts_or_wrap that is a trivial
wrapper around atomic_add_negative, that makes it clear
how atomic_add_negative is used in the context of ucounts.

Link: https://lkml.kernel.org/r/87pms2qkr9.fsf_-_@disp2133


Tested-by: default avatarYu Zhao <yuzhao@google.com>
Reviewed-by: default avatarAlexey Gladkov <legion@kernel.org>
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 5fc9e37c
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -150,9 +150,15 @@ static void hlist_add_ucounts(struct ucounts *ucounts)
	spin_unlock_irq(&ucounts_lock);
}

static inline bool get_ucounts_or_wrap(struct ucounts *ucounts)
{
	/* Returns true on a successful get, false if the count wraps. */
	return !atomic_add_negative(1, &ucounts->count);
}

struct ucounts *get_ucounts(struct ucounts *ucounts)
{
	if (atomic_add_negative(1, &ucounts->count)) {
	if (!get_ucounts_or_wrap(ucounts)) {
		put_ucounts(ucounts);
		ucounts = NULL;
	}
@@ -163,7 +169,7 @@ struct ucounts *alloc_ucounts(struct user_namespace *ns, kuid_t uid)
{
	struct hlist_head *hashent = ucounts_hashentry(ns, uid);
	struct ucounts *ucounts, *new;
	long overflow;
	bool wrapped;

	spin_lock_irq(&ucounts_lock);
	ucounts = find_ucounts(ns, uid, hashent);
@@ -188,9 +194,9 @@ struct ucounts *alloc_ucounts(struct user_namespace *ns, kuid_t uid)
			return new;
		}
	}
	overflow = atomic_add_negative(1, &ucounts->count);
	wrapped = !get_ucounts_or_wrap(ucounts);
	spin_unlock_irq(&ucounts_lock);
	if (overflow) {
	if (wrapped) {
		put_ucounts(ucounts);
		return NULL;
	}