lkml.org 
[lkml]   [2009]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[v13][PATCH 02/12] Have alloc_pidmap() return actual error code

    From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Subject: [v13][PATCH 02/12] 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@linux.vnet.ibm.com>
    Acked-by: Serge Hallyn <serue@us.ibm.com>
    Reviewed-by: Oren Laadan <orenl@cs.columbia.edu>
    ---
    kernel/fork.c | 5 +++--
    kernel/pid.c | 14 +++++++++-----
    2 files changed, 12 insertions(+), 7 deletions(-)

    diff --git a/kernel/fork.c b/kernel/fork.c
    index 166b8c4..8053c10 100644
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -1156,10 +1156,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 7d4bb6e..c4d9914 100644
    --- a/kernel/pid.c
    +++ b/kernel/pid.c
    @@ -150,7 +150,7 @@ static int alloc_pidmap_page(struct pidmap *map)
    static int alloc_pidmap(struct pid_namespace *pid_ns)
    {
    int i, offset, max_scan, pid, last = pid_ns->last_pid;
    - int rc;
    + int rc = -EAGAIN;
    struct pidmap *map;

    pid = last + 1;
    @@ -189,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)
    @@ -263,8 +265,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--) {
    @@ -299,7 +303,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.0.4


    \
     
     \ /
      Last update: 2009-11-25 20:01    [W:0.039 / U:29.336 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site