From: Kirill Tkhai <ktk...@virtuozzo.com>

Extracted from "Initial patch".

Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com>

(cherry picked from vz7 commit 762f3e6a33f389a9bf8cfbd05278ce587520ca94)
Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>

vz8 rebase notes:
* use proper pidns in sys_getppid() - not children's one as in
  original vz7 patch

(cherry picked from vz8 commit 5d8f6f582aef318399ee826a4bc0f096a176c049)
Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>
---
 fs/proc/array.c     |  5 ++---
 include/linux/pid.h |  1 +
 kernel/pid.c        | 12 ++++++++++++
 kernel/sys.c        |  2 +-
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index 481139b434c5..24e5c06c2ed0 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -174,8 +174,7 @@ static inline void task_state(struct seq_file *m, struct 
pid_namespace *ns,
        unsigned int max_fds = 0;
 
        rcu_read_lock();
-       ppid = pid_alive(p) ?
-               task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0;
+       ppid = pid_alive(p) ? ve_task_ppid_nr_ns(p, ns) : 0;
 
        tracer = ptrace_parent(p);
        if (tracer)
@@ -565,7 +564,7 @@ static int do_task_stat(struct seq_file *m, struct 
pid_namespace *ns,
                }
 
                sid = task_session_nr_ns(task, ns);
-               ppid = task_tgid_nr_ns(task->real_parent, ns);
+               ppid = ve_task_ppid_nr_ns(task, ns);
                pgid = task_pgrp_nr_ns(task, ns);
 
                unlock_task_sighand(task, &flags);
diff --git a/include/linux/pid.h b/include/linux/pid.h
index fa10acb8d6a4..518fcfccb1ed 100644
--- a/include/linux/pid.h
+++ b/include/linux/pid.h
@@ -186,6 +186,7 @@ static inline pid_t pid_nr(struct pid *pid)
 
 pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
 pid_t pid_vnr(struct pid *pid);
+pid_t ve_task_ppid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns);
 
 #define do_each_pid_task(pid, type, task)                              \
        do {                                                            \
diff --git a/kernel/pid.c b/kernel/pid.c
index ebdf9c60cd0b..8d0b41e4f735 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -504,6 +504,18 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum 
pid_type type,
 }
 EXPORT_SYMBOL(__task_pid_nr_ns);
 
+pid_t ve_task_ppid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns)
+{
+       pid_t ppid;
+       rcu_read_lock();
+       ppid = task_tgid_nr_ns(rcu_dereference(tsk->real_parent), ns);
+       rcu_read_unlock();
+       /* It's dirty hack. Some old utils don't work if ppid is zero*/
+       if (ppid == 0 && ns->child_reaper != tsk)
+               ppid = 1;
+       return ppid;
+}
+
 struct pid_namespace *task_active_pid_ns(struct task_struct *tsk)
 {
        return ns_of_pid(task_pid(tsk));
diff --git a/kernel/sys.c b/kernel/sys.c
index cc01e2d60e08..da8e44e1525d 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -943,7 +943,7 @@ SYSCALL_DEFINE0(getppid)
        int pid;
 
        rcu_read_lock();
-       pid = task_tgid_vnr(rcu_dereference(current->real_parent));
+       pid = ve_task_ppid_nr_ns(current, task_active_pid_ns(current));
        rcu_read_unlock();
 
        return pid;
-- 
2.31.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to