[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