[libvirt] [PATCH 1/4] Introduce virDomainFSTrim() public API

Daniel P. Berrange berrange at redhat.com
Tue Nov 20 18:57:50 UTC 2012


On Tue, Nov 20, 2012 at 07:47:35PM +0100, Michal Privoznik wrote:
> This will call FITRIM within guest. The API has 4 arguments,
> however, only 2 will be used for now (@dom and @minumum).
> The rest two are there if in future qemu guest agent learns them.
> ---
>  include/libvirt/libvirt.h.in |    4 +++
>  src/driver.h                 |    6 +++++
>  src/libvirt.c                |   50 ++++++++++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms      |    5 ++++
>  4 files changed, 65 insertions(+), 0 deletions(-)
> 
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 49a361a..b161bce 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -4438,6 +4438,10 @@ int virDomainOpenGraphics(virDomainPtr dom,
>  
>  int virDomainInjectNMI(virDomainPtr domain, unsigned int flags);
>  
> +int virDomainFSTrim(virDomainPtr dom,
> +                    const char *mountPoint,
> +                    unsigned long long minimum,
> +                    unsigned int flags);
>  
>  /**
>   * virSchedParameterType:
> diff --git a/src/driver.h b/src/driver.h
> index 7ba66ad..5163840 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -903,6 +903,11 @@ typedef int
>                             unsigned char **cpumap,
>                             unsigned int *online,
>                             unsigned int flags);
> +typedef int
> +    (*virDrvDomainFSTrim)(virDomainPtr dom,
> +                          const char *mountPoint,
> +                          unsigned long long minimum,
> +                          unsigned int flags);
>  
>  /**
>   * _virDriver:
> @@ -1094,6 +1099,7 @@ struct _virDriver {
>      virDrvNodeGetMemoryParameters       nodeGetMemoryParameters;
>      virDrvNodeSetMemoryParameters       nodeSetMemoryParameters;
>      virDrvNodeGetCPUMap                 nodeGetCPUMap;
> +    virDrvDomainFSTrim                  domainFSTrim;
>  };
>  
>  typedef int
> diff --git a/src/libvirt.c b/src/libvirt.c
> index bdb1dc6..1c6863f 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -20164,3 +20164,53 @@ error:
>      virDispatchError(conn);
>      return -1;
>  }
> +
> +/**
> + * virDomainFSTrim:
> + * @dom: a domain object
> + * @mountPoint: which mount point trim
> + * @minimum: Minimum contiguous free range to discard in bytes
> + * @flags: extra flags, not used yet, so callers should always pass 0
> + *
> + * Calls FITRIM within the guest (hence guest agent may be
> + * required depending on hypervisor used). Either call it on each
> + * mounted filesystem (@mountPoint is NULL) or just on specified
> + * @mountPoint. @minimum tell that free ranges smaller than this
> + * may be ignored (this is a hint and the guest may not respect
> + * it).  By increasing this value, the fstrim operation will
> + * complete more quickly for filesystems with badly fragmented
> + * free space, although not all blocks will be discarded.
> + *
> + * Returns 0 on success, -1 otherwise.
> + */
> +int
> +virDomainFSTrim(virDomainPtr dom,
> +                const char *mountPoint,
> +                unsigned long long minimum,
> +                unsigned int flags)
> +{
> +    VIR_DOMAIN_DEBUG(dom, "mountPoint=%s, minimum=%llu, flags=%x",
> +                     mountPoint, minimum, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_DOMAIN(dom)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }

You're missing the check for read-only connections

> +
> +    if (dom->conn->driver->domainFSTrim) {
> +        int ret = dom->conn->driver->domainFSTrim(dom, mountPoint,
> +                                                  minimum, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list