[CRIU] [PATCH 1/2] Re-create cgroups if necessary
Saied Kazemi
saied at google.com
Mon Jun 23 12:00:13 PDT 2014
> if (strlen(path) < PATH_MAX)
Shouldn't the comparison inmkdirpat() be >= instead of less than?
--Saied
On Mon, Jun 23, 2014 at 11:53 AM, Andrew Vagin <avagin at parallels.com> 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) {
> c = *tok;
> *tok = 0;
> }
>
> if (mkdirat(fd, path, 0755) < 0 && errno != EEXIST) {
> pr_perror("couldn't mkdirpat directory\n");
> return -1;
> }
>
> if (tok == NULL)
> break;
> else
> *tok = c;
> }
>
> Thanks.
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvz.org/pipermail/criu/attachments/20140623/8bc2ff30/attachment.html>
More information about the CRIU
mailing list