diff options
author | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-12-29 07:05:54 +0000 |
---|---|---|
committer | Dhaval Giani <dhaval@linux.vnet.ibm.com> | 2008-12-29 07:05:54 +0000 |
commit | a55e74b2c3aafca3ef99a0758e1f0deab7de3ad2 (patch) | |
tree | 56572b5ddee06663c09dc32eb15067785a0952af /api.c | |
parent | e397822e299a297d22f49216f2bcbdf41db6781f (diff) | |
download | libcg-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
Diffstat (limited to 'api.c')
-rw-r--r-- | api.c | 29 |
1 files changed, 13 insertions, 16 deletions
@@ -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)) { |