iface-unbridge(netcf interface backend) checks multiple interfaces
attaching based on static configuration.
If guests interfaces(says tun/tap devices) are attaching to the bridge,
iface-unbridge doesn't check them, It causes the bridge is removed
although it's in use by other guests.
Please refer to:
https://bugzilla.suse.com/show_bug.cgi?id=813117
Signed-off-by: Lin Ma <lma(a)suse.com>
---
tools/virsh-interface.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c
index 5f848b6..63ba5bb 100644
--- a/tools/virsh-interface.c
+++ b/tools/virsh-interface.c
@@ -1040,11 +1040,11 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd)
const char *br_name;
char *if_type = NULL, *if_name = NULL;
bool nostart = false;
- char *br_xml = NULL;
+ char *br_xml = NULL, *br_xml_transient_if = NULL;
xmlChar *if_xml = NULL;
int if_xml_size;
- xmlDocPtr xml_doc = NULL;
- xmlXPathContextPtr ctxt = NULL;
+ xmlDocPtr xml_doc = NULL, xml_doc_transient_if = NULL;
+ xmlXPathContextPtr ctxt = NULL, ctxt_transient_if = NULL;
xmlNodePtr top_node, if_node, cur;
/* Get a handle to the original device */
@@ -1103,6 +1103,21 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd)
goto cleanup;
}
+ /* verify whether there is any transient interface attached to bridge. */
+ if (!(br_xml_transient_if = virInterfaceGetXMLDesc(br_handle, 0)))
+ goto cleanup;
+ if (!(xml_doc_transient_if = virXMLParseStringCtxt(br_xml_transient_if,
+ _("(bridge interface definition)"),
+ &ctxt_transient_if))) {
+ vshError(ctl, _("Failed to parse configuration of %s"), br_name);
+ goto cleanup;
+ }
+
+ if (virXPathNode("./bridge/interface[2]", ctxt_transient_if) != NULL) {
+ vshError(ctl, "%s", _("The bridge is in use by transient
interfaces"));
+ goto cleanup;
+ }
+
/* Change the type and name of the outer/master interface to
* the type/name of the attached slave interface.
*/
@@ -1198,10 +1213,13 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd)
virInterfaceFree(br_handle);
VIR_FREE(if_xml);
VIR_FREE(br_xml);
+ VIR_FREE(br_xml_transient_if);
VIR_FREE(if_type);
VIR_FREE(if_name);
xmlXPathFreeContext(ctxt);
+ xmlXPathFreeContext(ctxt_transient_if);
xmlFreeDoc(xml_doc);
+ xmlFreeDoc(xml_doc_transient_if);
return ret;
}
--
1.8.4