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 07/12] Define do_fork_with_pids()

    From: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Subject: [v13][PATCH 07/12] Define do_fork_with_pids()

    do_fork_with_pids() is same as do_fork(), except that it takes an
    additional, 'pid_set', parameter. This parameter, currently unused,
    specifies the set of target pids of the process in each of its pid
    namespaces.

    Changelog[v7]:
    - Drop 'struct pid_set' object and pass in 'pid_t *target_pids'
    instead of 'struct pid_set *'.

    Changelog[v6]:
    - (Nathan Lynch, Arnd Bergmann, H. Peter Anvin, Linus Torvalds)
    Change 'pid_set.pids' to a 'pid_t pids[]' so size of 'struct pid_set'
    is constant across architectures.
    - (Nathan Lynch) Change 'pid_set.num_pids' to 'unsigned int'.

    Changelog[v4]:
    - Rename 'struct target_pid_set' to 'struct pid_set' since it may
    be useful in other contexts.

    Changelog[v3]:
    - Fix "long-line" warning from checkpatch.pl

    Changelog[v2]:
    - To facilitate moving architecture-inpdendent code to kernel/fork.c
    pass in 'struct target_pid_set __user *' to do_fork_with_pids()
    rather than 'pid_t *' (next patch moves the arch-independent
    code to kernel/fork.c)

    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>
    ---
    include/linux/sched.h | 3 +++
    kernel/fork.c | 17 +++++++++++++++--
    2 files changed, 18 insertions(+), 2 deletions(-)

    diff --git a/include/linux/sched.h b/include/linux/sched.h
    index a4d2c23..85e971a 100644
    --- a/include/linux/sched.h
    +++ b/include/linux/sched.h
    @@ -2153,6 +2153,9 @@ extern int disallow_signal(int);

    extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);
    extern long do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int __user *, int __user *);
    +extern long do_fork_with_pids(unsigned long, unsigned long, struct pt_regs *,
    + unsigned long, int __user *, int __user *,
    + unsigned int, pid_t __user *);
    struct task_struct *fork_idle(int);

    extern void set_task_comm(struct task_struct *tsk, char *from);
    diff --git a/kernel/fork.c b/kernel/fork.c
    index 317adcf..2610a64 100644
    --- a/kernel/fork.c
    +++ b/kernel/fork.c
    @@ -1377,12 +1377,14 @@ struct task_struct * __cpuinit fork_idle(int cpu)
    * It copies the process, and if successful kick-starts
    * it and waits for it to finish using the VM if required.
    */
    -long do_fork(unsigned long clone_flags,
    +long do_fork_with_pids(unsigned long clone_flags,
    unsigned long stack_start,
    struct pt_regs *regs,
    unsigned long stack_size,
    int __user *parent_tidptr,
    - int __user *child_tidptr)
    + int __user *child_tidptr,
    + unsigned int num_pids,
    + pid_t __user *upids)
    {
    struct task_struct *p;
    int trace = 0;
    @@ -1485,6 +1487,17 @@ long do_fork(unsigned long clone_flags,
    return nr;
    }

    +long do_fork(unsigned long clone_flags,
    + unsigned long stack_start,
    + struct pt_regs *regs,
    + unsigned long stack_size,
    + int __user *parent_tidptr,
    + int __user *child_tidptr)
    +{
    + return do_fork_with_pids(clone_flags, stack_start, regs, stack_size,
    + parent_tidptr, child_tidptr, 0, NULL);
    +}
    +
    #ifndef ARCH_MIN_MMSTRUCT_ALIGN
    #define ARCH_MIN_MMSTRUCT_ALIGN 0
    #endif
    --
    1.6.0.4


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