[libvirt] [PATCHv1.5 18/27] conf: Add functions to copy and free network disk source definitions

Michal Privoznik mprivozn at redhat.com
Wed Nov 27 11:15:18 UTC 2013


On 26.11.2013 17:49, Peter Krempa wrote:
> To simplify operations on virDomainDiskHostDef arrays we will need deep
> copy and freeing functions. Add and properly export them.
> ---
>  src/conf/domain_conf.c   | 55 +++++++++++++++++++++++++++++++++++++++++++++---
>  src/conf/domain_conf.h   |  3 +++
>  src/libvirt_private.syms |  2 ++
>  3 files changed, 57 insertions(+), 3 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 0561d9d..e0d6903 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1216,9 +1216,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def)
>          VIR_FREE(def->seclabels);
>      }
> 
> -    for (i = 0; i < def->nhosts; i++)
> -        virDomainDiskHostDefClear(&def->hosts[i]);
> -    VIR_FREE(def->hosts);
> +    virDomainDiskHostDefFree(def->nhosts, def->hosts);
> 
>      VIR_FREE(def);
>  }
> @@ -1233,6 +1231,57 @@ void virDomainDiskHostDefClear(virDomainDiskHostDefPtr def)
>      VIR_FREE(def->socket);
>  }
> 
> +
> +void
> +virDomainDiskHostDefFree(size_t nhosts,
> +                         virDomainDiskHostDefPtr hosts)
> +{
> +    size_t i;
> +
> +    if (!hosts)
> +        return;
> +
> +    for (i = 0; i < nhosts; i++)
> +        virDomainDiskHostDefClear(&hosts[i]);
> +
> +    VIR_FREE(hosts);
> +}
> +
> +
> +virDomainDiskHostDefPtr
> +virDomainDiskHostDefCopy(size_t nhosts,
> +                         virDomainDiskHostDefPtr hosts)
> +{
> +    virDomainDiskHostDefPtr ret = NULL;
> +    size_t i;
> +
> +    if (VIR_ALLOC_N(ret, nhosts) < 0)
> +        goto error;
> +
> +    for (i = 0; i < nhosts; i++) {
> +        virDomainDiskHostDefPtr src = &hosts[i];
> +        virDomainDiskHostDefPtr dst = &ret[i];
> +
> +        dst->transport = src->transport;
> +
> +        if (VIR_STRDUP(dst->name, src->name) < 0)
> +            goto error;
> +
> +        if (VIR_STRDUP(dst->port, src->port) < 0)
> +            goto error;
> +
> +        if (VIR_STRDUP(dst->socket, src->socket) < 0)
> +            goto error;

Could have been joined into one 'if' with or-ed VIR_STRDUP(). But this
is just fine too.

> +    }
> +
> +    return ret;
> +
> +error:
> +    virDomainDiskHostDefFree(nhosts, ret);
> +    return NULL;
> +}
> +
> +
>  void virDomainControllerDefFree(virDomainControllerDefPtr def)
>  {
>      if (!def)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index e9800a5..ee018f0 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2211,6 +2211,9 @@ void virDomainInputDefFree(virDomainInputDefPtr def);
>  void virDomainDiskDefFree(virDomainDiskDefPtr def);
>  void virDomainLeaseDefFree(virDomainLeaseDefPtr def);
>  void virDomainDiskHostDefClear(virDomainDiskHostDefPtr def);
> +void virDomainDiskHostDefFree(size_t nhosts, virDomainDiskHostDefPtr hosts);
> +virDomainDiskHostDefPtr virDomainDiskHostDefCopy(size_t nhosts,
> +                                                 virDomainDiskHostDefPtr hosts);
>  int virDomainDeviceFindControllerModel(virDomainDefPtr def,
>                                         virDomainDeviceInfoPtr info,
>                                         int controllerType);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index aeb3568..f952a12 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -198,6 +198,8 @@ virDomainDiskFindByBusAndDst;
>  virDomainDiskGeometryTransTypeFromString;
>  virDomainDiskGeometryTransTypeToString;
>  virDomainDiskHostDefClear;
> +virDomainDiskHostDefCopy;
> +virDomainDiskHostDefFree;
>  virDomainDiskIndexByName;
>  virDomainDiskInsert;
>  virDomainDiskInsertPreAlloced;
> 

ACK

Michal




More information about the libvir-list mailing list