]> xenbits.xensource.com Git - libvirt.git/commitdiff
network driver: Fix regression defining colliding networks at daemon startup.
authorCole Robinson <crobinso@redhat.com>
Fri, 29 May 2009 14:18:57 +0000 (14:18 +0000)
committerCole Robinson <crobinso@redhat.com>
Fri, 29 May 2009 14:18:57 +0000 (14:18 +0000)
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
src/network_conf.c
src/network_conf.h
src/network_driver.c

index c66c8704e97c7f613d4d156978ca29b9725b76bf..06aefe37321cadde0bd8b6619c61f608665e2f18 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index b4da3fb090d03bd19e4fa28903124536b1ccb972..1e0cbb8206b70b290b944230cecbd35a0d94203e 100644 (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);
index 365d469db449af595c8cd852614c6f6673ba8481..1d51c8364acce071f6a74d462a91ba6e5e41e348 100644 (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);
index 3518e01bf60d0f6dcbb7a2f0dc790cbb1745eaf3..10d5fd3d656ef5ac2664ca9405859969a03872d3 100644 (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,