pidns: Make the pidns proc mount/umount logic obvious.
authorEric W. Biederman <ebiederm@xmission.com>
Wed, 1 Aug 2012 17:33:47 +0000 (10:33 -0700)
committerEric W. Biederman <ebiederm@xmission.com>
Mon, 19 Nov 2012 13:59:10 +0000 (05:59 -0800)
commit0a01f2cc390e10633a54f72c608cc3fe19a50c3d
treee713a1c45b5ce125a5d33b61d528cd45264d47a7
parent17cf22c33e1f1b5e435469c84e43872579497653
pidns: Make the pidns proc mount/umount logic obvious.

Track the number of pids in the proc hash table.  When the number of
pids goes to 0 schedule work to unmount the kernel mount of proc.

Move the mount of proc into alloc_pid when we allocate the pid for
init.

Remove the surprising calls of pid_ns_release proc in fork and
proc_flush_task.  Those code paths really shouldn't know about proc
namespace implementation details and people have demonstrated several
times that finding and understanding those code paths is difficult and
non-obvious.

Because of the call path detach pid is alwasy called with the
rtnl_lock held free_pid is not allowed to sleep, so the work to
unmounting proc is moved to a work queue.  This has the side benefit
of not blocking the entire world waiting for the unnecessary
rcu_barrier in deactivate_locked_super.

In the process of making the code clear and obvious this fixes a bug
reported by Gao feng <gaofeng@cn.fujitsu.com> where we would leak a
mount of proc during clone(CLONE_NEWPID|CLONE_NEWNET) if copy_pid_ns
succeeded and copy_net_ns failed.

Acked-by: "Serge E. Hallyn" <serge@hallyn.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/proc/base.c
fs/proc/root.c
include/linux/pid_namespace.h
kernel/fork.c
kernel/pid.c
kernel/pid_namespace.c