|
@@ -193,10 +193,8 @@ struct pid *alloc_pid(struct pid_namespace *ns)
|
|
|
}
|
|
|
|
|
|
if (unlikely(is_child_reaper(pid))) {
|
|
|
- if (pid_ns_prepare_proc(ns)) {
|
|
|
- disable_pid_allocation(ns);
|
|
|
+ if (pid_ns_prepare_proc(ns))
|
|
|
goto out_free;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
get_pid_ns(ns);
|
|
@@ -226,6 +224,10 @@ out_free:
|
|
|
while (++i <= ns->level)
|
|
|
idr_remove(&ns->idr, (pid->numbers + i)->nr);
|
|
|
|
|
|
+ /* On failure to allocate the first pid, reset the state */
|
|
|
+ if (ns->pid_allocated == PIDNS_ADDING)
|
|
|
+ idr_set_cursor(&ns->idr, 0);
|
|
|
+
|
|
|
spin_unlock_irq(&pidmap_lock);
|
|
|
|
|
|
kmem_cache_free(ns->pid_cachep, pid);
|