<html><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><META name="Author" content="Novell GroupWise WebAccess"><style type="text/css"> 
body p 

        margin: 0px; 
}
</style></head><body style='font-family: Helvetica, Arial, sans-serif; font-size: 13px; '><div id="GroupWiseSection_1418830693000_lma@suse.com_B118D7016C3D0000BC7D000BCD69755F_" class="GroupWiseMessageBody"><div><br></div><span> </span><span class="GroupwiseReplyHeader"><br><br>>>> Michal Privoznik <mprivozn@redhat.com> 2014-12-17 下午 20:34 >>><br></span><span class="GroupwiseReplyHeader">></span>On 17.12.2014 11:34, Lin Ma wrote:<br><span class="GroupwiseReplyHeader">></span>> iface-unbridge(netcf interface backend) checks multiple interfaces<br><span class="GroupwiseReplyHeader">></span>> attaching based on static configuration.<br><span class="GroupwiseReplyHeader">></span>> If guests interfaces(says tun/tap devices) are attaching to the bridge,<br><span class="GroupwiseReplyHeader">></span>> iface-unbridge doesn't check them, It causes the bridge is removed<br><span class="GroupwiseReplyHeader">></span>> although it's in use by other guests.<br><span class="GroupwiseReplyHeader">></span>><br><span class="GroupwiseReplyHeader">></span>> Please refer to:<br><span class="GroupwiseReplyHeader">></span>> https://bugzilla.suse.com/show_bug.cgi?id=813117<br><span class="GroupwiseReplyHeader">></span><br><span class="GroupwiseReplyHeader">> </span>The bug is not publicly viewable. We tend to not put the BZ URL in the <br><span class="GroupwiseReplyHeader">> </span>commit message in that case.<br><br>sorry about that, the URL will be removed, Thanks.<br><br><span class="GroupwiseReplyHeader">></span>><br><span class="GroupwiseReplyHeader">></span>> Signed-off-by: Lin Ma <lma@suse.com><br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> ---<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>   tools/virsh-interface.c | 24 +++++++++++++++++++++---<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>   1 file changed, 21 insertions(+), 3 deletions(-)<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>><br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> index 5f848b6..63ba5bb 100644<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> --- a/tools/virsh-interface.c<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +++ b/tools/virsh-interface.c<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> @@ -1040,11 +1040,11 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd)<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       const char *br_name;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       char *if_type = NULL, *if_name = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       bool nostart = false;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> -    char *br_xml = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    char *br_xml = NULL, *br_xml_transient_if = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       xmlChar *if_xml = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       int if_xml_size;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> -    xmlDocPtr xml_doc = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> -    xmlXPathContextPtr ctxt = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    xmlDocPtr xml_doc = NULL, xml_doc_transient_if = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    xmlXPathContextPtr ctxt = NULL, ctxt_transient_if = NULL;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       xmlNodePtr top_node, if_node, cur;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>><br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       /* Get a handle to the original device */<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> @@ -1103,6 +1103,21 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd)<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>           goto cleanup;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>>       }<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>><br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    /* verify whether there is any transient interface attached to bridge. */<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    if (!(br_xml_transient_if = virInterfaceGetXMLDesc(br_handle, 0)))<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +        goto cleanup;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    if (!(xml_doc_transient_if = virXMLParseStringCtxt(br_xml_transient_if,<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +                                          _("(bridge interface definition)"),<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +                                          &ctxt_transient_if))) {<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +        vshError(ctl, _("Failed to parse configuration of %s"), br_name);<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +        goto cleanup;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    }<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    if (virXPathNode("./bridge/interface[2]", ctxt_transient_if) != NULL) {<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +        vshError(ctl, "%s", _("The bridge is in use by transient interfaces"));<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +        goto cleanup;<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +    }<br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">></span>> +<br></lma@suse.com><span class="GroupwiseReplyHeader">></span><br><lma@suse.com><span class="GroupwiseReplyHeader">></span> This effectively copies the code just a few lines above (not to be seen <br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">> </span>in this context though). The only difference is, that your code gest <br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">> </span>LIVE bridge XML, while pre-exisitng code dumps INACTIVE XML. Can we turn <br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">> </span>already existing code into checking LIVE XML instead? It feels more <br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">> </span>appropriate too. Live bridge can have only one interface plugged in (due <br></lma@suse.com><lma@suse.com><span class="GroupwiseReplyHeader">> </span>to hot-unplugging) regardless of what INACTIVE XML says.<br><br>Actually, at the beginning of writing this patch, I tended to turn already existing code<br>into checking LIVE XML instead, But if I do so, it can't deal with this extreme circumstance:<br>says no any physical interface attached to the bridge, But one guest tap backend is <br>attaching to this bridge. The bridge will be removed in this case instead of reporting "No<br>interface attached to bridge".<br><br>Now I thought about it, no body configures the bridge and guest interface like that,<br>that </lma@suse.com><lma@suse.com>extreme circumstance is meaningless and useless scenario, So I agreed with your idea. <br><br>any else suggestions?<br><br>Thanks,<br>Lin<br></lma@suse.com></div></body></html>