mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user