[CRIU] [PATCH] cgroup: don't use FILE* for cg property restore

Andrew Vagin avagin at virtuozzo.com
Mon Feb 29 16:09:38 PST 2016


On Mon, Feb 29, 2016 at 03:32:03PM -0700, Tycho Andersen wrote:
> Some libcs buffer writes to FILE*, which means that we error on fclose
> instead of write, which makes it hard to figure out what property actually
> failed writing.
> 
> Also shorten the error path a bit. Hopefully this patch will help with
> debugging #118
>

Acked-by: Andrew Vagin <avagin at openvz.org>
 
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
> ---
>  criu/cgroup.c | 39 ++++++++++++++-------------------------
>  1 file changed, 14 insertions(+), 25 deletions(-)
> 
> diff --git a/criu/cgroup.c b/criu/cgroup.c
> index 7742fda..0d61204 100644
> --- a/criu/cgroup.c
> +++ b/criu/cgroup.c
> @@ -1138,8 +1138,7 @@ static int restore_perms(int fd, const char *path, CgroupPerms *perms)
>  static int restore_cgroup_prop(const CgroupPropEntry * cg_prop_entry_p,
>  			       char *path, int off)
>  {
> -	FILE *f;
> -	int cg, fd;
> +	int cg, fd, len, ret = -1;;
>  	CgroupPerms *perms = cg_prop_entry_p->perms;
>  
>  	if (!cg_prop_entry_p->value) {
> @@ -1155,42 +1154,32 @@ static int restore_cgroup_prop(const CgroupPropEntry * cg_prop_entry_p,
>  	pr_info("Restoring cgroup property value [%s] to [%s]\n", cg_prop_entry_p->value, path);
>  
>  	cg = get_service_fd(CGROUP_YARD);
> -	f = fopenat(cg, path, "w+");
> -	if (!f) {
> -		pr_perror("Failed opening %s for writing", path);
> -		return -1;
> -	}
> -
> -	fd = fileno(f);
> +	fd = openat(cg, path, O_WRONLY);
>  	if (fd < 0) {
> -		fclose(f);
>  		pr_err("bad file stream?");
>  		return -1;
>  	}
>  
> -	if (restore_perms(fd, path, perms) < 0) {
> -		fclose(f);
> -		return -1;
> -	}
> +	if (restore_perms(fd, path, perms) < 0)
> +		goto out;
>  
>  	/* skip these two since restoring their values doesn't make sense */
> -	if (!strcmp(cg_prop_entry_p->name, "cgroup.procs") || !strcmp(cg_prop_entry_p->name, "tasks")) {
> -		fclose(f);
> -		return 0;
> -	}
> +	if (!strcmp(cg_prop_entry_p->name, "cgroup.procs") || !strcmp(cg_prop_entry_p->name, "tasks"))
> +		goto out;
>  
> -	if (fprintf(f, "%s", cg_prop_entry_p->value) < 0) {
> -		fclose(f);
> +	len = strlen(cg_prop_entry_p->value);
> +	if (write(fd, cg_prop_entry_p->value, len) != len) {
>  		pr_err("Failed writing %s to %s\n", cg_prop_entry_p->value, path);
> -		return -1;
> +		goto out;
>  	}
>  
> -	if (fclose(f) != 0) {
> +out:
> +	if (close(fd) != 0)
>  		pr_perror("Failed closing %s", path);
> -		return -1;
> -	}
> +	else
> +		ret = 0;
>  
> -	return 0;
> +	return ret;
>  }
>  
>  static CgroupPropEntry *freezer_state_entry;
> -- 
> 2.6.4
> 
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu


More information about the CRIU mailing list