[libvirt] [PATCH] network driver: Fix regression defining colliding networks at daemon startup.
Daniel P. Berrange
berrange at redhat.com
Thu May 28 18:24:59 UTC 2009
On Thu, May 28, 2009 at 01:16:25PM -0400, Cole Robinson wrote:
> 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 6c2c73fc.
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
ACK
>
> diff --git a/src/network_conf.c b/src/network_conf.c
> index b4da3fb..1e0cbb8 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 365d469..1d51c83 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 3518e01..10d5fd3 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,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list