[libvirt] [PATCH v2 5/7] qemu: driver: Move checkpoint-related code to qemu_checkpoint.c

Peter Krempa pkrempa at redhat.com
Thu Sep 26 11:15:39 UTC 2019


On Wed, Sep 25, 2019 at 14:54:41 +0200, Peter Krempa wrote:
> Move all extensive functions to a new file so that we don't just pile
> everything in the common files. This obviously isn't possible with
> straight code movement as we still need stubs in qemu_driver.c
> 
> Additionally some functions e.g. for looking up a checkpoint by name
> were so short that moving the impl didn't make sense.
> 
> Note that in the move the new file also doesn't use
> virQEMUMomentReparent but rather an stripped down copy. As I plan to
> split out snapshot code into a separate file the unification doesn't
> make sense any more.
> 
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>  src/qemu/Makefile.inc.am   |   2 +
>  src/qemu/qemu_checkpoint.c | 483 +++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_checkpoint.h |  50 ++++
>  src/qemu/qemu_driver.c     | 382 +----------------------------
>  4 files changed, 540 insertions(+), 377 deletions(-)
>  create mode 100644 src/qemu/qemu_checkpoint.c
>  create mode 100644 src/qemu/qemu_checkpoint.h

[...]

> +virDomainCheckpointPtr
> +qemuCheckpointCreateXML(virDomainPtr domain,
> +                        virDomainObjPtr vm,
> +                        const char *xmlDesc,
> +                        unsigned int flags)
> +{

[...]

> + endjob:
> +    if (checkpoint) {
> +        if (update_current)
> +            virDomainCheckpointSetCurrent(vm->checkpoints, chk);
> +        if (qemuDomainCheckpointWriteMetadata(vm, chk, driver->caps,
> +                                              driver->xmlopt,
> +                                              cfg->checkpointDir) < 0) {
> +            /* if writing of metadata fails, error out rather than trying
> +             * to silently carry on without completing the checkpoint */
> +            virObjectUnref(checkpoint);
> +            checkpoint = NULL;
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("unable to save metadata for checkpoint %s"),
> +                           chk->def->name);
> +            virDomainCheckpointObjListRemove(vm->checkpoints, chk);
> +        } else {
> +            virDomainCheckpointLinkParent(vm->checkpoints, chk);
> +        }
> +    } else if (chk) {
> +        virDomainCheckpointObjListRemove(vm->checkpoints, chk);
> +    }
> +
> +    qemuDomainObjEndJob(driver, vm);
> +
> + cleanup:
> +    virJSONValueFree(actions);
> +    virDomainObjEndAPI(&vm);

This is already called in qemu_driver.c so we'd try to release the
object twice as we don't pass it in via a double pointer.

I've deleted the above line from my private branch.

> +    virObjectUnref(caps);
> +    virObjectUnref(cfg);
> +    return checkpoint;
> +}




More information about the libvir-list mailing list