[libvirt] [PATCH 1/5] Implement public API for virDomainGetFSInfo

John Ferlan jferlan at redhat.com
Thu Oct 23 13:16:36 UTC 2014



On 09/30/2014 08:20 PM, Tomoki Sekiyama wrote:
> virDomainGetFSInfo returns a list of filesystems information mounted in the
> guest, which contains mountpoints, device names, filesystem types, and
> device aliases named by libvirt. This will be useful, for example, to
> specify mountpoints to fsfreeze when taking snapshot of a part of disks.
> 
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama at hds.com>
> ---
>  include/libvirt/libvirt.h.in |   21 +++++++++++++
>  src/driver.h                 |    6 ++++
>  src/libvirt.c                |   68 ++++++++++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms      |    6 ++++
>  4 files changed, 101 insertions(+)
> 

Since this is a new API you might need to make some changes in
libvirt-python (as well as others) in order to ensure the API is in each
as well.


> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 5217ab3..c60c3d7 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -5651,6 +5651,27 @@ int virDomainFSThaw(virDomainPtr dom,
>                      unsigned int nmountpoints,
>                      unsigned int flags);
>  
> +/**
> + * virDomainFSInfo:
> + *
> + * The data structure containing mounted file systems within a guset
> + *
> + */
> +typedef struct _virDomainFSInfo virDomainFSInfo;
> +typedef virDomainFSInfo *virDomainFSInfoPtr;
> +struct _virDomainFSInfo {
> +    char *mountpoint; /* path to mount point */
> +    char *name;       /* device name in the guest (e.g. "sda1") */
> +    char *type;       /* filesystem type */
> +    char **devAlias;  /* NULL-terminated array of disk device aliases */
> +};
> +
> +void virDomainFSInfoFree(virDomainFSInfoPtr info);
> +
> +int virDomainGetFSInfo(virDomainPtr dom,
> +                       virDomainFSInfoPtr **info,
> +                       unsigned int flags);
> +
>  int virDomainGetTime(virDomainPtr dom,
>                       long long *seconds,
>                       unsigned int *nseconds,
> diff --git a/src/driver.h b/src/driver.h


FYI: Recent upstream changes will cause you to find a new home for
things in driver.h.  See commit-id 'd21d35e3' - this will now be in
driver-hypervisor.h.

You may want to watch Daniel's series of patches because his patches
will probably modify your libvirt.c changes as well


> index dc62a8e..33e3bd9 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1195,6 +1195,11 @@ typedef int
>                        unsigned int flags);
>  
>  typedef int
> +(*virDrvDomainGetFSInfo)(virDomainPtr dom,
> +                         virDomainFSInfoPtr **info,
> +                         unsigned int flags);
> +
> +typedef int
>  (*virDrvNodeGetFreePages)(virConnectPtr conn,
>                            unsigned int npages,
>                            unsigned int *pages,
> @@ -1445,6 +1450,7 @@ struct _virDriver {
>      virDrvConnectGetDomainCapabilities connectGetDomainCapabilities;
>      virDrvConnectGetAllDomainStats connectGetAllDomainStats;
>      virDrvNodeAllocPages nodeAllocPages;
> +    virDrvDomainGetFSInfo domainGetFSInfo;
>  };
>  
>  
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 245c373..77ec851 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -21200,6 +21200,74 @@ virDomainFSThaw(virDomainPtr dom,
>      return -1;
>  }
>  
> +
> +/**
> + * virDomainGetFSInfo:
> + * @dom: a domain object
> + * @info: a pointer to a variable to store an array of mount points information
> + * @flags: extra flags; not used yet, so callers should always pass 0
> + *
> + * Get a list of mapping informaiton for each mounted file systems within the

s/informaiton/information

> + * specified guest and the disks.
> + *
> + * Returns the number of returned mount points, or -1 and sets @info to
> + * NULL in case of error. On success, the array stored into @info is
> + * guaranteed to have an extra allocated element set to NULL but not included
> + * in the return count, to make iteration easier. The caller is responsible
> + * for calling virDomainFSInfoFree() on each array element, then calling
> + * free() on @info.

NOTE: See comment in patch 3 - I see no reason to allocate an extra
element for @info.  Since you are returning the count of elements,
that's all the caller should access.

> + */
> +int
> +virDomainGetFSInfo(virDomainPtr dom,
> +                   virDomainFSInfoPtr **info,
> +                   unsigned int flags)
> +{
> +    VIR_DOMAIN_DEBUG(dom, "info=%p, flags=%x", info, flags);
> +
> +    virResetLastError();
> +
> +    virCheckDomainReturn(dom, -1);
> +    virCheckReadOnlyGoto(dom->conn->flags, error);

Since it's touched and assumed later on:

    virCheckNonNullArgGoto(info, error);

and since on error you are indicating you guarantee it being NULL on
error, you may as well initialize it

        *info = NULL;

John
> +
> +    if (dom->conn->driver->domainGetFSInfo) {
> +        int ret = dom->conn->driver->domainGetFSInfo(dom, info, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}
> +
> +
> +/**
> + * virDomainFSInfoFree:
> + * @info: pointer to a FSInfo object
> + *
> + * Frees all the memory occupied by @info.
> + */
> +void
> +virDomainFSInfoFree(virDomainFSInfoPtr info)
> +{
> +    char **alias;
> +
> +    if (!info)
> +        return;
> +
> +    VIR_FREE(info->mountpoint);
> +    VIR_FREE(info->name);
> +    VIR_FREE(info->type);
> +
> +    for (alias = info->devAlias; alias && *alias; alias++)
> +        VIR_FREE(*alias);
> +    VIR_FREE(info->devAlias);
> +}
> +
> +
>  /**
>   * virDomainGetTime:
>   * @dom: a domain object
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index 5f95802..f688e76 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -684,4 +684,10 @@ LIBVIRT_1.2.9 {
>          virNodeAllocPages;
>  } LIBVIRT_1.2.8;
>  
> +LIBVIRT_1.2.10 {
> +    global:
> +        virDomainFSInfoFree;
> +        virDomainGetFSInfo;
> +} LIBVIRT_1.2.9;
> +
>  # .... define new API here using predicted next version number ....
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list