[libvirt] [PATCH 05/17] vircgroup: Extract file link resolving into separate function

Michal Privoznik mprivozn at redhat.com
Fri Aug 10 08:44:40 UTC 2018


On 08/09/2018 03:44 PM, Pavel Hrdina wrote:
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
>  src/util/vircgroup.c | 85 +++++++++++++++++++++++++-------------------
>  1 file changed, 48 insertions(+), 37 deletions(-)
> 
> diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> index 5144b33d43..fd58ba154f 100644
> --- a/src/util/vircgroup.c
> +++ b/src/util/vircgroup.c
> @@ -356,6 +356,51 @@ virCgroupCopyMounts(virCgroupPtr group,
>  }
>  
>  
> +static int
> +virCgroupResolveMountLink(const char *mntDir,

@mntDir shouldn't be const char. You're changing it in the function,
even though not directly rather than via @dirName.

> +                          const char *typeStr,
> +                          virCgroupControllerPtr controller)
> +{
> +    VIR_AUTOFREE(char *) linkSrc = NULL;
> +    char *dirName;
> +    struct stat sb;
> +
> +    dirName = strrchr(mntDir, '/');
> +    if (!dirName) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Missing '/' separator in cgroup mount '%s'"), mntDir);
> +        return -1;
> +    }
> +
> +    if (!strchr(dirName + 1, ','))
> +        return 0;
> +
> +    *dirName = '\0';
> +    if (virAsprintf(&linkSrc, "%s/%s", mntDir, typeStr) < 0)
> +        return -1;
> +    *dirName = '/';

Pre-existing and probably doesn't matter, but if above virAsprintf()
fails, @dirName is not written back and thus @mntDir is left mangled.

> +
> +    if (lstat(linkSrc, &sb) < 0) {
> +        if (errno == ENOENT) {
> +            VIR_WARN("Controller %s co-mounted at %s is missing symlink at %s",
> +                     typeStr, mntDir, linkSrc);
> +        } else {
> +            virReportSystemError(errno, _("Cannot stat %s"), linkSrc);
> +            return -1;
> +        }
> +    } else {
> +        if (!S_ISLNK(sb.st_mode)) {
> +            VIR_WARN("Expecting a symlink at %s for controller %s",
> +                     linkSrc, typeStr);
> +        } else {
> +            VIR_STEAL_PTR(controller->linkPoint, linkSrc);
> +        }
> +    }
> +
> +    return 0;
> +}


Michal




More information about the libvir-list mailing list