* Dhaval Giani <[email protected]> [2008-12-28 19:51:29]:
> cgroup_get_cgroup was failing with the memory controller enabled. It was
> failing on memory.force_empty. The file has read permissions, but there
> is no read routine associated with it inside the kernel. fscanf failed
> and so cgroup_get_cgroup also failed. This was unexpected,
> cgroup_get_cgroup should have just skipped the file. In order to fix
> this, change cg_rd_ctrl_file to return more descriptive errors.
>
> Sigend-off-by: Dhaval Giani <[email protected]>
>
> ---
> api.c | 29 +++++++++++++----------------
> 1 file changed, 13 insertions(+), 16 deletions(-)
>
> Index: trunk/api.c
> ===================================================================
> --- trunk.orig/api.c 2008-12-22 14:18:26.000000000 +0530
> +++ trunk/api.c 2008-12-28 02:11:14.000000000 +0530
> @@ -1371,38 +1371,37 @@ open_err:
> * will assume that the callers have taken care of everything.
> * Including the locking.
> */
> -static char *cg_rd_ctrl_file(char *subsys, char *cgroup, char *file)
> +static int cg_rd_ctrl_file(char *subsys, char *cgroup, char *file, char
> **value)
> {
> - char *value;
> char path[FILENAME_MAX];
> FILE *ctrl_file;
> int ret;
>
> if (!cg_build_path_locked(cgroup, path, subsys))
> - return NULL;
> + return ECGFAIL;
>
> strcat(path, file);
> ctrl_file = fopen(path, "r");
> if (!ctrl_file)
> - return NULL;
> + return ECGROUPVALUENOTEXIST;
>
> - value = malloc(CG_VALUE_MAX);
> - if (!value)
> - return NULL;
> + *value = malloc(CG_VALUE_MAX);
> + if (!*value)
> + return ECGOTHER;
>
> /*
> * using %as crashes when we try to read from files like
> * memory.stat
> */
> - ret = fscanf(ctrl_file, "%s", value);
> + ret = fscanf(ctrl_file, "%s", *value);
> if (ret == 0 || ret == EOF) {
> - free(value);
> - value = NULL;
> + free(*value);
> + *value = NULL;
> }
>
> fclose(ctrl_file);
>
> - return value;
> + return 0;
> }
>
> /*
> @@ -1461,12 +1460,10 @@ static int cgroup_fill_cgc(struct dirent
> }
>
> if (strcmp(ctrl_name, cg_mount_table[index].name) == 0) {
> - ctrl_value = cg_rd_ctrl_file(cg_mount_table[index].name,
> - cgroup->name, ctrl_dir->d_name);
> - if (!ctrl_value) {
> - error = ECGFAIL;
> + error = cg_rd_ctrl_file(cg_mount_table[index].name,
> + cgroup->name, ctrl_dir->d_name, &ctrl_value);
> + if (error || !ctrl_value) {
> goto fill_error;
We overwrite error below, that line should also be removed
> - }
>
> if (cgroup_add_value_string(cgc, ctrl_dir->d_name,
> ctrl_value)) {
>
We need to add support for reading .stat files as well, time to
unleash the plugin layer 2 API infrastructure. I know we have patches
in progress, may be it is time for an RFC?
--
Balbir
------------------------------------------------------------------------------
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel