summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/ucount.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/ucount.c b/kernel/ucount.c
index c3de5b94d25f..94b70502dc9d 100644
--- a/kernel/ucount.c
+++ b/kernel/ucount.c
@@ -285,9 +285,12 @@ static void do_dec_rlimit_put_ucounts(struct ucounts *ucounts,
{
struct ucounts *iter, *next;
for (iter = ucounts; iter != last; iter = next) {
- long dec = atomic_long_sub_return(1, &iter->rlimit[type]);
- WARN_ON_ONCE(dec < 0);
+ long dec;
+
+ /* Our count pins @iter; once it is dropped @iter may be freed. */
next = iter->ns->ucounts;
+ dec = atomic_long_sub_return(1, &iter->rlimit[type]);
+ WARN_ON_ONCE(dec < 0);
if (dec == 0)
put_ucounts(iter);
}