From 57ff284180325bcd7483054ae1c119fae73001db Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Mon, 12 Jul 2010 18:50:25 -0700 Subject: [PATCH] --- yaml --- r: 346309 b: refs/heads/master c: 5e1182deb81ae8c68494017c4a8a71811659c870 h: refs/heads/master i: 346307: 47e3940a9bba47b2a8db6b02faa3a094db85eb75 v: v3 --- [refs] | 2 +- trunk/kernel/pid.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index eee1c1486b39..13c46ae9cdc4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0a01f2cc390e10633a54f72c608cc3fe19a50c3d +refs/heads/master: 5e1182deb81ae8c68494017c4a8a71811659c870 diff --git a/trunk/kernel/pid.c b/trunk/kernel/pid.c index e957f8b09136..9c219117af36 100644 --- a/trunk/kernel/pid.c +++ b/trunk/kernel/pid.c @@ -274,8 +274,10 @@ void free_pid(struct pid *pid) for (i = 0; i <= pid->level; i++) { struct upid *upid = pid->numbers + i; hlist_del_rcu(&upid->pid_chain); - if (--upid->ns->nr_hashed == 0) + if (--upid->ns->nr_hashed == 0) { + upid->ns->nr_hashed = -1; schedule_work(&upid->ns->proc_work); + } } spin_unlock_irqrestore(&pidmap_lock, flags); @@ -321,6 +323,8 @@ struct pid *alloc_pid(struct pid_namespace *ns) upid = pid->numbers + ns->level; spin_lock_irq(&pidmap_lock); + if (ns->nr_hashed < 0) + goto out_unlock; for ( ; upid >= pid->numbers; --upid) { hlist_add_head_rcu(&upid->pid_chain, &pid_hash[pid_hashfn(upid->nr, upid->ns)]); @@ -331,6 +335,8 @@ struct pid *alloc_pid(struct pid_namespace *ns) out: return pid; +out_unlock: + spin_unlock(&pidmap_lock); out_free: while (++i <= ns->level) free_pidmap(pid->numbers + i);