[libvirt] [PATCH v3 14/16] Track symlinks for co-mounted cgroup controllers
Michal Privoznik
mprivozn at redhat.com
Thu Apr 11 10:03:07 UTC 2013
On 10.04.2013 12:08, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> If a cgroup controller is co-mounted with another, eg
>
> /sys/fs/cgroup/cpu,cpuacct
>
> Then it is a requirement that there exist symlinks at
>
> /sys/fs/cgroup/cpu
> /sys/fs/cgroup/cpuacct
>
> pointing to the real mount point. Add support to virCgroupPtr
> to detect and track these symlinks
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/util/vircgroup.c | 56 ++++++++++++++++++++++++++++++++++++++++++----
> src/util/vircgrouppriv.h | 5 +++++
> tests/vircgroupmock.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++
> tests/vircgrouptest.c | 36 +++++++++++++++++++++++-------
> 4 files changed, 143 insertions(+), 12 deletions(-)
>
> diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> index 6202614..14af16e 100644
> --- a/src/util/vircgroup.c
> +++ b/src/util/vircgroup.c
> @@ -157,9 +166,46 @@ static int virCgroupDetectMounts(virCgroupPtr group)
> * first entry only
> */
> if (typelen == len && STREQLEN(typestr, tmp, len) &&
> - !group->controllers[i].mountPoint &&
> - !(group->controllers[i].mountPoint = strdup(entry.mnt_dir)))
> - goto no_memory;
> + !group->controllers[i].mountPoint) {
> + char *linksrc;
> + struct stat sb;
> + char *tmp2;
> +
> + if (!(group->controllers[i].mountPoint = strdup(entry.mnt_dir)))
> + goto no_memory;
> +
> + tmp2 = strrchr(entry.mnt_dir, '/');
> + if (!tmp2) {
> + errno = EINVAL;
> + goto error;
> + }
> + *tmp2 = '\0';
> + /* If it is a co-mount it has a filename like "cpu,cpuacct"
> + * and we must identify the symlink path */
> + if (strchr(tmp2 + 1, ',')) {
> + if (virAsprintf(&linksrc, "%s/%s",
> + entry.mnt_dir, typestr) < 0)
> + goto no_memory;
> + *tmp2 = '/';
> +
> + if (lstat(linksrc, &sb) < 0) {
> + if (errno == ENOENT) {
> + VIR_WARN("Controller %s co-mounted at %s is missing symlink at %s",
> + typestr, entry.mnt_dir, linksrc);
> + VIR_FREE(linksrc);
> + } else {
> + goto error;
> + }
> + } else {
> + if (!S_ISLNK(sb.st_mode)) {
> + VIR_WARN("Expecting a symlink at %s for controller %s",
> + linksrc, typestr);
> + } else {
> + group->controllers[i].linkPoint = linksrc;
> + }
> + }
> + }
> + }
> tmp = next;
> }
> }
> @@ -170,8 +216,10 @@ static int virCgroupDetectMounts(virCgroupPtr group)
> return 0;
>
> no_memory:
> + errno = ENOENT;
Any reason for not returning ENOMEM here? I don't see any.
> +error:
> VIR_FORCE_FCLOSE(mounts);
> - return -ENOMEM;
> + return -errno;
> }
>
ACK if errno fixed.
Michal
More information about the libvir-list
mailing list