Currently, bhyve driver uses mainly constants for path, e.g. BHYVE_CONFIG_DIR. Move these paths to the driver configuration object. This is a preparation work for the session mode support which uses different paths.
Signed-off-by: Roman Bogorodskiy <[email protected]> --- src/bhyve/bhyve_conf.c | 12 +++++++ src/bhyve/bhyve_domain.c | 7 ++-- src/bhyve/bhyve_domain.h | 4 ++- src/bhyve/bhyve_driver.c | 76 ++++++++++++++++++++++----------------- src/bhyve/bhyve_process.c | 24 +++++++------ src/bhyve/bhyve_utils.h | 10 +++--- 6 files changed, 82 insertions(+), 51 deletions(-) diff --git a/src/bhyve/bhyve_conf.c b/src/bhyve/bhyve_conf.c index f9a657f402..e0439af6fa 100644 --- a/src/bhyve/bhyve_conf.c +++ b/src/bhyve/bhyve_conf.c @@ -57,12 +57,19 @@ virBhyveDriverConfigNew(void) if (!(cfg = virObjectNew(virBhyveDriverConfigClass))) return NULL; + cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt"); + cfg->firmwareDir = g_strdup(DATADIR "/uefi-firmware"); cfg->libDir = g_strdup_printf("%s/lib/libvirt/bhyve", LOCALSTATEDIR); cfg->nvramDir = g_strdup_printf("%s/nvram", cfg->libDir); cfg->ubootPath = g_strdup(DATADIR "/u-boot/u-boot-bhyve-arm64/u-boot.bin"); + cfg->configDir = g_strdup_printf("%s/bhyve", cfg->configBaseDir); + cfg->autostartDir = g_strdup_printf("%s/bhyve/autostart", cfg->configBaseDir); + cfg->stateDir = g_strdup_printf("%s/libvirt/bhyve", RUNSTATEDIR); + cfg->logDir = g_strdup_printf("%s/log/libvirt/bhyve", LOCALSTATEDIR); + cfg->bhyveloadTimeout = 300; cfg->bhyveloadTimeoutKill = 15; @@ -114,9 +121,14 @@ virBhyveDriverConfigDispose(void *obj) { struct _virBhyveDriverConfig *cfg = obj; + g_free(cfg->autostartDir); + g_free(cfg->configBaseDir); + g_free(cfg->configDir); g_free(cfg->firmwareDir); g_free(cfg->libDir); + g_free(cfg->logDir); g_free(cfg->nvramDir); + g_free(cfg->stateDir); g_free(cfg->ubootPath); } diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 3ecb1d52cb..3588557979 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -799,14 +799,15 @@ virBhyveDomainObjStopWorker(virDomainObj *dom) } int -bhyveDomainNamePathsCleanup(const char *name, +bhyveDomainNamePathsCleanup(virBhyveDriverConfig *cfg, + const char *name, bool bestEffort) { g_autofree char *cfg_file = NULL; g_autofree char *autostart_link = NULL; - cfg_file = virDomainConfigFile(BHYVE_CONFIG_DIR, name); - autostart_link = virDomainConfigFile(BHYVE_AUTOSTART_DIR, name); + cfg_file = virDomainConfigFile(cfg->configDir, name); + autostart_link = virDomainConfigFile(cfg->autostartDir, name); if (virFileExists(cfg_file) && unlink(cfg_file) < 0) { diff --git a/src/bhyve/bhyve_domain.h b/src/bhyve/bhyve_domain.h index c9fa776651..1bf6bace71 100644 --- a/src/bhyve/bhyve_domain.h +++ b/src/bhyve/bhyve_domain.h @@ -54,7 +54,9 @@ extern virXMLNamespace virBhyveDriverDomainXMLNamespace; int virBhyveDomainObjStartWorker(virDomainObj *dom); void virBhyveDomainObjStopWorker(virDomainObj *dom); -int bhyveDomainNamePathsCleanup(const char *name, bool bestEffort); +int bhyveDomainNamePathsCleanup(virBhyveDriverConfig *cfg, + const char *name, + bool bestEffort); int bhyveValidateLifecycleAction(virDomainLifecycleAction onPoweroff, virDomainLifecycleAction onReboot, virDomainLifecycleAction onCrash); diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index cf4e918472..7e8cc572e4 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -387,10 +387,12 @@ bhyveDomainGetAutostart(virDomainPtr domain, int *autostart) static int bhyveDomainSetAutostart(virDomainPtr domain, int autostart) { + struct _bhyveConn *privconn = domain->conn->privateData; virDomainObj *vm; char *configFile = NULL; char *autostartLink = NULL; int ret = -1; + g_autoptr(virBhyveDriverConfig) cfg = NULL; if (!(vm = bhyveDomObjFromDomain(domain))) goto cleanup; @@ -406,15 +408,17 @@ bhyveDomainSetAutostart(virDomainPtr domain, int autostart) autostart = (autostart != 0); + cfg = virBhyveDriverGetConfig(privconn); + if (vm->autostart != autostart) { - configFile = virDomainConfigFile(BHYVE_CONFIG_DIR, vm->def->name); - autostartLink = virDomainConfigFile(BHYVE_AUTOSTART_DIR, vm->def->name); + configFile = virDomainConfigFile(cfg->configDir, vm->def->name); + autostartLink = virDomainConfigFile(cfg->autostartDir, vm->def->name); if (autostart) { - if (g_mkdir_with_parents(BHYVE_AUTOSTART_DIR, 0777) < 0) { + if (g_mkdir_with_parents(cfg->autostartDir, 0777) < 0) { virReportSystemError(errno, _("cannot create autostart directory %1$s"), - BHYVE_AUTOSTART_DIR); + cfg->autostartDir); goto cleanup; } @@ -541,6 +545,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag virDomainObj *vm = NULL; virObjectEvent *event = NULL; g_autoptr(virCaps) caps = NULL; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE; @@ -579,7 +584,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag vm->persistent = 1; if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, - privconn->xmlopt, BHYVE_CONFIG_DIR) < 0) { + privconn->xmlopt, cfg->configDir) < 0) { virDomainObjListRemove(privconn->domains, vm); goto cleanup; } @@ -612,6 +617,7 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int flags) virObjectEvent *event = NULL; virDomainObj *vm; g_autofree char *nvram_path = NULL; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); int ret = -1; virCheckFlags(VIR_DOMAIN_UNDEFINE_NVRAM | @@ -656,8 +662,8 @@ bhyveDomainUndefineFlags(virDomainPtr domain, unsigned int flags) } } - if (virDomainDeleteConfig(BHYVE_CONFIG_DIR, - BHYVE_AUTOSTART_DIR, + if (virDomainDeleteConfig(cfg->configDir, + cfg->autostartDir, vm) < 0) goto cleanup; @@ -1268,6 +1274,7 @@ bhyveDomainSetMetadata(virDomainPtr dom, virConnectPtr conn = dom->conn; struct _bhyveConn *privconn = conn->privateData; virDomainObj *vm; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); int ret = -1; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -1280,8 +1287,8 @@ bhyveDomainSetMetadata(virDomainPtr dom, goto cleanup; ret = virDomainObjSetMetadata(vm, type, metadata, key, uri, - privconn->xmlopt, BHYVE_STATE_DIR, - BHYVE_CONFIG_DIR, flags); + privconn->xmlopt, cfg->stateDir, + cfg->configDir, flags); if (ret == 0) { virObjectEvent *ev = NULL; @@ -1370,13 +1377,13 @@ bhyveStateCleanup(void) virObjectUnref(bhyve_driver->xmlopt); virSysinfoDefFree(bhyve_driver->hostsysinfo); virObjectUnref(bhyve_driver->domainEventState); - virObjectUnref(bhyve_driver->config); virPortAllocatorRangeFree(bhyve_driver->remotePorts); if (bhyve_driver->lockFD != -1) - virPidFileRelease(BHYVE_STATE_DIR, "driver", bhyve_driver->lockFD); + virPidFileRelease(bhyve_driver->config->stateDir, "driver", bhyve_driver->lockFD); virMutexDestroy(&bhyve_driver->lock); + virObjectUnref(bhyve_driver->config); VIR_FREE(bhyve_driver->pidfile); VIR_FREE(bhyve_driver); @@ -1391,6 +1398,7 @@ bhyveStateInitialize(bool privileged, void *opaque G_GNUC_UNUSED) { virDomainDriverAutoStartConfig autostartCfg; + virBhyveDriverConfig *cfg; if (root != NULL) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1435,40 +1443,40 @@ bhyveStateInitialize(bool privileged, bhyve_driver->hostsysinfo = virSysinfoRead(); - if (!(bhyve_driver->config = virBhyveDriverConfigNew())) + if (!(bhyve_driver->config = cfg = virBhyveDriverConfigNew())) goto cleanup; if (virBhyveLoadDriverConfig(bhyve_driver->config, SYSCONFDIR "/libvirt/bhyve.conf") < 0) goto cleanup; - if (g_mkdir_with_parents(BHYVE_LOG_DIR, 0777) < 0) { + if (g_mkdir_with_parents(cfg->logDir, 0777) < 0) { virReportSystemError(errno, _("Failed to mkdir %1$s"), - BHYVE_LOG_DIR); + cfg->logDir); goto cleanup; } - if (g_mkdir_with_parents(BHYVE_STATE_DIR, 0777) < 0) { + if (g_mkdir_with_parents(cfg->stateDir, 0777) < 0) { virReportSystemError(errno, _("Failed to mkdir %1$s"), - BHYVE_STATE_DIR); + cfg->stateDir); goto cleanup; } if ((bhyve_driver->lockFD = - virPidFileAcquire(BHYVE_STATE_DIR, "driver", getpid())) < 0) + virPidFileAcquire(cfg->stateDir, "driver", getpid())) < 0) goto cleanup; if (virDomainObjListLoadAllConfigs(bhyve_driver->domains, - BHYVE_STATE_DIR, + cfg->stateDir, NULL, true, bhyve_driver->xmlopt, NULL, NULL) < 0) goto cleanup; if (virDomainObjListLoadAllConfigs(bhyve_driver->domains, - BHYVE_CONFIG_DIR, - BHYVE_AUTOSTART_DIR, false, + cfg->configDir, + cfg->autostartDir, false, bhyve_driver->xmlopt, NULL, NULL) < 0) goto cleanup; @@ -1476,7 +1484,7 @@ bhyveStateInitialize(bool privileged, virBhyveProcessReconnectAll(bhyve_driver); autostartCfg = (virDomainDriverAutoStartConfig) { - .stateDir = BHYVE_STATE_DIR, + .stateDir = cfg->stateDir, .callback = bhyveAutostartDomain, .opaque = bhyve_driver, }; @@ -2335,6 +2343,7 @@ bhyveDomainSetMemoryParameters(virDomainPtr domain, virDomainDef *persistentDef = NULL; virDomainObj *vm = NULL; int ret = -1; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); unsigned long long hard_limit = 0; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -2373,14 +2382,14 @@ bhyveDomainSetMemoryParameters(virDomainPtr domain, goto endjob; def->mem.hard_limit = hard_limit; - if (virDomainObjSave(vm, privconn->xmlopt, BHYVE_STATE_DIR) < 0) + if (virDomainObjSave(vm, privconn->xmlopt, cfg->stateDir) < 0) VIR_WARN("Failed to save status on vm %s", vm->def->name); } if (persistentDef) { persistentDef->mem.hard_limit = hard_limit; - if (virDomainDefSave(persistentDef, privconn->xmlopt, BHYVE_CONFIG_DIR) < 0) + if (virDomainDefSave(persistentDef, privconn->xmlopt, cfg->configDir) < 0) goto endjob; } @@ -2697,6 +2706,7 @@ bhyveDomainRenameCallback(virDomainObj *vm, g_autofree char *old_dom_name = NULL; g_autofree char *new_dom_cfg_file = NULL; g_autofree char *new_dom_autostart_link = NULL; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); virCheckFlags(0, ret); @@ -2708,13 +2718,13 @@ bhyveDomainRenameCallback(virDomainObj *vm, new_dom_name = g_strdup(new_name); - new_dom_cfg_file = virDomainConfigFile(BHYVE_CONFIG_DIR, new_dom_name); + new_dom_cfg_file = virDomainConfigFile(cfg->configDir, new_dom_name); - if (bhyveDomainNamePathsCleanup(new_name, false) < 0) + if (bhyveDomainNamePathsCleanup(cfg, new_name, false) < 0) goto cleanup; if (vm->autostart) { - new_dom_autostart_link = virDomainConfigFile(BHYVE_AUTOSTART_DIR, new_dom_name); + new_dom_autostart_link = virDomainConfigFile(cfg->autostartDir, new_dom_name); if (symlink(new_dom_cfg_file, new_dom_autostart_link) < 0) { virReportSystemError(errno, @@ -2728,7 +2738,7 @@ bhyveDomainRenameCallback(virDomainObj *vm, old_dom_name = g_steal_pointer(&vm->def->name); vm->def->name = g_steal_pointer(&new_dom_name); - if (virDomainDefSave(vm->def, privconn->xmlopt, BHYVE_CONFIG_DIR) < 0) + if (virDomainDefSave(vm->def, privconn->xmlopt, cfg->configDir) < 0) goto cleanup; event_old = virDomainEventLifecycleNew(vm->def->id, old_dom_name, vm->def->uuid, @@ -2750,9 +2760,9 @@ bhyveDomainRenameCallback(virDomainObj *vm, } virErrorPreserveLast(&err); - bhyveDomainNamePathsCleanup(new_dom_name, true); + bhyveDomainNamePathsCleanup(cfg, new_dom_name, true); } else { - bhyveDomainNamePathsCleanup(old_dom_name, true); + bhyveDomainNamePathsCleanup(cfg, old_dom_name, true); } virErrorRestore(&err); @@ -2865,6 +2875,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain, virDomainObj *vm = NULL; virDomainDef *def = NULL; virDomainDef *persistentDef = NULL; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); int ret = -1; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | @@ -2893,7 +2904,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain, bhyveDomainModifyLifecycleAction(def, type, action); if (virDomainObjSave(vm, privconn->xmlopt, - BHYVE_STATE_DIR) < 0) + cfg->stateDir) < 0) goto endjob; } @@ -2901,7 +2912,7 @@ bhyveDomainSetLifecycleAction(virDomainPtr domain, bhyveDomainModifyLifecycleAction(persistentDef, type, action); if (virDomainDefSave(persistentDef, privconn->xmlopt, - BHYVE_CONFIG_DIR) < 0) + cfg->configDir) < 0) goto endjob; } @@ -2923,6 +2934,7 @@ bhyveDomainAgentSetResponseTimeout(virDomainPtr domain, virDomainObj *vm = NULL; bhyveDomainObjPrivate *priv = NULL; struct _bhyveConn *privconn = domain->conn->privateData; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(privconn); int ret = -1; virCheckFlags(0, -1); @@ -2950,7 +2962,7 @@ bhyveDomainAgentSetResponseTimeout(virDomainPtr domain, priv->agentTimeout = timeout; if (virDomainObjIsActive(vm)) { - if (virDomainObjSave(vm, privconn->xmlopt, BHYVE_STATE_DIR) < 0) + if (virDomainObjSave(vm, privconn->xmlopt, cfg->stateDir) < 0) VIR_WARN("Failed to save status on vm %s", vm->def->name); } diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 65cf61c578..4144f8230e 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -32,6 +32,7 @@ #include <net/if.h> #include <net/if_tap.h> +#include "bhyve_conf.h" #include "bhyve_device.h" #include "bhyve_driver.h" #include "bhyve_capabilities.h" @@ -98,9 +99,12 @@ bhyveNetCleanup(virDomainObj *vm) } static void -virBhyveFormatDevMapFile(const char *vm_name, char **fn_out) +virBhyveFormatDevMapFile(virBhyveDriverConfig *cfg, + const char *vm_name, + char **fn_out) { - *fn_out = g_strdup_printf("%s/grub_bhyve-%s-device.map", BHYVE_STATE_DIR, vm_name); + *fn_out = g_strdup_printf("%s/grub_bhyve-%s-device.map", + cfg->stateDir, vm_name); } static int @@ -307,8 +311,9 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver, virTimeBackOffVar timebackoff; int ret = -1, rc; bool vmm_appeared = false; + g_autoptr(virBhyveDriverConfig) cfg = virBhyveDriverGetConfig(driver); - logfile = g_strdup_printf("%s/%s.log", BHYVE_LOG_DIR, vm->def->name); + logfile = g_strdup_printf("%s/%s.log", cfg->logDir, vm->def->name); if ((logfd = open(logfile, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR)) < 0) { virReportSystemError(errno, @@ -318,7 +323,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver, } VIR_FREE(driver->pidfile); - if (!(driver->pidfile = virPidFileBuildPath(BHYVE_STATE_DIR, + if (!(driver->pidfile = virPidFileBuildPath(cfg->stateDir, vm->def->name))) { virReportSystemError(errno, "%s", _("Failed to build pidfile path")); @@ -351,7 +356,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver, * domain is ready to be started, so we can build * and execute bhyveload command */ - virBhyveFormatDevMapFile(vm->def->name, &devmap_file); + virBhyveFormatDevMapFile(cfg, vm->def->name, &devmap_file); if (!(load_cmd = virBhyveProcessBuildLoadCmd(driver, vm->def, devmap_file, &devicemap))) @@ -417,8 +422,7 @@ virBhyveProcessStartImpl(struct _bhyveConn *driver, if (virBhyveDomainObjStartWorker(vm) < 0) goto cleanup; - if (virDomainObjSave(vm, driver->xmlopt, - BHYVE_STATE_DIR) < 0) + if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) goto cleanup; if (bhyveSetResourceLimits(driver, vm) < 0) @@ -729,8 +733,8 @@ virBhyveProcessStopImpl(struct _bhyveConn *driver, if (vm_started) bhyveProcessStopHook(driver, vm, VIR_HOOK_BHYVE_OP_RELEASE); - virPidFileDelete(BHYVE_STATE_DIR, vm->def->name); - bhyveProcessRemoveDomainStatus(BHYVE_STATE_DIR, vm->def->name); + virPidFileDelete(driver->config->stateDir, vm->def->name); + bhyveProcessRemoveDomainStatus(driver->config->stateDir, vm->def->name); if (restoreDef) virDomainObjRemoveTransientDef(vm); @@ -891,7 +895,7 @@ virBhyveProcessReconnect(virDomainObj *vm, VIR_DOMAIN_SHUTOFF_UNKNOWN); virDomainObjRemoveTransientDef(vm); ignore_value(virDomainObjSave(vm, data->driver->xmlopt, - BHYVE_STATE_DIR)); + data->driver->config->stateDir)); } virObjectUnlock(vm); diff --git a/src/bhyve/bhyve_utils.h b/src/bhyve/bhyve_utils.h index 19369047fe..5d04b42195 100644 --- a/src/bhyve/bhyve_utils.h +++ b/src/bhyve/bhyve_utils.h @@ -29,18 +29,18 @@ #include "hypervisor/virclosecallbacks.h" #include "virportallocator.h" -#define BHYVE_AUTOSTART_DIR SYSCONFDIR "/libvirt/bhyve/autostart" -#define BHYVE_CONFIG_DIR SYSCONFDIR "/libvirt/bhyve" -#define BHYVE_STATE_DIR RUNSTATEDIR "/libvirt/bhyve" -#define BHYVE_LOG_DIR LOCALSTATEDIR "/log/libvirt/bhyve" - typedef struct _virBhyveDriverConfig virBhyveDriverConfig; struct _virBhyveDriverConfig { virObject parent; + char *autostartDir; + char *configBaseDir; + char *configDir; char *firmwareDir; char *libDir; + char *logDir; char *nvramDir; + char *stateDir; char *ubootPath; -- 2.55.0
