summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-04-22 17:26:06 -0300
committerLennart Poettering <lennart@poettering.net>2013-04-22 23:14:12 -0300
commitaff38e74bd776471f15ba54b305a24b0251eb865 (patch)
tree3cf5b2d30d78cd2f7472907d098e298b52683e2e
parentdc2c75602dc9f2529e6ba6db02fa53d057ce0f8c (diff)
nspawn: suffix the nspawn cgroups with ".nspawn"
As discussed with Dan Berrange it's a good idea to suffix all objects in the cgroup tree with ".something", so that when the system is partitioned using a resource management tool we can drop objects of different types into the same partition directory without generate namespace conflicts. We'l add this to the Pax Control Group document as soon as write access to the fdo wiki is restored.
-rw-r--r--src/nspawn/nspawn.c2
-rw-r--r--src/shared/cgroup-util.c6
-rw-r--r--src/test/test-cgroup-util.c40
3 files changed, 46 insertions, 2 deletions
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 0a5a151202..1e7df38c16 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -1298,7 +1298,7 @@ int main(int argc, char *argv[]) {
goto finish;
}
- newcg = strjoin(machine_root, "/", arg_machine, NULL);
+ newcg = strjoin(machine_root, "/", arg_machine, ".nspawn", NULL);
if (!newcg) {
log_error("Failed to allocate cgroup path.");
goto finish;
diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c
index 5d44342bbe..e54b94658c 100644
--- a/src/shared/cgroup-util.c
+++ b/src/shared/cgroup-util.c
@@ -1320,7 +1320,7 @@ int cg_pid_get_user_unit(pid_t pid, char **unit) {
int cg_path_get_machine_name(const char *path, char **machine) {
const char *e, *n;
- char *s;
+ char *s, *dot;
assert(path);
assert(machine);
@@ -1337,6 +1337,10 @@ int cg_path_get_machine_name(const char *path, char **machine) {
if (!s)
return -ENOMEM;
+ dot = strrchr(s, '.');
+ if (dot)
+ *dot = 0;
+
*machine = s;
return 0;
}
diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c
index 5eaa129418..f632df11eb 100644
--- a/src/test/test-cgroup-util.c
+++ b/src/test/test-cgroup-util.c
@@ -89,11 +89,51 @@ static void test_get_paths(void) {
log_info("Machine = %s", d);
}
+static void test_proc(void) {
+ _cleanup_closedir_ DIR *d = NULL;
+ struct dirent *de;
+ int r;
+
+ d = opendir("/proc");
+ assert_se(d);
+
+ FOREACH_DIRENT(de, d, break) {
+ _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL;
+ pid_t pid;
+
+ if (de->d_type != DT_DIR &&
+ de->d_type != DT_UNKNOWN)
+ continue;
+
+ r = parse_pid(de->d_name, &pid);
+ if (r < 0)
+ continue;
+
+ cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path);
+ cg_pid_get_path_shifted(pid, &prefix, &path_shifted);
+ cg_pid_get_session(pid, &session);
+ cg_pid_get_unit(pid, &unit);
+ cg_pid_get_user_unit(pid, &user_unit);
+ cg_pid_get_machine_name(pid, &machine);
+
+ printf("%lu\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
+ (unsigned long) pid,
+ path,
+ prefix,
+ path_shifted,
+ session,
+ unit,
+ user_unit,
+ machine);
+ }
+}
+
int main(void) {
test_path_decode_unit();
test_path_get_unit();
test_path_get_user_unit();
test_get_paths();
+ test_proc();
return 0;
}