cgroups: implement namespace tracking subsystem
When a task enters a new namespace via a clone() or unshare(), a new cgroup is created and the task moves into it. This version names cgroups which are automatically created using cgroup_clone() as "node_<pid>" where pid is the pid of the unsharing or cloned process. (Thanks Pavel for the idea) This is safe because if the process unshares again, it will create /cgroups/(...)/node_<pid>/node_<pid> The only possibilities (AFAICT) for a -EEXIST on unshare are 1. pid wraparound 2. a process fails an unshare, then tries again. Case 1 is unlikely enough that I ignore it (at least for now). In case 2, the node_<pid> will be empty and can be rmdir'ed to make the subsequent unshare() succeed. Changelog: Name cloned cgroups as "node_<pid>". [clg@fr.ibm.com: fix order of cgroup subsystems in init/Kconfig] Signed-off-by: Serge E. Hallyn <serue@us.ibm.com> Cc: Paul Menage <menage@google.com> Signed-off-by: Cedric Le Goater <clg@fr.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
846c7bb055
commit
858d72ead4
@ -156,7 +156,14 @@ int copy_namespaces(unsigned long flags, struct task_struct *tsk)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ns_cgroup_clone(tsk);
|
||||
if (err) {
|
||||
put_nsproxy(new_ns);
|
||||
goto out;
|
||||
}
|
||||
|
||||
tsk->nsproxy = new_ns;
|
||||
|
||||
out:
|
||||
put_nsproxy(old_ns);
|
||||
return err;
|
||||
@ -196,8 +203,16 @@ int unshare_nsproxy_namespaces(unsigned long unshare_flags,
|
||||
|
||||
*new_nsp = create_new_namespaces(unshare_flags, current,
|
||||
new_fs ? new_fs : current->fs);
|
||||
if (IS_ERR(*new_nsp))
|
||||
if (IS_ERR(*new_nsp)) {
|
||||
err = PTR_ERR(*new_nsp);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = ns_cgroup_clone(current);
|
||||
if (err)
|
||||
put_nsproxy(*new_nsp);
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user