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.
This commit is contained in:
Cole Robinson 2009-05-29 14:18:57 +00:00
parent 545c815c4c
commit b121c7871f
4 changed files with 18 additions and 11 deletions

View File

@ -1,3 +1,8 @@
Fri May 29 10:16:13 EDT 2009 Cole Robinson <crobinso@redhat.com>
* 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 <crobinso@redhat.com>
* src/network_driver.c: networkDestroy: Report error if network

View File

@ -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);

View File

@ -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);

View File

@ -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,