[CRIU] [PATCH 1/2] cg: Make lacking properties during dump non-fatal

Pavel Emelyanov xemul at parallels.com
Fri Aug 15 03:45:30 PDT 2014


On 08/14/2014 10:39 PM, gbellack at google.com wrote:
> From: Garrison Bellack <gbellack at google.com>
> 
> Because different kernel versions have different cgroup properties, criu
> shouldn't crash just because the properties statically listed aren't exact.
> Instead, during dump, ignore properties the kernel doesn't have and continue.
> 
> Change-Id: I5a8b93d6a8a3a9664914f10cf8e2110340dd8b31
> Signed-off-by: Garrison Bellack <gbellack at google.com>

I'm OK with the patch and plan to merge it in.
Tycho, Serge, do you have any concerns?

> ---
>  cgroup.c | 32 ++++++++++++++++++++------------
>  1 file changed, 20 insertions(+), 12 deletions(-)
> 
> diff --git a/cgroup.c b/cgroup.c
> index f8dbbde..016ca6c 100644
> --- a/cgroup.c
> +++ b/cgroup.c
> @@ -284,35 +284,30 @@ static int find_dir(const char *path, struct list_head *dirs, struct cgroup_dir
>   * Currently this function only supports properties that have 1 value, under 100
>   * chars
>   */
> -static int read_cgroup_prop(struct cgroup_prop *property, const char *fpath)
> +static int read_cgroup_prop(struct cgroup_prop *property, const char *fullpath)
>  {
> -	char pbuf[PATH_MAX], buf[100];
> +	char buf[100];
>  	FILE *f;
>  	char *endptr;
>  
> -	if (snprintf(pbuf, PATH_MAX, "%s/%s", fpath, property->name) >= PATH_MAX) {
> -		pr_err("snprintf output was truncated");
> -		return -1;
> -	}
> -
> -	f = fopen(pbuf, "r");
> +	f = fopen(fullpath, "r");
>  	if (!f) {
> -		pr_err("Failed opening %s\n", pbuf);
>  		property->value = NULL;
> +		pr_perror("Failed opening %s\n", fullpath);
>  		return -1;
>  	}
>  
>  	memset(buf, 0, sizeof(buf));
>  	if (fread(buf, sizeof(buf), 1, f) != 1) {
>  		if (!feof(f)) {
> -			pr_err("Failed scanning %s\n", pbuf);
> +			pr_err("Failed scanning %s\n", fullpath);
>  			fclose(f);
>  			return -1;
>  		}
>  	}
>  
>  	if (fclose(f) != 0) {
> -		pr_err("Failed closing %s\n", pbuf);
> +		pr_err("Failed closing %s\n", fullpath);
>  		return -1;
>  	}
>  
> @@ -390,6 +385,7 @@ static int add_cgroup_properties(const char *fpath, struct cgroup_dir *ncd,
>  				 struct cg_controller *controller)
>  {
>  	int i, j;
> +	char buf[PATH_MAX];
>  	struct cgroup_prop *prop;
>  
>  	for (i = 0; i < controller->n_controllers; ++i) {
> @@ -397,16 +393,28 @@ static int add_cgroup_properties(const char *fpath, struct cgroup_dir *ncd,
>  		const char **prop_arr = get_known_properties(controller->controllers[i]);
>  
>  		for (j = 0; prop_arr != NULL && prop_arr[j] != NULL; ++j) {
> +			if (snprintf(buf, PATH_MAX, "%s/%s", fpath, prop_arr[j]) >= PATH_MAX) {
> +				pr_err("snprintf output was truncated");
> +				return -1;
> +			}
> +
> +			if (access(buf, F_OK) < 0 && errno == ENOENT) {
> +				pr_info("Couldn't open %s. This cgroup property may not exist on this kernel\n", buf);
> +				continue;
> +			}
> +
>  			prop = create_cgroup_prop(prop_arr[j]);
>  			if (!prop) {
>  				free_all_cgroup_props(ncd);
>  				return -1;
>  			}
> -			if (read_cgroup_prop(prop, fpath) < 0) {
> +
> +			if (read_cgroup_prop(prop, buf) < 0) {
>  				free_cgroup_prop(prop);
>  				free_all_cgroup_props(ncd);
>  				return -1;
>  			}
> +
>  			pr_info("Dumping value %s from %s/%s\n", prop->value, fpath, prop->name);
>  			list_add_tail(&prop->list, &ncd->properties);
>  			ncd->n_properties++;
> 



More information about the CRIU mailing list