On Wed, 13.05.15 15:45, Iago López Galeiras (i...@endocode.com) wrote: > If a symlink to a combined cgroup hierarchy already exists and points to > the right path, skip it. This avoids an error when the cgroups are set > manually before calling nspawn.
Thanks! Applied with some minor modifications. > --- > src/nspawn/nspawn.c | 10 ++++++++-- > src/shared/util.c | 23 +++++++++++++++++++++++ > src/shared/util.h | 1 + > 3 files changed, 32 insertions(+), 2 deletions(-) > > diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c > index f292c63..e9e703f 100644 > --- a/src/nspawn/nspawn.c > +++ b/src/nspawn/nspawn.c > @@ -1365,8 +1365,14 @@ static int mount_cgroup(const char *dest) { > if (r < 0) > return r; > > - if (symlink(combined, target) < 0) > - return log_error_errno(errno, "Failed to > create symlink for combined hierarchy: %m"); > + r = symlink_idempotent(combined, target); > + if (r < 0) { > + if (r == -EINVAL) { > + log_error("Invalid existing symlink > for combined hierarchy"); > + return r; > + } else > + return log_error_errno(r, "Failed to > create symlink for combined hierarchy: %m"); > + } > } > } > > diff --git a/src/shared/util.c b/src/shared/util.c > index 466dce4..22e00a6 100644 > --- a/src/shared/util.c > +++ b/src/shared/util.c > @@ -2765,6 +2765,29 @@ int symlink_atomic(const char *from, const char *to) { > return 0; > } > > +int symlink_idempotent(const char *from, const char *to) { > + _cleanup_free_ char *p = NULL; > + int r; > + > + assert(from); > + assert(to); > + > + if (symlink(from, to) < 0) { > + if (errno == EEXIST) { > + r = readlink_malloc(to, &p); > + if (r < 0) > + return r; > + > + if (!streq(p, from)) { > + return -EINVAL; > + } > + } else > + return -errno; > + } > + > + return 0; > +} > + > int mknod_atomic(const char *path, mode_t mode, dev_t dev) { > _cleanup_free_ char *t = NULL; > int r; > diff --git a/src/shared/util.h b/src/shared/util.h > index 4a67d5c..8565fd6 100644 > --- a/src/shared/util.h > +++ b/src/shared/util.h > @@ -404,6 +404,7 @@ bool machine_name_is_valid(const char *s) _pure_; > > char* strshorten(char *s, size_t l); > > +int symlink_idempotent(const char *from, const char *to); > > int symlink_atomic(const char *from, const char *to); > int mknod_atomic(const char *path, mode_t mode, dev_t dev); > -- > 2.4.0 > > _______________________________________________ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/systemd-devel Lennart -- Lennart Poettering, Red Hat _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel