cgsnapshot should show named hierarchies in 'mount' section. It already shows
their groups in 'group' sections and the output should be consistent.
And take care of quotes in the output, '=' is not valid character in controller
name unless it is in double quotes.
Example:
$ mount -t cgroup -o none,name=hello none /cgroup/named
$ mount -t cgroup -o cpuacct,name=cputest none /cgroup/cpuacct
$ cgsnapshot
mount {
cpuacct = /cgroup/cpuacct;
"name=hello" = /cgroup/named;
"name=cputest" = /cgroup/cpuacct;
}
Signed-off-by: Jan Safranek <[email protected]>
---
src/tools/cgsnapshot.c | 41 +++++++++++++++++++++++++++++++++++++----
1 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/src/tools/cgsnapshot.c b/src/tools/cgsnapshot.c
index 4dbecfd..0ff7435 100644
--- a/src/tools/cgsnapshot.c
+++ b/src/tools/cgsnapshot.c
@@ -319,7 +319,10 @@ static int display_cgroup_data(struct cgroup *group,
}
/* print the controller header */
- fprintf(of, "\t%s {\n", controller[i]);
+ if (strncmp(controller[i], "name=", 5) == 0)
+ fprintf(of, "\t\"%s\" {\n", controller[i]);
+ else
+ fprintf(of, "\t%s {\n", controller[i]);
i++;
nr_var = cgroup_get_value_name_count(group_controller);
@@ -573,13 +576,20 @@ static int show_mountpoints(const char *controller)
char path[FILENAME_MAX];
int ret;
void *handle;
+ int quote = 0;
+
+ if (strncmp(controller, "name=", 5) == 0)
+ quote = 1;
ret = cgroup_get_subsys_mount_point_begin(controller, &handle, path);
if (ret)
return ret;
while (ret == 0) {
- printf("\t%s = %s;\n", controller, path);
+ if (quote)
+ printf("\t\"%s\" = %s;\n", controller, path);
+ else
+ printf("\t%s = %s;\n", controller, path);
ret = cgroup_get_subsys_mount_point_next(&handle, path);
}
cgroup_get_subsys_mount_point_end(&handle);
@@ -594,9 +604,10 @@ static int show_mountpoints(const char *controller)
static int parse_mountpoints(cont_name_t cont_names[CG_CONTROLLER_MAX],
const char *program_name)
{
- int ret;
+ int ret, final_ret;
void *handle;
struct controller_data info;
+ struct cgroup_mount_point mount;
/* start mount section */
fprintf(of, "mount {\n");
@@ -629,7 +640,29 @@ static int parse_mountpoints(cont_name_t
cont_names[CG_CONTROLLER_MAX],
}
}
- ret |= cgroup_get_all_controller_end(&handle);
+ final_ret = ret;
+ cgroup_get_all_controller_end(&handle);
+
+ /* process also named hierarchies */
+ ret = cgroup_get_controller_begin(&handle, &mount);
+ while (ret == 0) {
+ if (strncmp(mount.name, "name=", 5) == 0) {
+ ret = show_mountpoints(mount.name);
+ if (ret != 0)
+ break;
+ }
+ ret = cgroup_get_controller_next(&handle, &mount);
+ }
+ if (ret != ECGEOF) {
+ if ((flags & FL_SILENT) != 0) {
+ fprintf(stderr,
+ "E: in get next controller %s\n",
+ cgroup_strerror(ret));
+ return ret;
+ }
+ final_ret = ret;
+ }
+ cgroup_get_controller_end(&handle);
/* finish mount section */
fprintf(of, "}\n\n");
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel