[libvirt] [PATCH v2 5/7] qemu: driver: Move checkpoint-related code to qemu_checkpoint.c
Eric Blake
eblake at redhat.com
Thu Sep 26 15:38:11 UTC 2019
On 9/25/19 7:54 AM, 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
s/an/a/
> 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
>
With the double-free fix you posted in the followup,
> +++ b/src/qemu/Makefile.inc.am
> @@ -68,6 +68,8 @@ QEMU_DRIVER_SOURCES = \
> qemu/qemu_vhost_user.h \
> qemu/qemu_vhost_user_gpu.c \
> qemu/qemu_vhost_user_gpu.h \
> + qemu/qemu_checkpoint.c \
> + qemu/qemu_checkpoint.h \
> $(NULL)
Is it worth keeping this list sorted alphabetically?
> +/* Called inside job lock */
> +static int
> +qemuDomainCheckpointPrepare(virQEMUDriverPtr driver, virCapsPtr caps,
Worth splitting these parameters to separate lines? (I know you're just
moving code, and it's my fault they weren't split in my commit...)
> + virDomainObjPtr vm,
> + virDomainCheckpointDefPtr def)
> +{
> +
> +struct virQEMUCheckpointReparent {
> + const char *dir;
> + virDomainMomentObjPtr parent;
> + virDomainObjPtr vm;
> + virCapsPtr caps;
> + virDomainXMLOptionPtr xmlopt;
> + int err;
> +};
> +
> +
> +static int
> +qemuCheckpointReparentChildren(void *payload,
> + const void *name ATTRIBUTE_UNUSED,
> + void *data)
> +{
> + virDomainMomentObjPtr moment = payload;
> + struct virQEMUCheckpointReparent *rep = data;
There's a double space here we could fix.
> +int
> +qemuCheckpointDelete(virDomainObjPtr vm,
> + virDomainCheckpointPtr checkpoint,
> + unsigned int flags)
> +{
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + virQEMUDriverPtr driver = priv->driver;
> + VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver);
> + int ret = -1;
> + virDomainMomentObjPtr chk = NULL;
> + virQEMUMomentRemove rem;
> + struct virQEMUCheckpointReparent rep;
You explained why you unshared virQEMUMomentReparent, but why not
instead move it to be alongside virQEMUMomentRemove, which is still
shared? Yes, I know it's odd that we had two callback structs, split
between two different files declaring those structs, but rather than
duplicating things for snapshot vs. checkpoint, keeping the two shared
structs side-by-side might make more sense.
> +++ b/src/qemu/qemu_driver.c
> static virDomainCheckpointPtr
> qemuDomainCheckpointCreateXML(virDomainPtr domain,
> const char *xmlDesc,
> unsigned int flags)
> {
> - virQEMUDriverPtr driver = domain->conn->privateData;
> virDomainObjPtr vm = NULL;
>
> if (!(vm = qemuDomainObjFromDomain(domain)))
> goto cleanup;
>
> - if (virDomainSnapshotObjListNum(vm->snapshots, NULL, 0) > 0) {
> - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> - _("cannot create checkpoint while snapshot exists"));
> - goto cleanup;
> - }
> -
> - priv = vm->privateData;
> - cfg = virQEMUDriverGetConfig(driver);
> -
> if (virDomainCheckpointCreateXMLEnsureACL(domain->conn, vm->def, flags) < 0)
> goto cleanup;
Didn't you need to fix this separately, for security reasons?
Otherwise, the code motion makes sense.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
More information about the libvir-list
mailing list