lkml.org 
[lkml]   [2010]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[C/R v20][PATCH 02/96] eclone (2/11): Have alloc_pidmap() return actual error code
    Date
    From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>

    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.

    Changelog[v1]:
    - [Oren Laadan] Rebase to kernel 2.6.33

    Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Acked-by: Serge E. Hallyn <serue@us.ibm.com>
    Tested-by: Serge E. Hallyn <serue@us.ibm.com>
    Reviewed-by: Oren Laadan <orenl@cs.columbia.edu>
    ---
    kernel/fork.c | 5 +++--
    kernel/pid.c | 10 ++++++----
    2 files changed, 9 insertions(+), 6 deletions(-)

    diff --git a/kernel/fork.c b/kernel/fork.c
    index f88bd98..e9cf524 100644
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -1167,10 +1167,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 39292e6..252babf 100644
    --- a/kernel/pid.c
    +++ b/kernel/pid.c
    @@ -160,7 +160,7 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
    for (i = 0; i <= max_scan; ++i) {
    if (unlikely(!map->page))
    if (alloc_pidmap_page(map) < 0)
    - break;
    + return -ENOMEM;
    if (likely(atomic_read(&map->nr_free))) {
    do {
    if (!test_and_set_bit(offset, map->page)) {
    @@ -191,7 +191,7 @@ static int alloc_pidmap(struct pid_namespace *pid_ns)
    }
    pid = mk_pid(pid_ns, map, offset);
    }
    - return -1;
    + return -EBUSY;
    }

    int next_pidmap(struct pid_namespace *pid_ns, int last)
    @@ -260,8 +260,10 @@ struct pid *alloc_pid(struct pid_namespace *ns)
    struct upid *upid;

    pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL);
    - if (!pid)
    + if (!pid) {
    + pid = ERR_PTR(-ENOMEM);
    goto out;
    + }

    tmp = ns;
    for (i = ns->level; i >= 0; i--) {
    @@ -295,7 +297,7 @@ out_free:
    free_pidmap(pid->numbers + i);

    kmem_cache_free(ns->pid_cachep, pid);
    - pid = NULL;
    + pid = ERR_PTR(nr);
    goto out;
    }

    --
    1.6.3.3


    \
     
     \ /
      Last update: 2010-03-17 17:17    [W:2.229 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site