[libvirt] [PATCH 3/3] virsh: prevent removing a in-used bridge for iface-unbridge
Michal Privoznik
mprivozn at redhat.com
Tue Feb 3 16:39:40 UTC 2015
On 02.02.2015 15:08, Lin Ma wrote:
> By checking transient interfaces, It obtains the live information of
> attached interfaces to see if the bridge is in use.
>
> Signed-off-by: Lin Ma <lma at suse.com>
> ---
> tools/virsh-interface.c | 25 ++++++++++++++++++++++---
> 1 file changed, 22 insertions(+), 3 deletions(-)
Technically, this is a v2 to a previous patch (I mildly recall seeing
something like this in the past).
>
> diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c
> index 5f848b6..ff40be0 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,22 @@ 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 +1214,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;
> }
>
>
ACK. I'll merge this tomorrow (unless somebody beats me).
Michal
More information about the libvir-list
mailing list