[libvirt] [PATCH v3 04/13] Merge virDomainObjListIsDuplicate into virDomainObjListAdd
Jiri Denemark
jdenemar at redhat.com
Tue Feb 5 17:35:33 UTC 2013
On Tue, Feb 05, 2013 at 14:48:01 +0000, Daniel P. Berrange wrote:
> On Mon, Feb 04, 2013 at 04:58:25PM +0100, Jiri Denemark wrote:
> > On Fri, Feb 01, 2013 at 11:18:26 +0000, Daniel P. Berrange wrote:
> > > From: "Daniel P. Berrange" <berrange at redhat.com>
> > >
> > > The duplicate VM checking should be done atomically with
> > > virDomainObjListAdd, so shoud not be a separate function.
> > > Instead just use flags to indicate what kind of checks are
> > > required.
> > >
> > ...
> > > This pair, used in virDomainDefinXML:
> > > @@ -12623,7 +12601,10 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
> > >
> > > if (!(vm = virDomainObjListAdd(driver->domains,
> > > driver->caps,
> > > - def, false)))
> > > + def,
> > > + VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
> > > + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
> > > + NULL)))
> >
> > Although this could be correct, it doesn't match current code. To match
> > it, you'd need to use just VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE flag.
>
> Yep, I believe this new code is correct
>
> >
> > Looking forward to v2 :-)
>
> Here is the diff from v1 to v2
>
> Daniel
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 1771668..06dbe1f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1853,21 +1853,33 @@ error:
>
> void virDomainObjAssignDef(virDomainObjPtr domain,
> const virDomainDefPtr def,
> - bool live)
> + bool live,
> + virDomainDefPtr *oldDef)
> {
> - if (!virDomainObjIsActive(domain)) {
> + *oldDef = NULL;
Oops, oldDef is optional; the above should be
+ if (oldDef)
+ *oldDef = NULL;
> + if (virDomainObjIsActive(domain)) {
> + if (oldDef)
> + *oldDef = domain->newDef;
> + else
> + virDomainDefFree(domain->newDef);
> + domain->newDef = def;
> + } else {
> if (live) {
> - /* save current configuration to be restored on domain shutdown */
> - if (!domain->newDef)
> - domain->newDef = domain->def;
> + if (domain->def) {
This test is not really needed since if both def and newDef are NULL,
newDef = def does nothing and if def is NULL but newDef is not,
virDomainFree should be able to handle NULL argument. Anyway, it's not a
big deal, just that the diff could have been smaller :-)
> + /* save current configuration to be restored on domain shutdown */
> + if (!domain->newDef)
> + domain->newDef = domain->def;
> + else
> + virDomainDefFree(domain->def);
> + }
> domain->def = def;
> } else {
...
ACK to the original patch with these changes (after fixing the possible
NULL dereference) squashed in.
Jirka
More information about the libvir-list
mailing list