[libvirt] [PATCH v4] Use-correct-pci-addresses-during-interface-detach

Nitesh Konkar niteshkonkar.libvirt at gmail.com
Tue Mar 22 09:01:19 UTC 2016


Hello All,

Any comments for the above patch.

Warm Regards,
Nitesh Konkar.


On Tue, Mar 8, 2016 at 10:54 AM, Nitesh Konkar <
niteshkonkar.libvirt at gmail.com> wrote:

> The virsh attach virsh detach interface command fails  when both live and
> config
> are set and when the  interface gets attached to different pci slots
> on live and config xml respectively.
>
> When we attach an interface with both --live and --config,
> the first time they get the same PCI slots, but the second time
> onwards it differs and hence the virsh detach-interface --live
> --config command fails. This patch makes sure that when both
> --live --config are set , qemuDomainDetachDeviceFlags is called
> twice, once with config xml and once with live xml.
> ---
> Change log:
> v4:
> * Code unchanged, updated with commit message,change log
>   and steps to reproduce the issue..
>
> v3:
> * Created function vshDomainDetachInterface and called
>   it once/twice from cmdDetachInterface depending on
>   number of flags set (live/config/both). Passed the
>   correct xml(live/persistent) to it.
>
> v2:
> * Changes only in cmdDetachInterface to pass the right domain xml
>   depending on the flag set (live/config/both).
>
> v1:
> * Changes only in qemuDomainDetachDeviceFlags to set the right value
>   in dev and dev_copy.
>
> Steps to see the issue:
> virsh attach-interface --domain DomainName --type network --source default
> --mac 52:54:00:4b:76:5f --live --config
> virsh detach-interface --domain DomainName --type network --mac
> 52:54:00:4b:76:5f --live --config
> virsh attach-interface --domain DomainName --type network --source default
> --mac 52:54:00:4b:76:5f --live --config
> virsh detach-interface --domain DomainName --type network --mac
> 52:54:00:4b:76:5f --live --config
>
>  tools/virsh-domain.c | 104
> +++++++++++++++++++++++++++++++--------------------
>  1 file changed, 64 insertions(+), 40 deletions(-)
>
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 62acecb..a6abaf5 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -10801,40 +10801,21 @@ static const vshCmdOptDef
> opts_detach_interface[] = {
>      {.name = NULL}
>  };
>
> -static bool
> -cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
> +static bool
> +vshDomainDetachInterface(char *doc, unsigned int flags, virDomainPtr dom,
> vshControl *ctl, const vshCmd *cmd)
>  {
> -    virDomainPtr dom = NULL;
>      xmlDocPtr xml = NULL;
>      xmlXPathObjectPtr obj = NULL;
>      xmlXPathContextPtr ctxt = NULL;
>      xmlNodePtr cur = NULL, matchNode = NULL;
> -    char *detach_xml = NULL;
>      const char *mac = NULL, *type = NULL;
> -    char *doc = NULL;
> +    char *detach_xml = NULL;
> +    bool current = vshCommandOptBool(cmd, "current");
>      char buf[64];
>      int diff_mac;
>      size_t i;
>      int ret;
>      bool functionReturn = false;
> -    unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
> -    bool current = vshCommandOptBool(cmd, "current");
> -    bool config = vshCommandOptBool(cmd, "config");
> -    bool live = vshCommandOptBool(cmd, "live");
> -    bool persistent = vshCommandOptBool(cmd, "persistent");
> -
> -    VSH_EXCLUSIVE_OPTIONS_VAR(persistent, current);
> -
> -    VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
> -    VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
> -
> -    if (config || persistent)
> -        flags |= VIR_DOMAIN_AFFECT_CONFIG;
> -    if (live)
> -        flags |= VIR_DOMAIN_AFFECT_LIVE;
> -
> -    if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> -        return false;
>
>      if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0)
>          goto cleanup;
> @@ -10842,15 +10823,6 @@ cmdDetachInterface(vshControl *ctl, const vshCmd
> *cmd)
>      if (vshCommandOptStringReq(ctl, cmd, "mac", &mac) < 0)
>          goto cleanup;
>
> -    if (persistent &&
> -        virDomainIsActive(dom) == 1)
> -        flags |= VIR_DOMAIN_AFFECT_LIVE;
> -
> -    if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> -        doc = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
> -    else
> -        doc = virDomainGetXMLDesc(dom, 0);
> -
>      if (!doc)
>          goto cleanup;
>
> @@ -10918,23 +10890,75 @@ cmdDetachInterface(vshControl *ctl, const vshCmd
> *cmd)
>      else
>          ret = virDomainDetachDevice(dom, detach_xml);
>
> -    if (ret != 0) {
> -        vshError(ctl, "%s", _("Failed to detach interface"));
> -    } else {
> -        vshPrint(ctl, "%s", _("Interface detached successfully\n"));
> +    if (ret == 0)
>          functionReturn = true;
> -    }
>
>   cleanup:
> -    VIR_FREE(doc);
>      VIR_FREE(detach_xml);
> -    virDomainFree(dom);
> +    xmlFreeDoc(xml);
>      xmlXPathFreeObject(obj);
>      xmlXPathFreeContext(ctxt);
> -    xmlFreeDoc(xml);
>      return functionReturn;
>  }
>
> +static bool
> +cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
> +{
> +    virDomainPtr dom = NULL;
> +    unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT;
> +    char *doc_live = NULL, *doc_config = NULL;
> +    bool current = vshCommandOptBool(cmd, "current");
> +    bool config = vshCommandOptBool(cmd, "config");
> +    bool live = vshCommandOptBool(cmd, "live");
> +    bool persistent = vshCommandOptBool(cmd, "persistent");
> +    bool functionReturn = false;
> +
> +    VSH_EXCLUSIVE_OPTIONS_VAR(persistent, current);
> +
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, live);
> +    VSH_EXCLUSIVE_OPTIONS_VAR(current, config);
> +
> +    if (config || persistent)
> +        flags |= VIR_DOMAIN_AFFECT_CONFIG;
> +
> +    if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
> +        return false;
> +
> +    if (persistent &&
> +        virDomainIsActive(dom) == 1)
> +        flags |= VIR_DOMAIN_AFFECT_LIVE;
> +
> +    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> +         doc_config = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
> +         if (!(functionReturn = vshDomainDetachInterface(doc_config,
> flags, dom, ctl, cmd)))
> +            goto cleanup;
> +    }
> +
> +    if (live)
> +        flags |= VIR_DOMAIN_AFFECT_LIVE;
> +
> +    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> +        doc_live = virDomainGetXMLDesc(dom, 0);
> +
> +       if (flags & VIR_DOMAIN_AFFECT_CONFIG)
> +          flags &= (~VIR_DOMAIN_AFFECT_CONFIG);
> +
> +       functionReturn = vshDomainDetachInterface(doc_live, flags, dom,
> ctl, cmd);
> +    }
> +
> + cleanup:
> +    if (functionReturn == false) {
> +        vshError(ctl, "%s", _("Failed to detach interface"));
> +    } else {
> +        vshPrint(ctl, "%s", _("Interface detached successfully\n"));
> +        functionReturn = true;
> +    }
> +   VIR_FREE(doc_live);
> +   VIR_FREE(doc_config);
> +   virDomainFree(dom);
> +   return functionReturn;
> +}
> +
>  typedef enum {
>      VIRSH_FIND_DISK_NORMAL,
>      VIRSH_FIND_DISK_CHANGEABLE,
> --
> 1.8.3.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20160322/11c2a6a4/attachment-0001.htm>


More information about the libvir-list mailing list