[libvirt] [PATCH v3 09/16] Cleanup if creating cgroup directories fails

Michal Privoznik mprivozn at redhat.com
Thu Apr 11 10:02:18 UTC 2013


On 10.04.2013 12:08, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Currently if virCgroupMakeGroup fails, we can get in a situation
> where some controllers have been setup, but others not. Ensure
> we call virCgroupRemove to remove what we've done upon failure
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/util/vircgroup.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> index d3c43a2..bcc61a8 100644
> --- a/src/util/vircgroup.c
> +++ b/src/util/vircgroup.c
> @@ -1081,8 +1081,10 @@ int virCgroupNewDriver(const char *name,
>      rc = virCgroupNew(name, rootgrp, -1, group);
>      if (rc == 0) {
>          rc = virCgroupMakeGroup(rootgrp, *group, create, VIR_CGROUP_NONE);
> -        if (rc != 0)
> +        if (rc != 0) {
> +            virCgroupRemove(*group);
>              virCgroupFree(group);
> +        }
>      }
>  out:
>      virCgroupFree(&rootgrp);
> @@ -1154,8 +1156,10 @@ int virCgroupNewDomain(virCgroupPtr driver,
>           * cumulative usage that we don't need.
>           */
>          rc = virCgroupMakeGroup(driver, *group, create, VIR_CGROUP_MEM_HIERACHY);
> -        if (rc != 0)
> +        if (rc != 0) {
> +            virCgroupRemove(*group);
>              virCgroupFree(group);
> +        }
>      }
>  
>      return rc;
> @@ -1201,8 +1205,10 @@ int virCgroupNewVcpu(virCgroupPtr domain,
>  
>      if (rc == 0) {
>          rc = virCgroupMakeGroup(domain, *group, create, VIR_CGROUP_NONE);
> -        if (rc != 0)
> +        if (rc != 0) {
> +            virCgroupRemove(*group);
>              virCgroupFree(group);
> +        }
>      }
>  
>      return rc;
> @@ -1241,8 +1247,10 @@ int virCgroupNewEmulator(virCgroupPtr domain,
>  
>      if (rc == 0) {
>          rc = virCgroupMakeGroup(domain, *group, create, VIR_CGROUP_NONE);
> -        if (rc != 0)
> +        if (rc != 0) {
> +            virCgroupRemove(*group);
>              virCgroupFree(group);
> +        }
>      }
>  
>      return rc;
> 

Funny, shouldn't we make virCgroupMakeGroup() to cleanup on failure?
But I can live with this version as well.

Michal




More information about the libvir-list mailing list