From b121c7871f7a44946d8f7dcb009cad967aeda467 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Fri, 29 May 2009 14:18:57 +0000 Subject: [PATCH] network driver: Fix regression defining colliding networks at daemon startup. If two virtual networks have the same hardcoded bridge device (which prevents them from being active simultaneously) we still want to define them at daemon startup, so the user has a fighting chance of correcting the XML error. Add an extra flag to SetBridge to avoid reporting an error if there is a bridge collision, and use this when loading network configs at startup. This regressed via commit 4c3f3b4d. --- ChangeLog | 5 +++++ src/network_conf.c | 17 +++++++++-------- src/network_conf.h | 3 ++- src/network_driver.c | 4 ++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index c66c8704e9..06aefe3732 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri May 29 10:16:13 EDT 2009 Cole Robinson + + * src/network_driver.c src/network_conf.c src/network_conf.h: + Fix regression defining colliding networks at daemon startup. + Fri May 29 10:13:55 EDT 2009 Cole Robinson * src/network_driver.c: networkDestroy: Report error if network diff --git a/src/network_conf.c b/src/network_conf.c index b4da3fb090..1e0cbb8206 100644 --- a/src/network_conf.c +++ b/src/network_conf.c @@ -724,7 +724,6 @@ virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn, virNetworkDefPtr def = NULL; virNetworkObjPtr net; int autostart; - char *tmp; if ((configFile = virNetworkConfigFile(conn, configDir, name)) == NULL) goto error; @@ -745,13 +744,10 @@ virNetworkObjPtr virNetworkLoadConfig(virConnectPtr conn, goto error; } - /* Generate a bridge if none is found, but don't check for collisions + /* Generate a bridge if none is specified, but don't check for collisions * if a bridge is hardcoded, so the network is at least defined */ - if ((tmp = virNetworkAllocateBridge(conn, nets, def->bridge)) != NULL) { - VIR_FREE(def->bridge); - def->bridge = tmp; - } else + if (virNetworkSetBridgeName(conn, nets, def, 0)) goto error; if (!(net = virNetworkAssignDef(conn, nets, def))) @@ -913,12 +909,17 @@ char *virNetworkAllocateBridge(virConnectPtr conn, int virNetworkSetBridgeName(virConnectPtr conn, const virNetworkObjListPtr nets, - virNetworkDefPtr def) { + virNetworkDefPtr def, + int check_collision) { int ret = -1; if (def->bridge && !strstr(def->bridge, "%d")) { - if (virNetworkBridgeInUse(nets, def->bridge, def->name)) { + /* We may want to skip collision detection in this case (ex. when + * loading configs at daemon startup, so the network is at least + * defined. */ + if (check_collision && + virNetworkBridgeInUse(nets, def->bridge, def->name)) { networkReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("bridge name '%s' already in use."), def->bridge); diff --git a/src/network_conf.h b/src/network_conf.h index 365d469db4..1d51c8364a 100644 --- a/src/network_conf.h +++ b/src/network_conf.h @@ -179,7 +179,8 @@ char *virNetworkAllocateBridge(virConnectPtr conn, int virNetworkSetBridgeName(virConnectPtr conn, const virNetworkObjListPtr nets, - virNetworkDefPtr def); + virNetworkDefPtr def, + int check_collision); void virNetworkObjLock(virNetworkObjPtr obj); void virNetworkObjUnlock(virNetworkObjPtr obj); diff --git a/src/network_driver.c b/src/network_driver.c index 3518e01bf6..10d5fd3d65 100644 --- a/src/network_driver.c +++ b/src/network_driver.c @@ -1096,7 +1096,7 @@ static virNetworkPtr networkCreate(virConnectPtr conn, const char *xml) { if (!(def = virNetworkDefParseString(conn, xml))) goto cleanup; - if (virNetworkSetBridgeName(conn, &driver->networks, def)) + if (virNetworkSetBridgeName(conn, &driver->networks, def, 1)) goto cleanup; if (!(network = virNetworkAssignDef(conn, @@ -1133,7 +1133,7 @@ static virNetworkPtr networkDefine(virConnectPtr conn, const char *xml) { if (!(def = virNetworkDefParseString(conn, xml))) goto cleanup; - if (virNetworkSetBridgeName(conn, &driver->networks, def)) + if (virNetworkSetBridgeName(conn, &driver->networks, def, 1)) goto cleanup; if (!(network = virNetworkAssignDef(conn,