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

Peter Krempa pkrempa at redhat.com
Thu Sep 26 15:44:40 UTC 2019


On Thu, Sep 26, 2019 at 10:38:11 -0500, Eric Blake wrote:
> 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.

I plan also to split everything snapshot related out so I thought of
getting completely rid of the code sharing here since it's not
significant.


> 
> > +++ 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?

Oops, I didn't notice this one. I'll post it separately probably just to
have a commit to reference.




More information about the libvir-list mailing list