From: "Daniel P. Berrange" <berrange(a)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 virDomainCreateXML:
if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def, false)))
goto cleanup;
Changes to
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def,
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
NULL)))
goto cleanup;
This pair, used in virDomainRestoreFlags:
if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def, true)))
goto cleanup;
Changes to
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def,
VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
NULL)))
goto cleanup;
This pair, used in virDomainDefinXML:
if (virDomainObjListIsDuplicate(privconn->domains, def, 0) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def, false)))
goto cleanup;
Changes to
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
def,
0, NULL)))
goto cleanup;
---
src/conf/domain_conf.c | 156 +++++++++++++++++++--------------------
src/conf/domain_conf.h | 11 +--
src/libvirt_private.syms | 1 -
src/libxl/libxl_driver.c | 27 ++++---
src/lxc/lxc_driver.c | 19 +++--
src/openvz/openvz_conf.c | 12 +--
src/openvz/openvz_driver.c | 6 +-
src/parallels/parallels_driver.c | 16 ++--
src/qemu/qemu_driver.c | 71 +++++++-----------
src/qemu/qemu_migration.c | 11 ++-
src/test/test_driver.c | 31 ++++----
src/uml/uml_driver.c | 13 ++--
src/vmware/vmware_conf.c | 2 +-
src/vmware/vmware_driver.c | 12 +--
14 files changed, 174 insertions(+), 214 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 3861e68..79da5eb 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1871,30 +1871,91 @@ void virDomainObjAssignDef(virDomainObjPtr domain,
}
}
+
+
+/*
+ *
+ * If flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE then
+ * this will refuse updating an existing def if the
+ * current def is Live
+ *
+ */
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
virCapsPtr caps,
const virDomainDefPtr def,
- bool live)
+ unsigned int flags,
+ virDomainDefPtr *oldDef)
{
- virDomainObjPtr domain;
+ virDomainObjPtr vm;
char uuidstr[VIR_UUID_STRING_BUFLEN];
+ if (oldDef)
+ *oldDef = false;
- if ((domain = virDomainObjListFindByUUID(doms, def->uuid))) {
- virDomainObjAssignDef(domain, def, live);
- return domain;
- }
+ /* See if a VM with matching UUID already exists */
+ if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) {
+ /* UUID matches, but if names don't match, refuse it */
+ if (STRNEQ(vm->def->name, def->name)) {
+ virUUIDFormat(vm->def->uuid, uuidstr);
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("domain '%s' is already defined with uuid
%s"),
+ vm->def->name, uuidstr);
+ goto cleanup;
+ }
- if (!(domain = virDomainObjNew(caps)))
- return NULL;
- domain->def = def;
+ if (flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE) {
+ /* UUID & name match, but if VM is already active, refuse it */
+ if (virDomainObjIsActive(vm)) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("domain is already active as '%s'"),
+ vm->def->name);
+ goto cleanup;
+ }
+ }
- virUUIDFormat(def->uuid, uuidstr);
- if (virHashAddEntry(doms->objs, uuidstr, domain) < 0) {
- VIR_FREE(domain);
- return NULL;
- }
+ if (virDomainObjIsActive(vm)) {
+ if (oldDef)
+ *oldDef = vm->newDef;
+ else
+ virDomainDefFree(vm->newDef);
+ vm->newDef = def;
+ } else {
+ if (flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE) {
+ if (!vm->newDef)
+ vm->newDef = vm->def;
+ else
+ virDomainDefFree(vm->newDef);
+ } else {
+ if (oldDef)
+ *oldDef = vm->def;
+ else
+ virDomainDefFree(vm->def);
+ }
+ vm->def = def;
+ }
+ } else {
+ /* UUID does not match, but if a name matches, refuse it */
+ if ((vm = virDomainObjListFindByName(doms, def->name))) {
+ virUUIDFormat(vm->def->uuid, uuidstr);
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("domain '%s' already exists with uuid
%s"),
+ def->name, uuidstr);
+ virObjectUnlock(vm);
+ vm = NULL;
+ goto cleanup;
+ }
- return domain;
+ if (!(vm = virDomainObjNew(caps)))
+ goto cleanup;
+ vm->def = def;
+
+ virUUIDFormat(def->uuid, uuidstr);
+ if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) {
+ VIR_FREE(vm);
+ return NULL;
+ }
+ }
+cleanup:
+ return vm;
}
/*
@@ -14850,7 +14911,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms,
return dom;
}
- if (!(dom = virDomainObjListAdd(doms, caps, def, false)))
+ if (!(dom = virDomainObjListAdd(doms, caps, def, 0, NULL)))
goto error;
dom->autostart = autostart;
@@ -15076,69 +15137,6 @@ virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr
def)
return NULL;
}
-/*
- * virDomainObjListIsDuplicate:
- * @doms : virDomainObjListPtr to search
- * @def : virDomainDefPtr definition of domain to lookup
- * @check_active: If true, ensure that domain is not active
- *
- * Returns: -1 on error
- * 0 if domain is new
- * 1 if domain is a duplicate
- */
-int
-virDomainObjListIsDuplicate(virDomainObjListPtr doms,
- virDomainDefPtr def,
- unsigned int check_active)
-{
- int ret = -1;
- int dupVM = 0;
- virDomainObjPtr vm = NULL;
-
- /* See if a VM with matching UUID already exists */
- vm = virDomainObjListFindByUUID(doms, 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);
- virReportError(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)) {
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("domain is already active as '%s'"),
- vm->def->name);
- goto cleanup;
- }
- }
-
- dupVM = 1;
- } else {
- /* UUID does not match, but if a name matches, refuse it */
- vm = virDomainObjListFindByName(doms, def->name);
- if (vm) {
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virUUIDFormat(vm->def->uuid, uuidstr);
- virReportError(VIR_ERR_OPERATION_FAILED,
- _("domain '%s' already exists with uuid
%s"),
- def->name, uuidstr);
- goto cleanup;
- }
- }
-
- ret = dupVM;
-cleanup:
- if (vm)
- virObjectUnlock(vm);
- return ret;
-}
-
static void virDomainObjListCountActive(void *payload, const void *name ATTRIBUTE_UNUSED,
void *data)
{
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3ad1173..fa13e24 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1968,10 +1968,15 @@ virDomainChrDefPtr virDomainChrDefNew(void);
/* live == true means def describes an active domain (being migrated or
* restored) as opposed to a new persistent configuration of the domain */
+enum {
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE = (1 << 0),
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE = (1 << 1),
+};
virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
virCapsPtr caps,
const virDomainDefPtr def,
- bool live);
+ unsigned int flags,
+ virDomainDefPtr *oldDef);
void virDomainObjAssignDef(virDomainObjPtr domain,
const virDomainDefPtr def,
bool live);
@@ -2156,10 +2161,6 @@ int virDomainFSIndexByName(virDomainDefPtr def, const char *name);
int virDomainVideoDefaultType(virDomainDefPtr def);
int virDomainVideoDefaultRAM(virDomainDefPtr def, int type);
-int virDomainObjListIsDuplicate(virDomainObjListPtr doms,
- virDomainDefPtr def,
- unsigned int check_active);
-
int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active);
int virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index bdc8e9b..87171ae 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -478,7 +478,6 @@ virDomainObjListFindByUUID;
virDomainObjListForEach;
virDomainObjListGetActiveIDs;
virDomainObjListGetInactiveNames;
-virDomainObjListIsDuplicate;
virDomainObjListLoadAllConfigs;
virDomainObjListNew;
virDomainObjListNumOfDomains;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 1ce3057..e0a9a8e 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -1449,12 +1449,11 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -2230,12 +2229,12 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from,
if (fd < 0)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, true)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -3019,7 +3018,7 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
virDomainEventPtr event = NULL;
- int dupVM;
+ virDomainDefPtr oldDef = NULL;
libxlDriverLock(driver);
if (!(def = virDomainDefParseString(driver->caps, xml,
@@ -3027,12 +3026,11 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ 0,
+ &oldDef)))
goto cleanup;
def = NULL;
vm->persistent = 1;
@@ -3049,12 +3047,13 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml)
dom->id = vm->def->id;
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED,
- !dupVM ?
+ !oldDef ?
VIR_DOMAIN_EVENT_DEFINED_ADDED :
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
cleanup:
virDomainDefFree(def);
+ virDomainDefFree(oldDef);
if (vm)
virObjectUnlock(vm);
if (event)
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 9dbab67..5e664c7 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -410,7 +410,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
virDomainEventPtr event = NULL;
- int dupVM;
+ virDomainDefPtr oldDef = NULL;
lxcDriverLock(driver);
if (!(def = virDomainDefParseString(driver->caps, xml,
@@ -421,9 +421,6 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
goto cleanup;
- if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
- goto cleanup;
-
if ((def->nets != NULL) && !(driver->have_netns)) {
virReportError(VIR_ERR_OPERATION_INVALID,
"%s", _("System lacks NETNS support"));
@@ -432,7 +429,9 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ 0,
+ &oldDef)))
goto cleanup;
def = NULL;
vm->persistent = 1;
@@ -446,7 +445,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_DEFINED,
- !dupVM ?
+ !oldDef ?
VIR_DOMAIN_EVENT_DEFINED_ADDED :
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
@@ -456,6 +455,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char
*xml)
cleanup:
virDomainDefFree(def);
+ virDomainDefFree(oldDef);
if (vm)
virObjectUnlock(vm);
if (event)
@@ -1077,9 +1077,6 @@ lxcDomainCreateAndStart(virConnectPtr conn,
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if ((def->nets != NULL) && !(driver->have_netns)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
"%s", _("System lacks NETNS support"));
@@ -1089,7 +1086,9 @@ lxcDomainCreateAndStart(virConnectPtr conn,
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
index 6eacbca..84ba3d6 100644
--- a/src/openvz/openvz_conf.c
+++ b/src/openvz/openvz_conf.c
@@ -642,17 +642,13 @@ int openvzLoadDomains(struct openvz_driver *driver) {
openvzReadMemConf(def, veid);
virUUIDFormat(def->uuid, uuidstr);
- if (virDomainObjListIsDuplicate(driver->domains, def, true)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Duplicate container UUID %s detected for %d"),
- uuidstr,
- veid);
- goto cleanup;
- }
if (!(dom = virDomainObjListAdd(driver->domains,
driver->caps,
def,
- STRNEQ(status, "stopped"))))
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE |
+ (STRNEQ(status, "stopped") ?
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE : 0),
+ NULL)))
goto cleanup;
if (STREQ(status, "stopped")) {
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 24d4202..0cb5a1c 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -969,7 +969,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
}
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- vmdef, false)))
+ vmdef, 0, NULL)))
goto cleanup;
vmdef = NULL;
vm->persistent = 1;
@@ -1056,7 +1056,9 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
}
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- vmdef, false)))
+ vmdef,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
vmdef = NULL;
/* All OpenVZ domains seem to be persistent - this is a bit of a violation
diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index bc05a51..4e1889f 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -832,7 +832,7 @@ parallelsLoadDomain(parallelsConnPtr privconn, virJSONValuePtr jobj)
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, false)))
+ def, 0, NULL)))
goto cleanup;
/* dom is locked here */
@@ -2324,7 +2324,6 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
virDomainPtr ret = NULL;
virDomainDefPtr def;
virDomainObjPtr dom = NULL, olddom = NULL;
- int dupVM;
parallelsDriverLock(privconn);
if ((def = virDomainDefParseString(privconn->caps, xml,
@@ -2335,14 +2334,9 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
goto cleanup;
}
- if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) {
- virReportError(VIR_ERR_INVALID_ARG, "%s", _("Already
exists"));
- goto cleanup;
- }
-
- if (dupVM == 1) {
- olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
- } else {
+ olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid);
+ if (olddom == NULL) {
+ virResetLastError();
if (STREQ(def->os.type, "hvm")) {
if (parallelsCreateVm(conn, def))
goto cleanup;
@@ -2373,7 +2367,7 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml)
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, false))) {
+ def, 0, NULL))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Can't allocate domobj"));
goto cleanup;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a02e989..d6c6af5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -1589,9 +1589,6 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char
*xml,
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
goto cleanup;
@@ -1603,7 +1600,9 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char
*xml,
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -4987,15 +4986,13 @@ qemuDomainRestoreFlags(virConnectPtr conn,
if (fd < 0)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, true))) {
- /* virDomainLitsAdd already set the error */
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
- }
def = NULL;
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
@@ -5585,12 +5582,11 @@ qemuDomainStart(virDomainPtr dom)
static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) {
virQEMUDriverPtr driver = conn->privateData;
virDomainDefPtr def;
- virDomainDefPtr def_backup = NULL;
+ virDomainDefPtr oldDef = NULL;
virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
virDomainEventPtr event = NULL;
qemuCapsPtr caps = NULL;
- int dupVM;
virQEMUDriverConfigPtr cfg;
qemuDriverLock(driver);
@@ -5603,9 +5599,6 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char
*xml) {
if (virSecurityManagerVerify(driver->securityManager, def) < 0)
goto cleanup;
- if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0)
- goto cleanup;
-
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
goto cleanup;
@@ -5615,26 +5608,14 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const
char *xml) {
if (qemuDomainAssignAddresses(def, caps, NULL) < 0)
goto cleanup;
- /* We need to differentiate two cases:
- * a) updating an existing domain - must preserve previous definition
- * so we can roll back if something fails
- * b) defining a brand new domain - virDomainObjListAdd is just sufficient
- */
- if ((vm = virDomainObjListFindByUUID(driver->domains, def->uuid))) {
- if (virDomainObjIsActive(vm)) {
- def_backup = vm->newDef;
- vm->newDef = def;
- } else {
- def_backup = vm->def;
- vm->def = def;
- }
- } else {
- if (!(vm = virDomainObjListAdd(driver->domains,
- driver->caps,
- def, false))) {
- goto cleanup;
- }
- }
+ if (!(vm = virDomainObjListAdd(driver->domains,
+ driver->caps,
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ &oldDef)))
+ goto cleanup;
+
def = NULL;
if (virDomainHasDiskMirror(vm)) {
virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s",
@@ -5646,14 +5627,15 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const
char *xml) {
if (virDomainSaveConfig(cfg->configDir,
vm->newDef ? vm->newDef : vm->def) < 0) {
- if (def_backup) {
+ if (oldDef) {
/* There is backup so this VM was defined before.
* Just restore the backup. */
VIR_INFO("Restoring domain '%s' definition",
vm->def->name);
if (virDomainObjIsActive(vm))
- vm->newDef = def_backup;
+ vm->newDef = oldDef;
else
- vm->def = def_backup;
+ vm->def = oldDef;
+ oldDef = NULL;
} else {
/* Brand new domain. Remove it */
VIR_INFO("Deleting domain '%s'", vm->def->name);
@@ -5661,13 +5643,11 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const
char *xml) {
vm = NULL;
}
goto cleanup;
- } else {
- virDomainDefFree(def_backup);
}
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_DEFINED,
- !dupVM ?
+ !oldDef ?
VIR_DOMAIN_EVENT_DEFINED_ADDED :
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
@@ -5676,6 +5656,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char
*xml) {
if (dom) dom->id = vm->def->id;
cleanup:
+ virDomainDefFree(oldDef);
virDomainDefFree(def);
if (vm)
virObjectUnlock(vm);
@@ -12612,9 +12593,6 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn,
if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator)))
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (qemuCanonicalizeMachine(def, caps) < 0)
goto cleanup;
@@ -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)))
goto cleanup;
def = NULL;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 5e10876..c59a540 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1639,15 +1639,14 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
}
}
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, true))) {
- /* virDomainAssignDef already set the error */
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
- }
+
def = NULL;
priv = vm->privateData;
priv->origname = origname;
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index cd47862..1b31e00 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -584,7 +584,7 @@ static int testOpenDefault(virConnectPtr conn) {
goto error;
if (!(domobj = virDomainObjListAdd(privconn->domains,
privconn->caps,
- domdef, false)))
+ domdef, 0, NULL)))
goto error;
domdef = NULL;
@@ -929,7 +929,7 @@ static int testOpenFromFile(virConnectPtr conn,
if (testDomainGenerateIfnames(def) < 0 ||
!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, false))) {
+ def, 0, NULL))) {
virDomainDefFree(def);
goto error;
}
@@ -1326,14 +1326,13 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
VIR_DOMAIN_XML_INACTIVE)) == NULL)
goto cleanup;
- if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
- goto cleanup;
-
if (testDomainGenerateIfnames(def) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, false)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -1943,14 +1942,14 @@ testDomainRestoreFlags(virConnectPtr conn,
if (!def)
goto cleanup;
- if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0)
- goto cleanup;
-
if (testDomainGenerateIfnames(def) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, true)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_LIVE |
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -2483,7 +2482,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
virDomainDefPtr def;
virDomainObjPtr dom = NULL;
virDomainEventPtr event = NULL;
- int dupVM;
+ virDomainDefPtr oldDef = NULL;
testDriverLock(privconn);
if ((def = virDomainDefParseString(privconn->caps, xml,
@@ -2491,21 +2490,20 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
VIR_DOMAIN_XML_INACTIVE)) == NULL)
goto cleanup;
- if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0)
- goto cleanup;
-
if (testDomainGenerateIfnames(def) < 0)
goto cleanup;
if (!(dom = virDomainObjListAdd(privconn->domains,
privconn->caps,
- def, false)))
+ def,
+ 0,
+ &oldDef)))
goto cleanup;
def = NULL;
dom->persistent = 1;
event = virDomainEventNewFromObj(dom,
VIR_DOMAIN_EVENT_DEFINED,
- !dupVM ?
+ !oldDef ?
VIR_DOMAIN_EVENT_DEFINED_ADDED :
VIR_DOMAIN_EVENT_DEFINED_UPDATED);
@@ -2515,6 +2513,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
cleanup:
virDomainDefFree(def);
+ virDomainDefFree(oldDef);
if (dom)
virObjectUnlock(dom);
if (event)
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 27f5118..f2cdc8d 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -1499,12 +1499,11 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char
*xml,
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
def = NULL;
@@ -1921,12 +1920,10 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char
*xml) {
VIR_DOMAIN_XML_INACTIVE)))
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, def, 0) < 0)
- goto cleanup;
-
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- def, false)))
+ def,
+ 0, NULL)))
goto cleanup;
def = NULL;
vm->persistent = 1;
diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c
index b616c1b..1afd372 100644
--- a/src/vmware/vmware_conf.c
+++ b/src/vmware/vmware_conf.c
@@ -179,7 +179,7 @@ vmwareLoadDomains(struct vmware_driver *driver)
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- vmdef, false)))
+ vmdef, 0, NULL)))
goto cleanup;
pDomain = vm->privateData;
diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c
index b99fca3..8684f56 100644
--- a/src/vmware/vmware_driver.c
+++ b/src/vmware/vmware_driver.c
@@ -320,9 +320,6 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml)
VIR_DOMAIN_XML_INACTIVE)) == NULL)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0)
- goto cleanup;
-
/* generate vmx file */
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
if (vmx == NULL)
@@ -341,7 +338,7 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml)
/* assign def */
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- vmdef, false)))
+ vmdef, 0, NULL)))
goto cleanup;
pDomain = vm->privateData;
@@ -592,9 +589,6 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml,
VIR_DOMAIN_XML_INACTIVE)) == NULL)
goto cleanup;
- if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0)
- goto cleanup;
-
/* generate vmx file */
vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7);
if (vmx == NULL)
@@ -613,7 +607,9 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml,
/* assign def */
if (!(vm = virDomainObjListAdd(driver->domains,
driver->caps,
- vmdef, false)))
+ vmdef,
+ VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE,
+ NULL)))
goto cleanup;
pDomain = vm->privateData;
--
1.8.1