summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhaval Giani <dhaval@linux.vnet.ibm.com>2008-12-29 07:05:54 +0000
committerDhaval Giani <dhaval@linux.vnet.ibm.com>2008-12-29 07:05:54 +0000
commita55e74b2c3aafca3ef99a0758e1f0deab7de3ad2 (patch)
tree56572b5ddee06663c09dc32eb15067785a0952af
parente397822e299a297d22f49216f2bcbdf41db6781f (diff)
downloadlibcg-a55e74b2c3aafca3ef99a0758e1f0deab7de3ad2.tar.gz
libcg-a55e74b2c3aafca3ef99a0758e1f0deab7de3ad2.tar.xz
libcg-a55e74b2c3aafca3ef99a0758e1f0deab7de3ad2.zip
libcgroup: Don't fail cgroup_get_cgroup if fscanf fails
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. Signed-off-by: Dhaval Giani <dhaval@linux.vnet.ibm.com> Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> git-svn-id: https://libcg.svn.sourceforge.net/svnroot/libcg/trunk@293 4f4bb910-9a46-0410-90c8-c897d4f1cd53
-rw-r--r--api.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/api.c b/api.c
index 0a65270..8867b44 100644
--- a/api.c
+++ b/api.c
@@ -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 *ctrl_dir, struct cgroup *cgroup,
}
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;
- }
if (cgroup_add_value_string(cgc, ctrl_dir->d_name,
ctrl_value)) {