[libvirt] [PATCH 8/9] domain{Attach, Detach}DeviceFlags handler for drivers

Daniel P. Berrange berrange at redhat.com
Tue Jan 19 19:43:01 UTC 2010


On Thu, Jan 14, 2010 at 10:42:45AM -0700, Jim Fehlig wrote:
> Implementation of domain{Attach,Detach}DeviceFlags handlers
> in the drivers.
> ---
>  src/esx/esx_driver.c        |    2 +
>  src/lxc/lxc_driver.c        |    2 +
>  src/opennebula/one_driver.c |    2 +
>  src/openvz/openvz_driver.c  |    2 +
>  src/phyp/phyp_driver.c      |    2 +
>  src/qemu/qemu_driver.c      |   26 +++++++++++
>  src/test/test_driver.c      |    2 +
>  src/uml/uml_driver.c        |    2 +
>  src/vbox/vbox_tmpl.c        |   24 ++++++++++
>  src/xen/proxy_internal.c    |    4 +-
>  src/xen/xen_driver.c        |   42 +++++++++++++++++--
>  src/xen/xen_driver.h        |    4 +-
>  src/xen/xen_hypervisor.c    |    4 +-
>  src/xen/xen_inotify.c       |    4 +-
>  src/xen/xend_internal.c     |   98 +++++++++++++++++++++++++++++++++++--------
>  src/xen/xm_internal.c       |   30 +++++++++----
>  src/xen/xs_internal.c       |    4 +-
>  17 files changed, 212 insertions(+), 42 deletions(-)
> 
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index ddda66e..577c1c7 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -3443,7 +3443,9 @@ static virDriver esxDriver = {
>      esxDomainDefineXML,              /* domainDefineXML */
>      esxDomainUndefine,               /* domainUndefine */
>      NULL,                            /* domainAttachDevice */
> +    NULL,                            /* domainAttachDeviceFlags */
>      NULL,                            /* domainDetachDevice */
> +    NULL,                            /* domainDetachDeviceFlags */
>      NULL,                            /* domainGetAutostart */
>      NULL,                            /* domainSetAutostart */
>      esxDomainGetSchedulerType,       /* domainGetSchedulerType */
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 86606c7..d80f20c 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -2427,7 +2427,9 @@ static virDriver lxcDriver = {
>      lxcDomainDefine, /* domainDefineXML */
>      lxcDomainUndefine, /* domainUndefine */
>      NULL, /* domainAttachDevice */
> +    NULL, /* domainAttachDeviceFlags */
>      NULL, /* domainDetachDevice */
> +    NULL, /* domainDetachDeviceFlags */
>      lxcDomainGetAutostart, /* domainGetAutostart */
>      lxcDomainSetAutostart, /* domainSetAutostart */
>      lxcGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
> index ad7faca..509cbc3 100644
> --- a/src/opennebula/one_driver.c
> +++ b/src/opennebula/one_driver.c
> @@ -754,7 +754,9 @@ static virDriver oneDriver = {
>      oneDomainDefine, /* domainDefineXML */
>      oneDomainUndefine, /* domainUndefine */
>      NULL, /* domainAttachDevice */
> +    NULL, /* domainAttachDeviceFlags */
>      NULL, /* domainDetachDevice */
> +    NULL, /* domainDetachDeviceFlags */
>      oneGetAutostart, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 196fd8c..b16efef 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -1506,7 +1506,9 @@ static virDriver openvzDriver = {
>      openvzDomainDefineXML, /* domainDefineXML */
>      openvzDomainUndefine, /* domainUndefine */
>      NULL, /* domainAttachDevice */
> +    NULL, /* domainAttachDeviceFlags */
>      NULL, /* domainDetachDevice */
> +    NULL, /* domainDetachDeviceFlags */
>      openvzDomainGetAutostart, /* domainGetAutostart */
>      openvzDomainSetAutostart, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index bd5cfc7..5474bda 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -1622,7 +1622,9 @@ virDriver phypDriver = {
>      NULL,                       /* domainDefineXML */
>      NULL,                       /* domainUndefine */
>      NULL,                       /* domainAttachDevice */
> +    NULL,                       /* domainAttachDeviceFlags */
>      NULL,                       /* domainDetachDevice */
> +    NULL,                       /* domainDetachDeviceFlags */
>      NULL,                       /* domainGetAutostart */
>      NULL,                       /* domainSetAutostart */
>      NULL,                       /* domainGetSchedulerType */
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index deb8adc..02a6212 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5544,6 +5544,18 @@ cleanup:
>      return ret;
>  }
>  
> +static int qemudDomainAttachDeviceFlags(virDomainPtr dom,
> +                                        const char *xml,
> +                                        unsigned int flags) {
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> +        qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
> +                         "%s", _("cannot modify the persistent configuration of a domain"));
> +        return -1;
> +    }
> +
> +    return qemudDomainAttachDevice(dom, xml);
> +}
> +
>  static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
>                                            struct qemud_driver *driver,
>                                            virDomainObjPtr vm,
> @@ -5872,6 +5884,18 @@ cleanup:
>      return ret;
>  }
>  
> +static int qemudDomainDetachDeviceFlags(virDomainPtr dom,
> +                                        const char *xml,
> +                                        unsigned int flags) {
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> +        qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
> +                         "%s", _("cannot modify the persistent configuration of a domain"));
> +        return -1;
> +    }
> +
> +    return qemudDomainDetachDevice(dom, xml);
> +}
> +
>  static int qemudDomainGetAutostart(virDomainPtr dom,
>                                     int *autostart) {
>      struct qemud_driver *driver = dom->conn->privateData;
> @@ -7985,7 +8009,9 @@ static virDriver qemuDriver = {
>      qemudDomainDefine, /* domainDefineXML */
>      qemudDomainUndefine, /* domainUndefine */
>      qemudDomainAttachDevice, /* domainAttachDevice */
> +    qemudDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
>      qemudDomainDetachDevice, /* domainDetachDevice */
> +    qemudDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
>      qemudDomainGetAutostart, /* domainGetAutostart */
>      qemudDomainSetAutostart, /* domainSetAutostart */
>      qemuGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 2122a1b..1feca1c 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
> @@ -5209,7 +5209,9 @@ static virDriver testDriver = {
>      testDomainDefineXML, /* domainDefineXML */
>      testDomainUndefine, /* domainUndefine */
>      NULL, /* domainAttachDevice */
> +    NULL, /* domainAttachDeviceFlags */
>      NULL, /* domainDetachDevice */
> +    NULL, /* domainDetachDeviceFlags */
>      testDomainGetAutostart, /* domainGetAutostart */
>      testDomainSetAutostart, /* domainSetAutostart */
>      testDomainGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index b808090..6adaf9f 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -1895,7 +1895,9 @@ static virDriver umlDriver = {
>      umlDomainDefine, /* domainDefineXML */
>      umlDomainUndefine, /* domainUndefine */
>      NULL, /* domainAttachDevice */
> +    NULL, /* domainAttachDeviceFlags */
>      NULL, /* domainDetachDevice */
> +    NULL, /* domainDetachDeviceFlags */
>      umlDomainGetAutostart, /* domainGetAutostart */
>      umlDomainSetAutostart, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 07696c0..79915c2 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -4837,6 +4837,17 @@ cleanup:
>      return ret;
>  }
>  
> +static int vboxDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
> +                                       unsigned int flags) {
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> +        vboxError(dom->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                  _("cannot modify the persistent configuration of a domain"));
> +        return -1;
> +    }
> +
> +    return vboxDomainAttachDevice(dom, xml);
> +}
> +
>  static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml) {
>      VBOX_OBJECT_CHECK(dom->conn, int, -1);
>      IMachine *machine    = NULL;
> @@ -4967,6 +4978,17 @@ cleanup:
>      return ret;
>  }
>  
> +static int vboxDomainDetachDeviceFlags(virDomainPtr dom, const char *xml,
> +                                       unsigned int flags) {
> +    if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
> +        vboxError(dom->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                  _("cannot modify the persistent configuration of a domain"));
> +        return -1;
> +    }
> +
> +    return vboxDomainDetachDevice(dom, xml);
> +}
> +
>  #if VBOX_API_VERSION == 2002
>      /* No Callback support for VirtualBox 2.2.* series */
>  #else /* !(VBOX_API_VERSION == 2002) */
> @@ -7013,7 +7035,9 @@ virDriver NAME(Driver) = {
>      vboxDomainDefineXML, /* domainDefineXML */
>      vboxDomainUndefine, /* domainUndefine */
>      vboxDomainAttachDevice, /* domainAttachDevice */
> +    vboxDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
>      vboxDomainDetachDevice, /* domainDetachDevice */
> +    vboxDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/proxy_internal.c b/src/xen/proxy_internal.c
> index 73a0469..33f82c2 100644
> --- a/src/xen/proxy_internal.c
> +++ b/src/xen/proxy_internal.c
> @@ -76,8 +76,8 @@ struct xenUnifiedDriver xenProxyDriver = {
>      NULL, /* domainCreate */
>      NULL, /* domainDefineXML */
>      NULL, /* domainUndefine */
> -    NULL, /* domainAttachDevice */
> -    NULL, /* domainDetachDevice */
> +    NULL, /* domainAttachDeviceFlags */
> +    NULL, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 4911c9e..141e415 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -1426,10 +1426,26 @@ xenUnifiedDomainAttachDevice (virDomainPtr dom, const char *xml)
>  {
>      GET_PRIVATE(dom->conn);
>      int i;
> +    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
>  
>      for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (priv->opened[i] && drivers[i]->domainAttachDevice &&
> -            drivers[i]->domainAttachDevice (dom, xml) == 0)
> +        if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
> +            drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 0)
> +            return 0;
> +
> +    return -1;
> +}
> +
> +static int
> +xenUnifiedDomainAttachDeviceFlags (virDomainPtr dom, const char *xml,
> +                                   unsigned int flags)
> +{
> +    GET_PRIVATE(dom->conn);
> +    int i;
> +
> +    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> +        if (priv->opened[i] && drivers[i]->domainAttachDeviceFlags &&
> +            drivers[i]->domainAttachDeviceFlags(dom, xml, flags) == 0)
>              return 0;
>  
>      return -1;
> @@ -1440,10 +1456,26 @@ xenUnifiedDomainDetachDevice (virDomainPtr dom, const char *xml)
>  {
>      GET_PRIVATE(dom->conn);
>      int i;
> +    unsigned int flags = VIR_DOMAIN_DEVICE_MODIFY_LIVE;
> +
> +    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> +        if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
> +            drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
> +            return 0;
> +
> +    return -1;
> +}
> +
> +static int
> +xenUnifiedDomainDetachDeviceFlags (virDomainPtr dom, const char *xml,
> +                                   unsigned int flags)
> +{
> +    GET_PRIVATE(dom->conn);
> +    int i;
>  
>      for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (priv->opened[i] && drivers[i]->domainDetachDevice &&
> -            drivers[i]->domainDetachDevice (dom, xml) == 0)
> +        if (priv->opened[i] && drivers[i]->domainDetachDeviceFlags &&
> +            drivers[i]->domainDetachDeviceFlags(dom, xml, flags) == 0)
>              return 0;
>  
>      return -1;
> @@ -1833,7 +1865,9 @@ static virDriver xenUnifiedDriver = {
>      xenUnifiedDomainDefineXML, /* domainDefineXML */
>      xenUnifiedDomainUndefine, /* domainUndefine */
>      xenUnifiedDomainAttachDevice, /* domainAttachDevice */
> +    xenUnifiedDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
>      xenUnifiedDomainDetachDevice, /* domainDetachDevice */
> +    xenUnifiedDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
>      xenUnifiedDomainGetAutostart, /* domainGetAutostart */
>      xenUnifiedDomainSetAutostart, /* domainSetAutostart */
>      xenUnifiedDomainGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
> index 185eb2b..defe6e2 100644
> --- a/src/xen/xen_driver.h
> +++ b/src/xen/xen_driver.h
> @@ -93,8 +93,8 @@ struct xenUnifiedDriver {
>          virDrvDomainCreate		domainCreate;
>          virDrvDomainDefineXML           domainDefineXML;
>          virDrvDomainUndefine            domainUndefine;
> -        virDrvDomainAttachDevice	domainAttachDevice;
> -        virDrvDomainDetachDevice	domainDetachDevice;
> +        virDrvDomainAttachDeviceFlags	domainAttachDeviceFlags;
> +        virDrvDomainDetachDeviceFlags	domainDetachDeviceFlags;
>          virDrvDomainGetAutostart	domainGetAutostart;
>          virDrvDomainSetAutostart	domainSetAutostart;
>          virDrvDomainGetSchedulerType	domainGetSchedulerType;
> diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
> index 6d8accc..baa626f 100644
> --- a/src/xen/xen_hypervisor.c
> +++ b/src/xen/xen_hypervisor.c
> @@ -793,8 +793,8 @@ struct xenUnifiedDriver xenHypervisorDriver = {
>      NULL, /* domainCreate */
>      NULL, /* domainDefineXML */
>      NULL, /* domainUndefine */
> -    NULL, /* domainAttachDevice */
> -    NULL, /* domainDetachDevice */
> +    NULL, /* domainAttachDeviceFlags */
> +    NULL, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      xenHypervisorGetSchedulerType, /* domainGetSchedulerType */
> diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
> index d9dfbb7..e3845d8 100644
> --- a/src/xen/xen_inotify.c
> +++ b/src/xen/xen_inotify.c
> @@ -79,8 +79,8 @@ struct xenUnifiedDriver xenInotifyDriver = {
>      NULL, /* domainCreate */
>      NULL, /* domainDefineXML */
>      NULL, /* domainUndefine */
> -    NULL, /* domainAttachDevice */
> -    NULL, /* domainDetachDevice */
> +    NULL, /* domainAttachDeviceFlags */
> +    NULL, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index d9bfa15..665bc47 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -4096,9 +4096,10 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
>  }
>  
>  /**
> - * xenDaemonAttachDevice:
> + * xenDaemonAttachDeviceFlags:
>   * @domain: pointer to domain object
>   * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
>   *
>   * Create a virtual device attachment to backend.
>   * XML description is translated into S-expression.
> @@ -4106,7 +4107,8 @@ xenDaemonCreateXML(virConnectPtr conn, const char *xmlDesc,
>   * Returns 0 in case of success, -1 in case of failure.
>   */
>  static int
> -xenDaemonAttachDevice(virDomainPtr domain, const char *xml)
> +xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
> +                           unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv;
>      char *sexpr = NULL;
> @@ -4124,12 +4126,41 @@ xenDaemonAttachDevice(virDomainPtr domain, const char *xml)
>  
>      priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
>  
> -    /*
> -     * on older Xen without the inactive guests management
> -     * avoid doing this on inactive guests
> -     */
> -    if ((domain->id < 0) && (priv->xendConfigVersion < 3))
> -        return -1;
> +    if (domain->id < 0) {
> +        /* If xendConfigVersion < 3 only live config can be changed */
> +        if (priv->xendConfigVersion < 3) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend version does not support modifying "
> +                           "persisted config"));
> +            return -1;
> +        }
> +        /* Cannot modify live config if domain is inactive */
> +        if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Cannot modify live config if domain is inactive"));
> +            return -1;
> +        }
> +    } else {
> +        /* Only live config can be changed if xendConfigVersion < 3 */
> +        if (priv->xendConfigVersion < 3 &&
> +            (flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT ||
> +             flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend version does not support modifying "
> +                           "persisted config"));
> +            return -1;
> +        }
> +        /* Xen only supports modifying both live and persisted config if
> +         * xendConfigVersion >= 3
> +         */
> +        if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
> +                      VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend only supports modifying both live and "
> +                           "persisted config"));
> +            return -1;
> +        }
> +    }
>  
>      if (!(def = xenDaemonDomainFetch(domain->conn,
>                                       domain->id,
> @@ -4203,16 +4234,18 @@ cleanup:
>  }
>  
>  /**
> - * xenDaemonDetachDevice:
> + * xenDaemonDetachDeviceFlags:
>   * @domain: pointer to domain object
>   * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
>   *
>   * Destroy a virtual device attachment to backend.
>   *
>   * Returns 0 in case of success, -1 in case of failure.
>   */
>  static int
> -xenDaemonDetachDevice(virDomainPtr domain, const char *xml)
> +xenDaemonDetachDeviceFlags(virDomainPtr domain, const char *xml,
> +                           unsigned int flags)
>  {
>      xenUnifiedPrivatePtr priv;
>      char class[8], ref[80];
> @@ -4230,12 +4263,41 @@ xenDaemonDetachDevice(virDomainPtr domain, const char *xml)
>  
>      priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
>  
> -    /*
> -     * on older Xen without the inactive guests management
> -     * avoid doing this on inactive guests
> -     */
> -    if ((domain->id < 0) && (priv->xendConfigVersion < 3))
> -        return -1;
> +    if (domain->id < 0) {
> +        /* If xendConfigVersion < 3 only live config can be changed */
> +        if (priv->xendConfigVersion < 3) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend version does not support modifying "
> +                           "persisted config"));
> +            return -1;
> +        }
> +        /* Cannot modify live config if domain is inactive */
> +        if (flags & VIR_DOMAIN_DEVICE_MODIFY_LIVE) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Cannot modify live config if domain is inactive"));
> +            return -1;
> +        }
> +    } else {
> +        /* Only live config can be changed if xendConfigVersion < 3 */
> +        if (priv->xendConfigVersion < 3 &&
> +            (flags != VIR_DOMAIN_DEVICE_MODIFY_CURRENT ||
> +             flags != VIR_DOMAIN_DEVICE_MODIFY_LIVE)) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend version does not support modifying "
> +                           "persisted config"));
> +            return -1;
> +        }
> +        /* Xen only supports modifying both live and persisted config if
> +         * xendConfigVersion >= 3
> +         */
> +        if (flags != (VIR_DOMAIN_DEVICE_MODIFY_LIVE |
> +                      VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) {
> +            virXendError(domain->conn, VIR_ERR_OPERATION_INVALID, "%s",
> +                         _("Xend only supports modifying both live and "
> +                           "persisted config"));
> +            return -1;
> +        }
> +    }
>  
>      if (!(def = xenDaemonDomainFetch(domain->conn,
>                                       domain->id,
> @@ -5165,8 +5227,8 @@ struct xenUnifiedDriver xenDaemonDriver = {
>      xenDaemonDomainCreate,       /* domainCreate */
>      xenDaemonDomainDefineXML,    /* domainDefineXML */
>      xenDaemonDomainUndefine,     /* domainUndefine */
> -    xenDaemonAttachDevice,       /* domainAttachDevice */
> -    xenDaemonDetachDevice,       /* domainDetachDevice */
> +    xenDaemonAttachDeviceFlags,       /* domainAttachDeviceFlags */
> +    xenDaemonDetachDeviceFlags,       /* domainDetachDeviceFlags */
>      xenDaemonDomainGetAutostart, /* domainGetAutostart */
>      xenDaemonDomainSetAutostart, /* domainSetAutostart */
>      xenDaemonGetSchedulerType,   /* domainGetSchedulerType */
> diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
> index 944d5d5..43efe08 100644
> --- a/src/xen/xm_internal.c
> +++ b/src/xen/xm_internal.c
> @@ -65,8 +65,10 @@
>  static int xenXMConfigSetString(virConfPtr conf, const char *setting,
>                                  const char *str);
>  char * xenXMAutoAssignMac(void);
> -static int xenXMDomainAttachDevice(virDomainPtr domain, const char *xml);
> -static int xenXMDomainDetachDevice(virDomainPtr domain, const char *xml);
> +static int xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
> +                                        unsigned int flags);
> +static int xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
> +                                        unsigned int flags);
>  
>  #define XM_REFRESH_INTERVAL 10
>  
> @@ -109,8 +111,8 @@ struct xenUnifiedDriver xenXMDriver = {
>      xenXMDomainCreate, /* domainCreate */
>      xenXMDomainDefineXML, /* domainDefineXML */
>      xenXMDomainUndefine, /* domainUndefine */
> -    xenXMDomainAttachDevice, /* domainAttachDevice */
> -    xenXMDomainDetachDevice, /* domainDetachDevice */
> +    xenXMDomainAttachDeviceFlags, /* domainAttachDeviceFlags */
> +    xenXMDomainDetachDeviceFlags, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> @@ -2914,17 +2916,21 @@ cleanup:
>  
>  
>  /**
> - * xenXMDomainAttachDevice:
> + * xenXMDomainAttachDeviceFlags:
>   * @domain: pointer to domain object
>   * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
>   *
>   * Create a virtual device attachment to backend.
>   * XML description is translated into config file.
> + * This driver only supports device allocation to
> + * persisted config.
>   *
>   * Returns 0 in case of success, -1 in case of failure.
>   */
>  static int
> -xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
> +xenXMDomainAttachDeviceFlags(virDomainPtr domain, const char *xml,
> +                             unsigned int flags) {
>      const char *filename = NULL;
>      xenXMConfCachePtr entry = NULL;
>      int ret = -1;
> @@ -2940,7 +2946,7 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
>  
>      if (domain->conn->flags & VIR_CONNECT_RO)
>          return -1;
> -    if (domain->id != -1)
> +    if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
>          return -1;
>  
>      priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
> @@ -3002,16 +3008,20 @@ xenXMDomainAttachDevice(virDomainPtr domain, const char *xml) {
>  
>  
>  /**
> - * xenXMDomainDetachDevice:
> + * xenXMDomainDetachDeviceFlags:
>   * @domain: pointer to domain object
>   * @xml: pointer to XML description of device
> + * @flags: an OR'ed set of virDomainDeviceModifyFlags
>   *
>   * Destroy a virtual device attachment to backend.
> + * This driver only supports device deallocation from
> + * persisted config.
>   *
>   * Returns 0 in case of success, -1 in case of failure.
>   */
>  static int
> -xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
> +xenXMDomainDetachDeviceFlags(virDomainPtr domain, const char *xml,
> +                             unsigned int flags) {
>      const char *filename = NULL;
>      xenXMConfCachePtr entry = NULL;
>      virDomainDeviceDefPtr dev = NULL;
> @@ -3029,7 +3039,7 @@ xenXMDomainDetachDevice(virDomainPtr domain, const char *xml) {
>  
>      if (domain->conn->flags & VIR_CONNECT_RO)
>          return -1;
> -    if (domain->id != -1)
> +    if (domain->id != -1 && !(flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG))
>          return -1;
>  
>      priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
> diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
> index 8a64d4e..1db0397 100644
> --- a/src/xen/xs_internal.c
> +++ b/src/xen/xs_internal.c
> @@ -76,8 +76,8 @@ struct xenUnifiedDriver xenStoreDriver = {
>      NULL, /* domainCreate */
>      NULL, /* domainDefineXML */
>      NULL, /* domainUndefine */
> -    NULL, /* domainAttachDevice */
> -    NULL, /* domainDetachDevice */
> +    NULL, /* domainAttachDeviceFlags */
> +    NULL, /* domainDetachDeviceFlags */
>      NULL, /* domainGetAutostart */
>      NULL, /* domainSetAutostart */
>      NULL, /* domainGetSchedulerType */
> -- 

ACK, all looks good.


Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list