[CRIU] [PATCH 1/2] cg: Make lacking properties during dump non-fatal
Tycho Andersen
tycho.andersen at canonical.com
Fri Aug 15 05:09:52 PDT 2014
Hi Pavel,
On Fri, Aug 15, 2014 at 02:45:30PM +0400, Pavel Emelyanov wrote:
> 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?
Nope, I just ran it and it worked fine for me.
Acked-by: Tycho Andersen <tycho.andersen at canonical.com>
> > ---
> > 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