[CRIU] [PATCH 1/2] Re-create cgroups if necessary
Pavel Emelyanov
xemul at parallels.com
Tue Jun 24 00:09:56 PDT 2014
On 06/23/2014 10:53 PM, Andrew Vagin wrote:
> On Mon, Jun 23, 2014 at 10:29:53PM +0400, Andrew Vagin wrote:
>> On Mon, Jun 23, 2014 at 03:54:22PM +0000, Tycho Andersen wrote:
>>> If a task had cgroups, these should be restored. (Also any properties of
>>> cgroups, but this commit doesn't do that yet.)
>>>
>>> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>
>>> ---
>>> cgroup.c | 6 +++++-
>>> include/util.h | 5 +++++
>>> util.c | 26 ++++++++++++++++++++++++++
>>> 3 files changed, 36 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/cgroup.c b/cgroup.c
>>> index 2d9ebad..8b2deb2 100644
>>> --- a/cgroup.c
>>> +++ b/cgroup.c
>>> @@ -258,9 +258,13 @@ static int move_in_cgroup(CgSetEntry *se)
>>> int fd, err;
>>> ControllerEntry *ce = se->ctls[i];
>>>
>>> + sprintf(aux, "%s/%s", ce->name, ce->path);
>>> + if (mkdirpat(cg, aux) < 0)
>>> + return -1;
>>> +
>>> sprintf(aux, "%s/%s/tasks", ce->name, ce->path);
>>> pr_debug(" `-> %s\n", aux);
>>> - err = fd = openat(cg, aux, O_WRONLY);
>>> + err = fd = openat(cg, aux, O_WRONLY | O_CREAT, 0700);
>>> if (fd >= 0) {
>>> /*
>>> * Writing zero into this file moves current
>>> diff --git a/include/util.h b/include/util.h
>>> index 22a0f3d..e2ec22e 100644
>>> --- a/include/util.h
>>> +++ b/include/util.h
>>> @@ -303,4 +303,9 @@ static inline bool strstartswith(char *str, char *sub)
>>> }
>>> }
>>>
>>> +/*
>>> + * mkdir -p for a file descriptor
>>> + */
>>> +int mkdirpat(int fd, const char* path);
>>> +
>>> #endif /* __CR_UTIL_H__ */
>>> diff --git a/util.c b/util.c
>>> index 975af30..7d235c6 100644
>>> --- a/util.c
>>> +++ b/util.c
>>> @@ -677,3 +677,29 @@ struct vma_area *alloc_vma_area(void)
>>>
>>> return p;
>>> }
>>> +
>>> +int mkdirpat(int fd, const char* path)
>>> +{
>>> + char* tok;
>>> + char made_path[PATH_MAX] = "", tok_path[PATH_MAX];
>>> +
>>> + if (strlen(path) < PATH_MAX)
>>> + {
>>> + pr_err("path %s is longer than PATH_MAX", path);
>>> + return -1;
>>> + }
>>> +
>>> + strncpy(tok_path, path, PATH_MAX);
>>> +
>>> + for(tok = strtok(tok_path, "/"); tok; tok = strtok(NULL, "/")) {
>>
>> tok = strtok(NULL, "/") always returns NULL
>
> Sorry, pls ignore this comment.
>
>>
>>> + strcat(made_path, tok);
>>> + strcat(made_path, "/");
>>> + if (mkdirat(fd, made_path, 0755) < 0 && errno != EEXIST) {
>>> + pr_perror("couldn't mkdirpat directory\n");
>>> + return -1;
>>> + }
>>> + }
>
> Look at my version. It doesn't copy a path in another place.
>
> tok = path;
> while (tok = strchr(tok + 1, "/")) {
> char c;
> if (tok != NULL) {
Is this if necessary?
> c = *tok;
> *tok = 0;
> }
>
> if (mkdirat(fd, path, 0755) < 0 && errno != EEXIST) {
> pr_perror("couldn't mkdirpat directory\n");
> return -1;
> }
>
> if (tok == NULL)
This one?
> break;
> else
> *tok = c;
> }
>
> Thanks.
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
> .
>
More information about the CRIU
mailing list