[libvirt] [PATCH 2/3] qemu: Refactor qemuDomainSnapshotCreateXML

Daniel P. Berrange berrange at redhat.com
Thu Mar 3 14:58:49 UTC 2011


On Fri, Feb 25, 2011 at 07:04:10PM +0100, Jiri Denemark wrote:
> ---
>  src/qemu/qemu_driver.c |  125 +++++++++++++++++++++++++++++------------------
>  1 files changed, 77 insertions(+), 48 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 7fc08e8..ba046d7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5987,6 +5987,81 @@ static int qemuDomainSnapshotIsAllowed(virDomainObjPtr vm)
>      return 1;
>  }
>  
> +/* The domain is expected to be locked and inactive. */
> +static int
> +qemuDomainSnapshotCreateInactive(virDomainObjPtr vm,
> +                                 virDomainSnapshotObjPtr snap)
> +{
> +    const char *qemuimgarg[] = { NULL, "snapshot", "-c", NULL, NULL, NULL };
> +    int ret = -1;
> +    int i;
> +
> +    qemuimgarg[0] = qemuFindQemuImgBinary();
> +    if (qemuimgarg[0] == NULL) {
> +        /* qemuFindQemuImgBinary set the error */
> +        goto cleanup;
> +    }
> +
> +    qemuimgarg[3] = snap->def->name;
> +
> +    for (i = 0; i < vm->def->ndisks; i++) {
> +        /* FIXME: we also need to handle LVM here */
> +        /* FIXME: if we fail halfway through this loop, we are in an
> +         * inconsistent state.  I'm not quite sure what to do about that
> +         */
> +        if (vm->def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> +            if (!vm->def->disks[i]->driverType ||
> +                STRNEQ(vm->def->disks[i]->driverType, "qcow2")) {
> +                qemuReportError(VIR_ERR_OPERATION_INVALID,
> +                                _("Disk device '%s' does not support"
> +                                  " snapshotting"),
> +                                vm->def->disks[i]->info.alias);
> +                goto cleanup;
> +            }
> +
> +            qemuimgarg[4] = vm->def->disks[i]->src;
> +
> +            if (virRun(qemuimgarg, NULL) < 0) {
> +                virReportSystemError(errno,
> +                                     _("Failed to run '%s' to create snapshot"
> +                                       " '%s' from disk '%s'"),
> +                                     qemuimgarg[0], snap->def->name,
> +                                     vm->def->disks[i]->src);
> +                goto cleanup;
> +            }
> +        }
> +    }
> +
> +    ret = 0;
> +
> +cleanup:
> +    VIR_FREE(qemuimgarg[0]);
> +    return ret;
> +}
> +
> +/* The domain is expected to be locked and active. */
> +static int
> +qemuDomainSnapshotCreateActive(struct qemud_driver *driver,
> +                               virDomainObjPtr *vmptr,
> +                               virDomainSnapshotObjPtr snap)
> +{
> +    virDomainObjPtr vm = *vmptr;
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    int ret;
> +
> +    if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
> +        return -1;
> +
> +    qemuDomainObjEnterMonitorWithDriver(driver, vm);
> +    ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name);
> +    qemuDomainObjExitMonitorWithDriver(driver, vm);
> +
> +    if (qemuDomainObjEndJob(vm) == 0)
> +        *vmptr = NULL;
> +
> +    return ret;
> +}
> +
>  static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
>                                                          const char *xmlDesc,
>                                                          unsigned int flags)
> @@ -5997,8 +6072,6 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
>      virDomainSnapshotPtr snapshot = NULL;
>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>      virDomainSnapshotDefPtr def;
> -    const char *qemuimgarg[] = { NULL, "snapshot", "-c", NULL, NULL, NULL };
> -    int i;
>  
>      virCheckFlags(0, NULL);
>  
> @@ -6029,54 +6102,11 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
>  
>      /* actually do the snapshot */
>      if (!virDomainObjIsActive(vm)) {
> -        qemuimgarg[0] = qemuFindQemuImgBinary();
> -        if (qemuimgarg[0] == NULL)
> -            /* qemuFindQemuImgBinary set the error */
> +        if (qemuDomainSnapshotCreateInactive(vm, snap) < 0)
>              goto cleanup;
> -
> -        qemuimgarg[3] = snap->def->name;
> -
> -        for (i = 0; i < vm->def->ndisks; i++) {
> -            /* FIXME: we also need to handle LVM here */
> -            /* FIXME: if we fail halfway through this loop, we are in an
> -             * inconsistent state.  I'm not quite sure what to do about that
> -             */
> -            if (vm->def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> -                if (!vm->def->disks[i]->driverType ||
> -                    STRNEQ(vm->def->disks[i]->driverType, "qcow2")) {
> -                    qemuReportError(VIR_ERR_OPERATION_INVALID,
> -                                    _("Disk device '%s' does not support snapshotting"),
> -                                    vm->def->disks[i]->info.alias);
> -                    goto cleanup;
> -                }
> -
> -                qemuimgarg[4] = vm->def->disks[i]->src;
> -
> -                if (virRun(qemuimgarg, NULL) < 0) {
> -                    virReportSystemError(errno,
> -                                         _("Failed to run '%s' to create snapshot '%s' from disk '%s'"),
> -                                         qemuimgarg[0], snap->def->name,
> -                                         vm->def->disks[i]->src);
> -                    goto cleanup;
> -                }
> -            }
> -        }
>      }
>      else {
> -        qemuDomainObjPrivatePtr priv;
> -        int ret;
> -
> -        if (qemuDomainObjBeginJobWithDriver(driver, vm) < 0)
> -            goto cleanup;
> -        priv = vm->privateData;
> -        qemuDomainObjEnterMonitorWithDriver(driver, vm);
> -        ret = qemuMonitorCreateSnapshot(priv->mon, def->name);
> -        qemuDomainObjExitMonitorWithDriver(driver, vm);
> -        if (qemuDomainObjEndJob(vm) == 0) {
> -            vm = NULL;
> -            goto cleanup;
> -        }
> -        if (ret < 0)
> +        if (qemuDomainSnapshotCreateActive(driver, &vm, snap) < 0)
>              goto cleanup;
>      }
>  
> @@ -6106,7 +6136,6 @@ static virDomainSnapshotPtr qemuDomainSnapshotCreateXML(virDomainPtr domain,
>      snapshot = virGetDomainSnapshot(domain, snap->def->name);
>  
>  cleanup:
> -    VIR_FREE(qemuimgarg[0]);
>      if (vm)
>          virDomainObjUnlock(vm);
>      qemuDriverUnlock(driver);

ACK

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