On 22.09.2015 14:15, Martin Kletzander wrote: > In order for the user to be able to fix broken domains function > qemuDomainGetXMLDesc() needs to be able to lookup invalid domain > definitions and handle them properly. When redefined, function > qemuDomainDefineXMLFlags() must clear the 'invalid XML' reason. As a > nice addition, qemuDomainGetState() can lookup such domains without any > other change and that allows virsh not only to get their status, but > also to list them. > > Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> > --- > src/qemu/qemu_driver.c | 21 ++++++++++++++------- > 1 file changed, 14 insertions(+), 7 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 0a671500134f..881c5c4c1984 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -2706,7 +2706,7 @@ qemuDomainGetState(virDomainPtr dom, > > virCheckFlags(0, -1); > > - if (!(vm = qemuDomObjFromDomain(dom))) > + if (!(vm = qemuDomObjFromDomainInvalid(dom))) > goto cleanup; > > if (virDomainGetStateEnsureACL(dom->conn, vm->def) < 0) > @@ -7082,19 +7082,23 @@ qemuDomainGetXMLDesc(virDomainPtr dom, > > /* Flags checked by virDomainDefFormat */ > > - if (!(vm = qemuDomObjFromDomain(dom))) > + if (!(vm = qemuDomObjFromDomainInvalid(dom))) > goto cleanup; > > if (virDomainGetXMLDescEnsureACL(dom->conn, vm->def, flags) < 0) > goto cleanup; > > - if (qemuDomainUpdateCurrentMemorySize(driver, vm) < 0) > - goto cleanup; > + if (vm->def->parseError) { > + ignore_value(VIR_STRDUP(ret, vm->def->xmlStr)); > + } else { > + if (qemuDomainUpdateCurrentMemorySize(driver, vm) < 0) > + goto cleanup; > > - if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) > - flags |= QEMU_DOMAIN_FORMAT_LIVE_FLAGS; > + if ((flags & VIR_DOMAIN_XML_MIGRATABLE)) > + flags |= QEMU_DOMAIN_FORMAT_LIVE_FLAGS; > > - ret = qemuDomainFormatXML(driver, vm, flags); > + ret = qemuDomainFormatXML(driver, vm, flags); > + } > > cleanup: > virDomainObjEndAPI(&vm); > @@ -7557,6 +7561,9 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, > goto cleanup; > } > > + if (oldDef && oldDef->parseError) > + virDomainObjSetState(vm, virDomainObjGetState(vm, NULL), 0); > + I don't understand this bit. Why is this needed? > event = virDomainEventLifecycleNewFromObj(vm, > VIR_DOMAIN_EVENT_DEFINED, > !oldDef ? > Otherwise looking good. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list