On 8/26/26 10:46, shotor@shotor.com wrote:
From: shotor <shotor@shotor.com>
Libvirt reports Cloud Hypervisor domains as having unknown persistence.
Commit 85cf0e4f17ae added support for keeping a separate inactive definition for running domains, but it didn't persist domain definitions to disk or reload them when virtchd restarted. Meaning defined CH domains were still lost across daemon restarts and libvirt couldn't report them as persistent.
Follow the approach used by the QEMU driver: save domain definitions to disk when they are defined, reload them during driver initialization, remove the stored configuration when they are undefined, and roll back the in-memory definition if saving fails.
Also implement domainIsPersistent so libvirt reports the persistence state correctly.
Signed-off-by: shotor <shotor@shotor.com> --- src/ch/ch_conf.c | 13 +++++++--- src/ch/ch_conf.h | 1 + src/ch/ch_driver.c | 63 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 69 insertions(+), 8 deletions(-)
diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c index 6896683b7f..793ec33a10 100644 --- a/src/ch/ch_conf.c +++ b/src/ch/ch_conf.c @@ -178,22 +178,26 @@ virCHDriverConfigNew(bool privileged) cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR); cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR); cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR); - cfg->configDir = g_strdup(SYSCONFDIR "/libvirt"); + cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt"); + cfg->configDir = g_strdup_printf("%s/ch/domains", + cfg->configBaseDir); } else { g_autofree char *rundir = NULL; g_autofree char *cachedir = NULL; - g_autofree char *configbasedir = NULL; + const char *configbasedir = NULL;
This is going to leak the variable.
cachedir = virGetUserCacheDirectory(); - cfg->logDir = g_strdup_printf("%s/ch/log", cachedir);
rundir = virGetUserRuntimeDirectory(); cfg->stateDir = g_strdup_printf("%s/ch/run", rundir);
configbasedir = virGetUserConfigDirectory(); + cfg->saveDir = g_strdup_printf("%s/ch/save", configbasedir); - cfg->configDir = g_strdup_printf("%s/ch", configbasedir); + cfg->configBaseDir = g_strdup_printf("%s/ch", configbasedir); + cfg->configDir = g_strdup_printf("%s/domains", + cfg->configBaseDir); }
I'd rather have domain XMLs right under .../libvirt/ch/ directory, just like we do for other drivers. How about: virCHDriverConfig * virCHDriverConfigNew(bool privileged) { virCHDriverConfig *cfg; ... if (privileged) { cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR); cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR); cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR); cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt"); } else { g_autofree char *rundir = NULL; g_autofree char *cachedir = NULL; cachedir = virGetUserCacheDirectory(); cfg->logDir = g_strdup_printf("%s/ch/log", cachedir); rundir = virGetUserRuntimeDirectory(); cfg->stateDir = g_strdup_printf("%s/ch/run", rundir); cfg->configBaseDir = virGetUserConfigDirectory(); cfg->saveDir = g_strdup_printf("%s/ch/save", cfg->configBaseDir); } cfg->configDir = g_strdup_printf("%s/ch", cfg->configBaseDir); return cfg; } This would be compliant with other drivers. Michal