[libvirt] [PATCH 2/2] bhyve: domainCreateXML
Wojciech Macek
wma at semihalf.com
Tue Apr 8 08:56:31 UTC 2014
Sure, I will split it into two separate commits. I must have messed up sth
in commits, since even in head-email I described 3 patches...
Regarding NULL, it is a little tricky. After running
virDomainObjListRemove, the vm pointer has 0 references. Then, running
virObjectUnlock causes libvirt segfault. To minimize changes, I used the
solution from qemu: set vm to null and then check it inside cleanup. The
"if (vm)" is just aesthetic - without it there was an awful warning on the
console about null-pointer. I'd like to leave it as is, or remove
"vm=NULL;" and insert virObjectRef/virObjectUnref pair instead.
What do you mean by ACL check? Do you think the check is unnecessary, or
just should be placed earlier?
W.
2014-04-08 9:01 GMT+02:00 Roman Bogorodskiy <bogorodskiy at gmail.com>:
> Wojciech Macek wrote:
>
> > Implement bhyveDomainCreteXML function.
>
> s/Crete/Create/
>
> > src/bhyve/bhyve_driver.c | 81
> +++++++++++++++++++++++++++++++++++++++++++++++-
> > 1 file changed, 80 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
> > index f7a8912..2ea2d22 100644
> > --- a/src/bhyve/bhyve_driver.c
> > +++ b/src/bhyve/bhyve_driver.c
> > @@ -756,8 +756,14 @@ bhyveDomainDestroy(virDomainPtr dom)
> >
> > ret = virBhyveProcessStop(privconn, vm,
> VIR_DOMAIN_SHUTOFF_DESTROYED);
> >
> > + if (!vm->persistent) {
> > + virDomainObjListRemove(privconn->domains, vm);
> > + vm = NULL;
> > + }
> > +
>
> This chunk doesn't seem to be directly related to domainCreateXML(),
> should there be a reasoning and probably it should be a separate commit
> even?
>
> > cleanup:
> > - virObjectUnlock(vm);
> > + if (vm)
> > + virObjectUnlock(vm);
>
> It's safe not to check for NULL here.
>
> > return ret;
> > }
> >
> > @@ -1074,6 +1080,78 @@ bhyveDomainResume(virDomainPtr dom)
> > return ret;
> > }
> >
> > +static virDomainPtr
> > +bhyveDomainCreateXML(virConnectPtr conn,
> > + const char *xml,
> > + unsigned int flags)
> > +{
> > + bhyveConnPtr privconn = conn->privateData;
> > + virDomainPtr dom = NULL;
> > + virDomainDefPtr def = NULL;
> > + virDomainObjPtr vm = NULL;
> > + virCapsPtr caps = NULL;
> > + int ret;
> > + unsigned int start_flags = 0;
> > +
> > + virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, NULL);
> > +
> > + if (flags & VIR_DOMAIN_START_AUTODESTROY)
> > + start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY;
> > +
> > + caps = bhyveDriverGetCapabilities(privconn);
> > + if (!caps)
> > + return NULL;
> > +
> > + if ((def = virDomainDefParseString(xml, caps, privconn->xmlopt,
> > + 1 << VIR_DOMAIN_VIRT_BHYVE,
> > + VIR_DOMAIN_XML_INACTIVE)) ==
> NULL)
> > + goto cleanup;
> > +
> > + if (virDomainCreateXMLEnsureACL(conn, def) < 0)
> > + goto cleanup;
> > +
> > + if (!(vm = virDomainObjListAdd(privconn->domains, def,
> > + privconn->xmlopt,
> > + 0, NULL)))
> > + goto cleanup;
> > + def = NULL;
> > + vm->persistent = 0;
> > +
> > + dom = virGetDomain(conn, vm->def->name, vm->def->uuid);
> > + if (!dom)
> > + goto cleanup;
> > +
> > + dom->id = vm->def->id;
> > +
> > + if (flags & VIR_DOMAIN_START_AUTODESTROY)
> > + start_flags |= VIR_BHYVE_PROCESS_START_AUTODESTROY;
> > +
> > + if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0)
> > + goto cleanup;
>
> Do we really need this ACL check here?
>
> > + if (virDomainObjIsActive(vm)) {
> > + virReportError(VIR_ERR_OPERATION_INVALID,
> > + "%s", _("Domain is already running"));
> > + goto cleanup;
> > + }
> > +
> > + ret = virBhyveProcessStart(dom->conn, privconn, vm,
> > + VIR_DOMAIN_RUNNING_BOOTED,
> > + start_flags);
> > + if (ret) {
> > + virObjectUnref(dom);
> > + dom = NULL;
> > + goto cleanup;
> > + }
> > +
> > + cleanup:
> > + virObjectUnref(caps);
> > + virDomainDefFree(def);
> > + virObjectUnlock(vm);
> > +
> > + return dom;
> > +}
> > +
> > static virDriver bhyveDriver = {
> > .no = VIR_DRV_BHYVE,
> > .name = "bhyve",
> > @@ -1091,6 +1169,7 @@ static virDriver bhyveDriver = {
> > .connectNumOfDefinedDomains = bhyveConnectNumOfDefinedDomains, /*
> 1.2.2 */
> > .domainCreate = bhyveDomainCreate, /* 1.2.2 */
> > .domainCreateWithFlags = bhyveDomainCreateWithFlags, /* 1.2.3 */
> > + .domainCreateXML = bhyveDomainCreateXML, /* 1.2.4 */
> > .domainDestroy = bhyveDomainDestroy, /* 1.2.2 */
> > .domainLookupByUUID = bhyveDomainLookupByUUID, /* 1.2.2 */
> > .domainLookupByName = bhyveDomainLookupByName, /* 1.2.2 */
> > --
> > 1.9.0
> >
> > --
> > libvir-list mailing list
> > libvir-list at redhat.com
> > https://www.redhat.com/mailman/listinfo/libvir-list
>
> Roman Bogorodskiy
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140408/e2c2bc4e/attachment-0001.htm>
More information about the libvir-list
mailing list