On 11/02/2009 02:52 PM, Cole Robinson wrote: > Signed-off-by: Cole Robinson <crobinso@xxxxxxxxxx> > --- > src/qemu/qemu_driver.c | 151 +++++++++++++++++++----------------------------- > 1 files changed, 59 insertions(+), 92 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 7eed356..e038887 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -2594,6 +2594,59 @@ cleanup: > return dom; > } > > +static int > +qemudDomainCanCreate(virConnectPtr conn, > + virDomainDefPtr def, > + unsigned int check_active) > +{ > + struct qemud_driver *driver = conn->privateData; > + int ret = 0; > + virDomainObjPtr vm = NULL; > + > + /* See if a VM with matching UUID already exists */ > + vm = virDomainFindByUUID(&driver->domains, def->uuid); > + if (vm) { > + /* UUID matches, but if names don't match, refuse it */ > + if (STRNEQ(vm->def->name, def->name)) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(vm->def->uuid, uuidstr); > + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > + _("domain '%s' is already defined with uuid %s"), > + vm->def->name, uuidstr); > + goto cleanup; > + } > + > + if (check_active) { > + /* UUID & name match, but if VM is already active, refuse it */ > + if (virDomainObjIsActive(vm)) { > + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID, > + _("domain is already active as '%s'"), > + vm->def->name); > + goto cleanup; > + } > + } > + > + virDomainObjUnlock(vm); > + } else { > + /* UUID does not match, but if a name matches, refuse it */ > + vm = virDomainFindByName(&driver->domains, def->name); > + if (vm) { > + char uuidstr[VIR_UUID_STRING_BUFLEN]; > + virUUIDFormat(vm->def->uuid, uuidstr); > + qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > + _("domain '%s' already exists with uuid %s"), > + def->name, uuidstr); > + goto cleanup; > + } > + } > + > + ret = 1; > +cleanup: > + if (vm) > + virDomainObjUnlock(vm); > + return ret; > +} > + > static int qemudGetVersion(virConnectPtr conn, unsigned long *version) { > struct qemud_driver *driver = conn->privateData; > int ret = -1; > @@ -2648,38 +2701,8 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml, > if (virSecurityDriverVerify(conn, def) < 0) > goto cleanup; > > - /* See if a VM with matching UUID already exists */ > - vm = virDomainFindByUUID(&driver->domains, def->uuid); > - if (vm) { > - /* UUID matches, but if names don't match, refuse it */ > - if (STRNEQ(vm->def->name, def->name)) { > - char uuidstr[VIR_UUID_STRING_BUFLEN]; > - virUUIDFormat(vm->def->uuid, uuidstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain '%s' is already defined with uuid %s"), > - vm->def->name, uuidstr); > - goto cleanup; > - } > - > - /* UUID & name match, but if VM is already active, refuse it */ > - if (virDomainObjIsActive(vm)) { > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain is already active as '%s'"), vm->def->name); > - goto cleanup; > - } > - virDomainObjUnlock(vm); > - } else { > - /* UUID does not match, but if a name matches, refuse it */ > - vm = virDomainFindByName(&driver->domains, def->name); > - if (vm) { > - char uuidstr[VIR_UUID_STRING_BUFLEN]; > - virUUIDFormat(vm->def->uuid, uuidstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain '%s' is already defined with uuid %s"), > - def->name, uuidstr); > - goto cleanup; > - } > - } > + if (!qemudDomainCanCreate(conn, def, 1)) > + goto cleanup; > > if (!(vm = virDomainAssignDef(conn, > driver->caps, > @@ -3709,38 +3732,8 @@ static int qemudDomainRestore(virConnectPtr conn, > goto cleanup; > } > > - /* See if a VM with matching UUID already exists */ > - vm = virDomainFindByUUID(&driver->domains, def->uuid); > - if (vm) { > - /* UUID matches, but if names don't match, refuse it */ > - if (STRNEQ(vm->def->name, def->name)) { > - char uuidstr[VIR_UUID_STRING_BUFLEN]; > - virUUIDFormat(vm->def->uuid, uuidstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain '%s' is already defined with uuid %s"), > - vm->def->name, uuidstr); > - goto cleanup; > - } > - > - /* UUID & name match, but if VM is already active, refuse it */ > - if (virDomainObjIsActive(vm)) { > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID, > - _("domain is already active as '%s'"), vm->def->name); > - goto cleanup; > - } > - virDomainObjUnlock(vm); > - } else { > - /* UUID does not match, but if a name matches, refuse it */ > - vm = virDomainFindByName(&driver->domains, def->name); > - if (vm) { > - char uuidstr[VIR_UUID_STRING_BUFLEN]; > - virUUIDFormat(vm->def->uuid, uuidstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain '%s' is already defined with uuid %s"), > - def->name, uuidstr); > - goto cleanup; > - } > - } > + if (!qemudDomainCanCreate(conn, def, 1)) > + goto cleanup; > > if (!(vm = virDomainAssignDef(conn, > driver->caps, > @@ -4197,34 +4190,8 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) { > if (virSecurityDriverVerify(conn, def) < 0) > goto cleanup; > > - /* See if a VM with matching UUID already exists */ > - vm = virDomainFindByUUID(&driver->domains, def->uuid); > - if (vm) { > - /* UUID matches, but if names don't match, refuse it */ > - if (STRNEQ(vm->def->name, def->name)) { > - char uuidstr[VIR_UUID_STRING_BUFLEN]; > - virUUIDFormat(vm->def->uuid, uuidstr); > - qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, > - _("domain '%s' is already defined with uuid %s"), > - vm->def->name, uuidstr); > - goto cleanup; > - } > - > - /* UUID & name match */ > - virDomainObjUnlock(vm); > - newVM = 0; Just noticed that the above line is dropped in this change. I'll send a fixed patch. - Cole -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list