mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-08 14:23:19 +00:00
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: Yu Zhao <yuzhao@google.com> Reviewed-by: Alexey Gladkov <legion@kernel.org> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
parent
5fc9e37cd5
commit
da70d3109e
@ -150,9 +150,15 @@ static void hlist_add_ucounts(struct ucounts *ucounts)
|
|||||||
spin_unlock_irq(&ucounts_lock);
|
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)
|
struct ucounts *get_ucounts(struct ucounts *ucounts)
|
||||||
{
|
{
|
||||||
if (atomic_add_negative(1, &ucounts->count)) {
|
if (!get_ucounts_or_wrap(ucounts)) {
|
||||||
put_ucounts(ucounts);
|
put_ucounts(ucounts);
|
||||||
ucounts = NULL;
|
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 hlist_head *hashent = ucounts_hashentry(ns, uid);
|
||||||
struct ucounts *ucounts, *new;
|
struct ucounts *ucounts, *new;
|
||||||
long overflow;
|
bool wrapped;
|
||||||
|
|
||||||
spin_lock_irq(&ucounts_lock);
|
spin_lock_irq(&ucounts_lock);
|
||||||
ucounts = find_ucounts(ns, uid, hashent);
|
ucounts = find_ucounts(ns, uid, hashent);
|
||||||
@ -188,9 +194,9 @@ struct ucounts *alloc_ucounts(struct user_namespace *ns, kuid_t uid)
|
|||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
overflow = atomic_add_negative(1, &ucounts->count);
|
wrapped = !get_ucounts_or_wrap(ucounts);
|
||||||
spin_unlock_irq(&ucounts_lock);
|
spin_unlock_irq(&ucounts_lock);
|
||||||
if (overflow) {
|
if (wrapped) {
|
||||||
put_ucounts(ucounts);
|
put_ucounts(ucounts);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user