On Sat, May 30, 2009 at 05:01:15PM -0700, Sukadev Bhattiprolu wrote: > >From: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> >Date: Mon, 4 May 2009 01:17:40 -0700 >Subject: [RFC][v3][PATCH 2/7] Have alloc_pidmap() return actual error code > >alloc_pidmap() can fail either because all pid numbers are in use or >because memory allocation failed. With support for setting a specific >pid number, alloc_pidmap() would also fail if either the given pid >number is invalid or in use. > >Rather than have callers assume -ENOMEM, have alloc_pidmap() return >the actual error. > >Signed-off-by: Sukadev Bhattiprolu <sukadev@xxxxxxxxxxxxxxxxxx> >Acked-by: Serge Hallyn <serue@xxxxxxxxxx> >Reviewed-by: Oren Laadan <orenl@xxxxxxxxxxxxxxx> Reviewed-by: WANG Cong <xiyou.wangcong@xxxxxxxxx> >--- > kernel/fork.c | 5 +++-- > kernel/pid.c | 9 ++++++--- > 2 files changed, 9 insertions(+), 5 deletions(-) > >diff --git a/kernel/fork.c b/kernel/fork.c >index b9e2edd..f8411a8 100644 >--- a/kernel/fork.c >+++ b/kernel/fork.c >@@ -1119,10 +1119,11 @@ static struct task_struct *copy_process(unsigned long clone_flags, > goto bad_fork_cleanup_io; > > if (pid != &init_struct_pid) { >- retval = -ENOMEM; > pid = alloc_pid(p->nsproxy->pid_ns); >- if (!pid) >+ if (IS_ERR(pid)) { >+ retval = PTR_ERR(pid); > goto bad_fork_cleanup_io; >+ } > > if (clone_flags & CLONE_NEWPID) { > retval = pid_ns_prepare_proc(p->nsproxy->pid_ns); >diff --git a/kernel/pid.c b/kernel/pid.c >index 9ff33cc..b2d6a19 100644 >--- a/kernel/pid.c >+++ b/kernel/pid.c >@@ -158,6 +158,7 @@ static int alloc_pidmap(struct pid_namespace *pid_ns) > offset = pid & BITS_PER_PAGE_MASK; > map = &pid_ns->pidmap[pid/BITS_PER_PAGE]; > max_scan = (pid_max + BITS_PER_PAGE - 1)/BITS_PER_PAGE - !offset; >+ rc = -EAGAIN; > for (i = 0; i <= max_scan; ++i) { > rc = alloc_pidmap_page(map); > if (rc) >@@ -188,12 +189,14 @@ static int alloc_pidmap(struct pid_namespace *pid_ns) > } else { > map = &pid_ns->pidmap[0]; > offset = RESERVED_PIDS; >- if (unlikely(last == offset)) >+ if (unlikely(last == offset)) { >+ rc = -EAGAIN; > break; >+ } > } > pid = mk_pid(pid_ns, map, offset); > } >- return -1; >+ return rc; > } > > int next_pidmap(struct pid_namespace *pid_ns, int last) >@@ -298,7 +301,7 @@ out_free: > free_pidmap(pid->numbers + i); > > kmem_cache_free(ns->pid_cachep, pid); >- pid = NULL; >+ pid = ERR_PTR(nr); > goto out; > } > >-- >1.5.2.5 > >_______________________________________________ >Containers mailing list >Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx >https://lists.linux-foundation.org/mailman/listinfo/containers _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers