[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH 2/8] virDomainBlockPull: Implement the main entry points



On Thu, Jun 09, 2011 at 12:10:08PM -0500, Adam Litke wrote:
> * src/libvirt.c: implement the main entry points
> 
> Signed-off-by: Adam Litke <agl us ibm com>
> ---
>  src/libvirt.c |  252 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 252 insertions(+), 0 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 997d4a2..71afea9 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -14957,3 +14957,255 @@ error:
>      virDispatchError(conn);
>      return -1;
>  }
> +
> +/**
> + * virDomainBlockPull:
> + * @dom: pointer to domain object
> + * @path: Fully-qualified filename of disk
> + * @info: A pointer to a virDomainBlockPullInfo structure, or NULL
> + * @flags: currently unused, for future extension
> + *
> + * Populate a disk image with data from its backing image.  Once all data from
> + * its backing image has been pulled, the disk no longer depends on a backing
> + * image.  This function works incrementally, performing a small amount of work
> + * each time it is called.  When successful, @info is updated with the current
> + * progress.
> + *
> + * Returns -1 in case of failure, 0 when successful.
> + */
> +int virDomainBlockPull(virDomainPtr dom,
> +                       const char *path,
> +                       virDomainBlockPullInfoPtr info,
> +                       unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(dom, "path=%p, info=%p, flags=%u", path, info, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +    conn = dom->conn;
> +
> +    if (dom->conn->flags & VIR_CONNECT_RO) {
> +        virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    if (!path) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("path is NULL"));
> +        goto error;
> +    }
> +
> +    if (flags != 0) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("flags must be zero"));
> +        goto error;
> +    }

We don't want to check 'flags' in this place, because you could be
a client app talking to a libvirt daemon which *does* support some
flag values. Instead just have a 'virCheckFlags(0, -1)' in the
QEMU driver impls. Same comment applies to all the other APIs in
this patch

> +
> +    if (conn->driver->domainBlockPull) {
> +        int ret;
> +        ret = conn->driver->domainBlockPull(dom, path, info, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}
> +
> +/**
> + * virDomainBlockPullAll:
> + * @dom: pointer to domain object
> + * @path: Fully-qualified filename of disk
> + * @flags: currently unused, for future extension
> + *
> + * Populate a disk image with data from its backing image.  Once all data from
> + * its backing image has been pulled, the disk no longer depends on a backing
> + * image.  This function pulls data for the entire device in the background.
> + * Progress of the operation can be checked with virDomainGetBlockPullInfo() and
> + * the operation can be aborted with virDomainBlockPullAbort().  When finished,
> + * an asynchronous event is raised to indicate the final status.
> + *
> + * Returns 0 if the operation has started, -1 on failure.
> + */
> +int virDomainBlockPullAll(virDomainPtr dom,
> +                          const char *path,
> +                          unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(dom, "path=%p, flags=%u", path, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +    conn = dom->conn;
> +
> +    if (dom->conn->flags & VIR_CONNECT_RO) {
> +        virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    if (!path) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("path is NULL"));
> +        goto error;
> +    }
> +
> +    if (flags != 0) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("flags must be zero"));
> +        goto error;
> +    }
> +
> +    if (conn->driver->domainBlockPullAll) {
> +        int ret;
> +        ret = conn->driver->domainBlockPullAll(dom, path, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}
> +
> +/**
> + * virDomainBlockPullAbort:
> + * @dom: pointer to domain object
> + * @path: fully-qualified filename of disk
> + * @flags: currently unused, for future extension
> + *
> + * Cancel a pull operation previously started by virDomainBlockPullAll().
> + *
> + * Returns -1 in case of failure, 0 when successful.
> + */
> +int virDomainBlockPullAbort(virDomainPtr dom,
> +                            const char *path,
> +                            unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(dom, "path=%p, flags=%u", path, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +    conn = dom->conn;
> +
> +    if (dom->conn->flags & VIR_CONNECT_RO) {
> +        virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    if (!path) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("path is NULL"));
> +        goto error;
> +    }
> +
> +    if (flags != 0) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("flags must be zero"));
> +        goto error;
> +    }
> +
> +    if (conn->driver->domainBlockPullAbort) {
> +        int ret;
> +        ret = conn->driver->domainBlockPullAbort(dom, path, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}
> +
> +/**
> + * virDomainGetBlockPullInfo:
> + * @dom: pointer to domain object
> + * @path: fully-qualified filename of disk
> + * @info: pointer to a virDomainBlockPullInfo structure
> + * @flags: currently unused, for future extension
> + *
> + * Request progress information on a block pull operation that has been started
> + * with virDomainBlockPullAll().  If an operation is active for the given
> + * parameters, @info will be updated with the current progress.
> + *
> + * Returns -1 in case of failure, 0 when successful.
> + */
> +int virDomainGetBlockPullInfo(virDomainPtr dom,
> +                              const char *path,
> +                              virDomainBlockPullInfoPtr info,
> +                              unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(dom, "path=%p, info=%p, flags=%u", path, info, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +    conn = dom->conn;
> +
> +    if (!path) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("path is NULL"));
> +        goto error;
> +    }
> +
> +    if (!info) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("info is NULL"));
> +        goto error;
> +    }
> +
> +    if (flags != 0) {
> +        virLibDomainError(VIR_ERR_INVALID_ARG,
> +                           _("flags must be zero"));
> +        goto error;
> +    }
> +
> +    if (conn->driver->domainGetBlockPullInfo) {
> +        int ret;
> +        ret = conn->driver->domainGetBlockPullInfo(dom, path, info, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(dom->conn);
> +    return -1;
> +}


ACK if the bogus flags test is removed.


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 :|


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]