[libvirt] [PATCH 09/11] qemu: blockPull: Refactor the rest of qemuDomainBlockJobImpl

John Ferlan jferlan at redhat.com
Wed Apr 8 17:10:12 UTC 2015



On 04/01/2015 01:20 PM, Peter Krempa wrote:
> Since it now handles only block pull code paths we can refactor it and
> remove tons of cruft.
> ---
>  src/qemu/qemu_driver.c       | 86 ++++++++++++++++++++------------------------
>  src/qemu/qemu_monitor.c      | 30 ++++++++--------
>  src/qemu/qemu_monitor.h      | 17 ++++-----
>  src/qemu/qemu_monitor_json.c | 59 +++++++-----------------------
>  src/qemu/qemu_monitor_json.h | 13 ++++---
>  5 files changed, 78 insertions(+), 127 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 7b7775d..2dd8ed4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -16162,17 +16162,16 @@ qemuDomainBlockPivot(virQEMUDriverPtr driver,
>  /* bandwidth in MiB/s per public API. Caller must lock vm beforehand,
>   * and not access it afterwards.  */
>  static int
> -qemuDomainBlockJobImpl(virDomainObjPtr vm,
> -                       virConnectPtr conn,
> -                       const char *path, const char *base,
> -                       unsigned long bandwidth,
> -                       int mode, unsigned int flags)
> +qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
> +                          virDomainObjPtr vm,
> +                          const char *path,
> +                          const char *base,
> +                          unsigned long bandwidth,
> +                          unsigned int flags)
>  {
> -    virQEMUDriverPtr driver = conn->privateData;
> -    qemuDomainObjPrivatePtr priv;
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
>      char *device = NULL;
> -    int ret = -1;
> -    bool async = false;
> +    bool modern;
>      int idx;
>      virDomainDiskDefPtr disk;
>      virStorageSourcePtr baseSource = NULL;
> @@ -16180,12 +16179,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>      char *basePath = NULL;
>      char *backingPath = NULL;
>      unsigned long long speed = bandwidth;
> -
> -    if (!virDomainObjIsActive(vm)) {
> -        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> -                       _("domain is not running"));
> -        goto cleanup;
> -    }
> +    int ret = -1;
> 
>      if (flags & VIR_DOMAIN_BLOCK_REBASE_RELATIVE && !base) {
>          virReportError(VIR_ERR_INVALID_ARG, "%s",
> @@ -16194,23 +16188,23 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>          goto cleanup;
>      }
> 
> -    priv = vm->privateData;
> -    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC)) {
> -        async = true;
> -    } else if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_SYNC)) {
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                       _("block jobs not supported with this QEMU binary"));
> -        goto cleanup;
> -    } else if (base) {
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                       _("partial block pull not supported with this "
> -                         "QEMU binary"));
> -        goto cleanup;
> -    } else if (mode == BLOCK_JOB_PULL && bandwidth) {
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                       _("setting bandwidth at start of block pull not "
> -                         "supported with this QEMU binary"));
> +    if (qemuDomainSupportsBlockJobs(vm, &modern) < 0)
>          goto cleanup;
> +
> +    if (!modern) {
> +        if (base) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("partial block pull not supported with this "
> +                             "QEMU binary"));
> +            goto cleanup;
> +        }
> +
> +        if (bandwidth) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                           _("setting bandwidth at start of block pull not "
> +                             "supported with this QEMU binary"));
> +            goto cleanup;
> +        }
>      }
> 
>      if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
> @@ -16222,12 +16216,11 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>          goto endjob;
>      }
> 
> -    device = qemuDiskPathToAlias(vm, path, &idx);
> -    if (!device)
> +    if (!(device = qemuDiskPathToAlias(vm, path, &idx)))
>          goto endjob;
>      disk = vm->def->disks[idx];
> 
> -    if (mode == BLOCK_JOB_PULL && qemuDomainDiskBlockJobIsActive(disk))
> +    if (qemuDomainDiskBlockJobIsActive(disk))
>          goto endjob;
> 
>      if (base &&
> @@ -16250,7 +16243,6 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>                                                       &backingPath) < 0)
>                  goto endjob;
> 
> -
>              if (!backingPath) {
>                  virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>                                 _("can't keep relative backing relationship"));
> @@ -16260,8 +16252,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>      }
> 
>      /* Convert bandwidth MiB to bytes, if needed */
> -    if (mode == BLOCK_JOB_PULL &&
> -        !(flags & VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES)) {
> +    if (!(flags & VIR_DOMAIN_BLOCK_PULL_BANDWIDTH_BYTES)) {
>          if (speed > LLONG_MAX >> 20) {
>              virReportError(VIR_ERR_OVERFLOW,
>                             _("bandwidth must be less than %llu"),
> @@ -16276,15 +16267,15 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>          basePath = qemuMonitorDiskNameLookup(priv->mon, device, disk->src,
>                                               baseSource);
>      if (!baseSource || basePath)
> -        ret = qemuMonitorBlockJob(priv->mon, device, basePath, backingPath,
> -                                  speed, mode, async);
> +        ret = qemuMonitorBlockStream(priv->mon, device, basePath, backingPath,
> +                                     speed, modern);

These don't use your new qemuDomainGetMonitor(vm) - not that it really
matters, but since you created it...

>      if (qemuDomainObjExitMonitor(driver, vm) < 0)
>          ret = -1;
> -    if (ret < 0) {
> +
> +    if (ret < 0)
>          goto endjob;
> -    } else if (mode == BLOCK_JOB_PULL) {
> -        disk->blockjob = true;
> -    }
> +
> +    disk->blockjob = true;
> 
>   endjob:
>      qemuDomainObjEndJob(driver, vm);
> @@ -16297,6 +16288,7 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm,
>      return ret;
>  }
> 
> +
>  static int
>  qemuDomainBlockJobAbort(virDomainPtr dom,
>                          const char *path,
> @@ -16778,6 +16770,7 @@ static int
>  qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
>                        unsigned long bandwidth, unsigned int flags)
>  {
> +    virQEMUDriverPtr driver = dom->conn->privateData;
>      virDomainObjPtr vm;
>      int ret = -1;
>      unsigned long long speed = bandwidth;
> @@ -16800,8 +16793,7 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base,
>      /* For normal rebase (enhanced blockpull), the common code handles
>       * everything, including vm cleanup. */
>      if (!(flags & VIR_DOMAIN_BLOCK_REBASE_COPY))
> -        return qemuDomainBlockJobImpl(vm, dom->conn, path, base, bandwidth,
> -                                      BLOCK_JOB_PULL, flags);
> +        return qemuDomainBlockPullCommon(driver, vm, path, base, bandwidth, flags);
> 
>      /* If we got here, we are doing a block copy rebase. */
>      if (VIR_ALLOC(dest) < 0)
> @@ -16934,8 +16926,8 @@ qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth,
>          return -1;
>      }
> 
> -    return qemuDomainBlockJobImpl(vm, dom->conn, path, NULL, bandwidth,
> -                                  BLOCK_JOB_PULL, flags);
> +    return qemuDomainBlockPullCommon(dom->conn->privateData,
> +                                     vm, path, NULL, bandwidth, flags);
>  }
> 
> 
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index e413d91..4791029 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -3577,28 +3577,26 @@ int qemuMonitorScreendump(qemuMonitorPtr mon,
> 
>  /* bandwidth is in bytes/sec */
>  int
> -qemuMonitorBlockJob(qemuMonitorPtr mon,
> -                    const char *device,
> -                    const char *base,
> -                    const char *backingName,
> -                    unsigned long long bandwidth,
> -                    qemuMonitorBlockJobCmd mode,
> -                    bool modern)
> +qemuMonitorBlockStream(qemuMonitorPtr mon,
> +                       const char *device,
> +                       const char *base,
> +                       const char *backingName,
> +                       unsigned long long bandwidth,
> +                       bool modern)
>  {
> -    int ret = -1;
> -
>      VIR_DEBUG("mon=%p, device=%s, base=%s, backingName=%s, bandwidth=%lluB, "
> -              "mode=%o, modern=%d",
> +              "modern=%d",
>                mon, device, NULLSTR(base), NULLSTR(backingName),
> -              bandwidth, mode, modern);
> +              bandwidth, modern);
> 
> -    if (mon->json)
> -        ret = qemuMonitorJSONBlockJob(mon, device, base, backingName,
> -                                      bandwidth, mode, modern);
> -    else
> +    if (!mon->json) {
>          virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>                         _("block jobs require JSON monitor"));
> -    return ret;
> +        return -1;
> +    }
> +
> +    return qemuMonitorJSONBlockStream(mon, device, base, backingName,
> +                                      bandwidth, modern);
>  }
> 
> 
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 5cc811a..d673154 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -755,17 +755,12 @@ int qemuMonitorSendKey(qemuMonitorPtr mon,
>                         unsigned int *keycodes,
>                         unsigned int nkeycodes);
> 
> -typedef enum {
> -    BLOCK_JOB_PULL,
> -} qemuMonitorBlockJobCmd;
> -
> -int qemuMonitorBlockJob(qemuMonitorPtr mon,
> -                        const char *device,
> -                        const char *base,
> -                        const char *backingName,
> -                        unsigned long long bandwidth,
> -                        qemuMonitorBlockJobCmd mode,
> -                        bool modern)
> +int qemuMonitorBlockStream(qemuMonitorPtr mon,
> +                           const char *device,
> +                           const char *base,
> +                           const char *backingName,
> +                           unsigned long long bandwidth,
> +                           bool modern)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> 
>  int qemuMonitorBlockJobCancel(qemuMonitorPtr mon,
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 01a4f9a..d02567d 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -4286,57 +4286,24 @@ qemuMonitorJSONBlockJobError(virJSONValuePtr reply,
> 
>  /* speed is in bytes/sec */
>  int
> -qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
> -                        const char *device,
> -                        const char *base,
> -                        const char *backingName,
> -                        unsigned long long speed,
> -                        qemuMonitorBlockJobCmd mode,
> -                        bool modern)
> +qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
> +                           const char *device,
> +                           const char *base,
> +                           const char *backingName,
> +                           unsigned long long speed,
> +                           bool modern)
>  {
>      int ret = -1;
>      virJSONValuePtr cmd = NULL;
>      virJSONValuePtr reply = NULL;
> -    const char *cmd_name = NULL;
> -
> -    if (base && (mode != BLOCK_JOB_PULL || !modern)) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("only modern block pull supports base: %s"), base);
> -        return -1;
> -    }

Just checking...

This change is essentially the same as in qemuDomainBlockPullCommon
where if (!modern) {} was added right?

> -
> -    if (backingName && mode != BLOCK_JOB_PULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("backing name is supported only for block pull"));
> -        return -1;
> -    }

And this won't be necessary.... since we no longer have multiple
(ab)users of the same API

> -
> -    if (backingName && !base) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                       _("backing name requires a base image"));
> -        return -1;
> -    }

Is there a check for this somewhere that I missed?

> +    const char *cmd_name = modern ? "block-stream" : "block_stream";
> 
> -    if (speed && mode == BLOCK_JOB_PULL && !modern) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("only modern block pull supports speed: %llu"),
> -                       speed);
> -        return -1;
> -    }

And this is the second half of the check in qemuDomainBlockPullCommon

ACK - in general - Just want to make sure the "if (backingName && !base)
wasn't erroneously removed.

John
> -
> -    switch (mode) {
> -    case BLOCK_JOB_PULL:
> -        cmd_name = modern ? "block-stream" : "block_stream";
> -        cmd = qemuMonitorJSONMakeCommand(cmd_name,
> -                                         "s:device", device,
> -                                         "Y:speed", speed,
> -                                         "S:base", base,
> -                                         "S:backing-file", backingName,
> -                                         NULL);
> -        break;
> -    }
> -
> -    if (!cmd)
> +    if (!(cmd = qemuMonitorJSONMakeCommand(cmd_name,
> +                                           "s:device", device,
> +                                           "Y:speed", speed,
> +                                           "S:base", base,
> +                                           "S:backing-file", backingName,
> +                                           NULL)))
>          return -1;
> 
>      if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
> diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
> index c88972c..43adc90 100644
> --- a/src/qemu/qemu_monitor_json.h
> +++ b/src/qemu/qemu_monitor_json.h
> @@ -297,13 +297,12 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
>  int qemuMonitorJSONScreendump(qemuMonitorPtr mon,
>                                const char *file);
> 
> -int qemuMonitorJSONBlockJob(qemuMonitorPtr mon,
> -                            const char *device,
> -                            const char *base,
> -                            const char *backingName,
> -                            unsigned long long speed,
> -                            qemuMonitorBlockJobCmd mode,
> -                            bool modern)
> +int qemuMonitorJSONBlockStream(qemuMonitorPtr mon,
> +                               const char *device,
> +                               const char *base,
> +                               const char *backingName,
> +                               unsigned long long speed,
> +                               bool modern)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> 
>  int qemuMonitorJSONBlockJobCancel(qemuMonitorPtr mon,
> 




More information about the libvir-list mailing list