On 9/4/25 14:10, Stefan Kober wrote:
> On-behalf-of: SAP stefan.ko...@sap.com
> Signed-off-by: Stefan Kober <stefan.ko...@cyberus-technology.de>
> ---
>  src/ch/ch_driver.c  | 44 +++++++++++++++++++++++++++++++++++++++++
>  src/ch/ch_hotplug.c | 48 ++++++++++++++++++++++++++++++++++++++++-----
>  2 files changed, 87 insertions(+), 5 deletions(-)
> 
> diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
> index cf6874f22e..4f4783efb1 100644
> --- a/src/ch/ch_driver.c
> +++ b/src/ch/ch_driver.c
> @@ -25,6 +25,7 @@
>  #include "ch_conf.h"
>  #include "ch_domain.h"
>  #include "ch_driver.h"
> +#include "ch_hotplug.h"
>  #include "ch_monitor.h"
>  #include "ch_process.h"
>  #include "domain_cgroup.h"
> @@ -2344,6 +2345,47 @@ chDomainInterfaceAddresses(virDomain *dom,
>      return ret;
>  }
>  
> +static int
> +chDomainAttachDeviceFlags(virDomainPtr dom,
> +                          const char *xml,
> +                          unsigned int flags)
> +{
> +    virCHDriver *driver = dom->conn->privateData;
> +    virDomainObj *vm = NULL;
> +    int ret = -1;
> +
> +    if (!(vm = virCHDomainObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (virDomainAttachDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
> +        goto cleanup;
> +
> +    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
> +        goto cleanup;
> +
> +    if (virDomainObjUpdateModificationImpact(vm, &flags) < 0)
> +        goto endjob;
> +
> +    if (chDomainAttachDeviceLiveAndUpdateConfig(vm, driver, xml, flags) < 0) 
> {
> +        goto endjob;
> +    }
> +
> +    ret = 0;
> +
> + endjob:
> +    virDomainObjEndJob(vm);
> +
> + cleanup:
> +    virDomainObjEndAPI(&vm);
> +    return ret;
> +}
> +
> +static int
> +chDomainAttachDevice(virDomainPtr dom,
> +                     const char *xml)
> +{
> +    return chDomainAttachDeviceFlags(dom, xml, VIR_DOMAIN_AFFECT_LIVE);
> +}
>  
>  /* Function Tables */
>  static virHypervisorDriver chHypervisorDriver = {
> @@ -2406,6 +2448,8 @@ static virHypervisorDriver chHypervisorDriver = {
>      .connectDomainEventRegisterAny = chConnectDomainEventRegisterAny,       
> /* 10.10.0 */
>      .connectDomainEventDeregisterAny = chConnectDomainEventDeregisterAny,   
> /* 10.10.0 */
>      .domainInterfaceAddresses = chDomainInterfaceAddresses, /* 11.0.0 */
> +    .domainAttachDevice = chDomainAttachDevice, /* 11.8.0 */
> +    .domainAttachDeviceFlags = chDomainAttachDeviceFlags, /* 11.8.0 */
>  };
>  
>  static virConnectDriver chConnectDriver = {

Until here the change makes sense. But what's below should be part of
previous patch.

> diff --git a/src/ch/ch_hotplug.c b/src/ch/ch_hotplug.c
> index 7de688dc44..524355b93c 100644
> --- a/src/ch/ch_hotplug.c
> +++ b/src/ch/ch_hotplug.c
> @@ -50,7 +50,6 @@ chDomainAddDisk(virCHMonitor *mon, virDomainObj *vm, 
> virDomainDiskDef *disk)
>      return 0;
>  }
>  
> -G_GNUC_UNUSED
>  static int
>  chDomainAttachDeviceLive(virDomainObj *vm,
>                           virDomainDeviceDef *dev)
> @@ -108,13 +107,52 @@ chDomainAttachDeviceLive(virDomainObj *vm,
>  }
>  
>  int
> -chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj *vm G_GNUC_UNUSED,
> -                                        virCHDriver *driver G_GNUC_UNUSED,
> -                                        const char *xml G_GNUC_UNUSED,
> +chDomainAttachDeviceLiveAndUpdateConfig(virDomainObj *vm,
> +                                        virCHDriver *driver,
> +                                        const char *xml,
>                                          unsigned int flags)
>  {
> +    unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE |
> +                               VIR_DOMAIN_DEF_PARSE_ABI_UPDATE;
> +    g_autoptr(virDomainDeviceDef) devLive = NULL;
> +    g_autoptr(virDomainDef) vmdef = NULL;
> +    g_autoptr(virCHDriverConfig) cfg = NULL;
> +    g_autoptr(virDomainDeviceDef) devConf = NULL;
> +
>      virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
>                    VIR_DOMAIN_AFFECT_CONFIG, -1);
>  
> -    return -1;
> +    cfg = virCHDriverGetConfig(driver);
> +
> +    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("Persistent domain state changes are not 
> supported"));

At first I was a bit puzzled why have this at all. I mean,
virCheckFlags() could have just contained _AFFECT_LIVE but then it hit
me: this produces much more descriptive error message. So let's keep it
then.

> +        return -1;
> +    }
> +
> +    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> +        if (!(devLive = virDomainDeviceDefParse(xml, vm->def,
> +                                                driver->xmlopt, NULL,
> +                                                parse_flags))) {
> +            return -1;
> +        }
> +
> +        if (virDomainDeviceValidateAliasForHotplug(vm, devLive,
> +                                                   VIR_DOMAIN_AFFECT_LIVE) < 
> 0)
> +            return -1;
> +
> +        if (virDomainDefCompatibleDevice(vm->def, devLive, NULL,
> +                                        VIR_DOMAIN_DEVICE_ACTION_ATTACH,
> +                                        true) < 0) {
> +            return -1;
> +        }
> +
> +        if (chDomainAttachDeviceLive(vm, devLive) < 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                        _("Failed to add device"));
> +            return -1;
> +        }
> +    }
> +
> +    return 0;
>  }

Michal

Reply via email to