[libvirt] [PATCH 3/3] block rebase: initial qemu implementation

Laine Stump laine at laine.org
Wed Feb 1 19:53:13 UTC 2012


On 02/01/2012 12:06 AM, Eric Blake wrote:
> This is a trivial implementation, which works with the current
> released qemu 1.0 with backports of preliminary block pull but
> no partial rebase.  Future patches will update the monitor handling
> to support an optional parameter for partial rebase; but as qemu
> 1.1 is unreleased, it can be in later patches, designed to be
> backported on top of the supported API.
>
> * src/qemu/qemu_driver.c (qemuDomainBlockJobImpl): Add parameter,
> and adjust callers.  Drop redundant check.
> (qemuDomainBlockPull): Move guts...
> (qemuDomainBlockRebase): ...to new function.
> ---
>   src/qemu/qemu_driver.c |   40 ++++++++++++++++++++++++++--------------
>   1 files changed, 26 insertions(+), 14 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 1b147a9..beb6e71 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11308,7 +11308,7 @@ cleanup:
>   }
>
>   static int
> -qemuDomainBlockJobImpl(virDomainPtr dom, const char *path,
> +qemuDomainBlockJobImpl(virDomainPtr dom, const char *path, const char *base,
>                          unsigned long bandwidth, virDomainBlockJobInfoPtr info,
>                          int mode)
>   {
> @@ -11328,16 +11328,18 @@ qemuDomainBlockJobImpl(virDomainPtr dom, const char *path,
>           goto cleanup;
>       }
>
> -    if (!virDomainObjIsActive(vm)) {
> -        qemuReportError(VIR_ERR_OPERATION_INVALID,
> -                        "%s", _("domain is not running"));
> -        goto cleanup;
> -    }
> -

For all the existing virDomainBlockxxx() APIs I think this is a change 
in behavior, right? THey used to fial for inactive domains, and now they 
may succeed. Could this create any problems?

If not, then ACK. This is all pretty mechanical.

>       device = qemuDiskPathToAlias(vm, path);
>       if (!device) {
>           goto cleanup;
>       }
> +    /* XXX - add a qemu capability check; if qemu 1.1 or newer, then
> +     *  validate and convert non-NULL base into something that can
> +     * be passed as optional base argument.  */
> +    if (base)  {
> +        qemuReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> +                        _("partial block pull is not supported with this QEMU binary"));
> +        goto cleanup;
> +    }

So the API is in, and the actual functionality missing until qemu that 
supports it is available.


>
>       if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY)<  0)
>           goto cleanup;
> @@ -11371,7 +11373,7 @@ static int
>   qemuDomainBlockJobAbort(virDomainPtr dom, const char *path, unsigned int flags)
>   {
>       virCheckFlags(0, -1);
> -    return qemuDomainBlockJobImpl(dom, path, 0, NULL, BLOCK_JOB_ABORT);
> +    return qemuDomainBlockJobImpl(dom, path, NULL, 0, NULL, BLOCK_JOB_ABORT);
>   }
>
>   static int
> @@ -11379,7 +11381,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom, const char *path,
>                              virDomainBlockJobInfoPtr info, unsigned int flags)
>   {
>       virCheckFlags(0, -1);
> -    return qemuDomainBlockJobImpl(dom, path, 0, info, BLOCK_JOB_INFO);
> +    return qemuDomainBlockJobImpl(dom, path, NULL, 0, info, BLOCK_JOB_INFO);
>   }
>
>   static int
> @@ -11387,24 +11389,33 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom, const char *path,
>                              unsigned long bandwidth, unsigned int flags)
>   {
>       virCheckFlags(0, -1);
> -    return qemuDomainBlockJobImpl(dom, path, bandwidth, NULL, BLOCK_JOB_SPEED);
> +    return qemuDomainBlockJobImpl(dom, path, NULL, bandwidth, NULL,
> +                                  BLOCK_JOB_SPEED);
>   }
>
>   static int
> -qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth,
> -                    unsigned int flags)
> +qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
> +                      unsigned long bandwidth, unsigned int flags)
>   {
>       int ret;
>
>       virCheckFlags(0, -1);
> -    ret = qemuDomainBlockJobImpl(dom, path, bandwidth, NULL, BLOCK_JOB_PULL);
> +    ret = qemuDomainBlockJobImpl(dom, path, base, bandwidth, NULL,
> +                                 BLOCK_JOB_PULL);
>       if (ret == 0&&  bandwidth != 0)
> -        ret = qemuDomainBlockJobImpl(dom, path, bandwidth, NULL,
> +        ret = qemuDomainBlockJobImpl(dom, path, NULL, bandwidth, NULL,
>                                        BLOCK_JOB_SPEED);
>       return ret;
>   }
>
>   static int
> +qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth,
> +                    unsigned int flags)
> +{
> +    return qemuDomainBlockRebase(dom, path, NULL, bandwidth, flags);
> +}
> +
> +static int
>   qemuDomainOpenGraphics(virDomainPtr dom,
>                          unsigned int idx,
>                          int fd,
> @@ -11885,6 +11896,7 @@ static virDriver qemuDriver = {
>       .domainGetBlockJobInfo = qemuDomainGetBlockJobInfo, /* 0.9.4 */
>       .domainBlockJobSetSpeed = qemuDomainBlockJobSetSpeed, /* 0.9.4 */
>       .domainBlockPull = qemuDomainBlockPull, /* 0.9.4 */
> +    .domainBlockRebase = qemuDomainBlockRebase, /* 0.9.10 */
>       .isAlive = qemuIsAlive, /* 0.9.8 */
>       .nodeSuspendForDuration = nodeSuspendForDuration, /* 0.9.8 */
>       .domainSetBlockIoTune = qemuDomainSetBlockIoTune, /* 0.9.8 */




More information about the libvir-list mailing list