[libvirt] [PATCH v2 00/13] More refactoring of QEMU driver objects & locking

An update of https://www.redhat.com/archives/libvir-list/2013-January/msg01108.html This series does more general refactoring to help in the goal of killing the big QEMU driver lock. There are 3 key changes in this series - Isolating all QEMU configuration parameters in one struct. - Making virDomainObjList self-locking - Add dedicated locking to PCI/USB device lists There are all the really hard bits of the QEMU locking. As can be seen from the last patch there is still more work to be done before the QEMU driver lock can be said to be truely dead, but this is less critical. In v2: - Rebase, since previous series no longer applied to GIT

From: "Daniel P. Berrange" <berrange@redhat.com> Currently the virQEMUDriverPtr struct contains an wide variety of data with varying access needs. Move all the static config data into a dedicated virQEMUDriverConfigPtr object. The only locking requirement is to hold the driver lock, while obtaining an instance of virQEMUDriverConfigPtr. Once a reference is held on the config object, it can be used completely lockless since it is immutable. NB, not all APIs correctly hold the driver lock while getting a reference to the config object in this patch. This is safe for now since the config is never updated on the fly. Later patches will address this fully. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/qemu/qemu_cgroup.c | 28 +- src/qemu/qemu_command.c | 75 +-- src/qemu/qemu_conf.c | 402 ++++++++----- src/qemu/qemu_conf.h | 136 +++-- src/qemu/qemu_domain.c | 104 ++-- src/qemu/qemu_driver.c | 631 +++++++++++---------- src/qemu/qemu_hostdev.c | 17 +- src/qemu/qemu_hotplug.c | 185 +++--- src/qemu/qemu_migration.c | 49 +- src/qemu/qemu_process.c | 154 +++-- src/qemu/qemu_process.h | 2 +- tests/qemuargv2xmltest.c | 14 +- .../qemuxml2argv-graphics-vnc-tls.args | 2 +- tests/qemuxml2argvtest.c | 37 +- tests/qemuxmlnstest.c | 14 +- 15 files changed, 1099 insertions(+), 751 deletions(-) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 6527146..482989f 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -48,15 +48,20 @@ static const char *const defaultDeviceACL[] = { bool qemuCgroupControllerActive(virQEMUDriverPtr driver, int controller) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + bool ret = false; if (driver->cgroup == NULL) - return false; + goto cleanup; if (controller < 0 || controller >= VIR_CGROUP_CONTROLLER_LAST) - return false; + goto cleanup; if (!virCgroupMounted(driver->cgroup, controller)) - return false; - if (driver->cgroupControllers & (1 << controller)) - return true; - return false; + goto cleanup; + if (cfg->cgroupControllers & (1 << controller)) + ret = true; + +cleanup: + virObjectUnref(cfg); + return ret; } static int @@ -195,13 +200,14 @@ int qemuSetupCgroup(virQEMUDriverPtr driver, virCgroupPtr cgroup = NULL; int rc; unsigned int i; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); const char *const *deviceACL = - driver->cgroupDeviceACL ? - (const char *const *)driver->cgroupDeviceACL : + cfg->cgroupDeviceACL ? + (const char *const *)cfg->cgroupDeviceACL : defaultDeviceACL; if (driver->cgroup == NULL) - return 0; /* Not supported, so claim success */ + goto done; /* Not supported, so claim success */ rc = virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 1); if (rc != 0) { @@ -246,7 +252,7 @@ int qemuSetupCgroup(virQEMUDriverPtr driver, if (vm->def->nsounds && (!vm->def->ngraphics || ((vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC && - driver->vncAllowHostAudio) || + cfg->vncAllowHostAudio) || (vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL)))) { rc = virCgroupAllowDeviceMajor(cgroup, 'c', DEVICE_SND_MAJOR, VIR_CGROUP_DEVICE_RW); @@ -434,10 +440,12 @@ int qemuSetupCgroup(virQEMUDriverPtr driver, } } done: + virObjectUnref(cfg); virCgroupFree(&cgroup); return 0; cleanup: + virObjectUnref(cfg); if (cgroup) { virCgroupRemove(cgroup); virCgroupFree(&cgroup); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 981c692..2af7425 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -151,6 +151,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, int rc; char *res_ifname = NULL; int vnet_hdr = 0; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (qemuCapsGet(caps, QEMU_CAPS_VNET_HDR) && net->model && STREQ(net->model, "virtio")) @@ -163,7 +164,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, true, vnet_hdr, def->uuid, virDomainNetGetActualVirtPortProfile(net), &res_ifname, - vmop, driver->stateDir, + vmop, cfg->stateDir, virDomainNetGetActualBandwidth(net)); if (rc >= 0) { if (virSecurityManagerSetTapFDLabel(driver->securityManager, @@ -175,6 +176,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, net->ifname = res_ifname; } + virObjectUnref(cfg); return rc; error: @@ -183,8 +185,9 @@ error: virDomainNetGetActualDirectDev(net), virDomainNetGetActualDirectMode(net), virDomainNetGetActualVirtPortProfile(net), - driver->stateDir)); + cfg->stateDir)); VIR_FREE(res_ifname); + virObjectUnref(cfg); return -1; } @@ -202,6 +205,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, unsigned int tap_create_flags = VIR_NETDEV_TAP_CREATE_IFUP; bool template_ifname = false; int actualType = virDomainNetGetActualType(net); + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) { int active, fail = 0; @@ -277,7 +281,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, tapfd = -1; } - if (driver->macFilter) { + if (cfg->macFilter) { if ((err = networkAllowMacOnPort(driver, net->ifname, &net->mac))) { virReportSystemError(err, _("failed to add ebtables rule to allow MAC address on '%s'"), @@ -305,6 +309,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, cleanup: VIR_FREE(brname); + virObjectUnref(cfg); return tapfd; } @@ -3260,6 +3265,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, virBuffer buf = VIR_BUFFER_INITIALIZER; enum virDomainNetType netType = virDomainNetGetActualType(net); const char *brname = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (net->script && netType != VIR_DOMAIN_NET_TYPE_ETHERNET) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -3275,7 +3281,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, * through, -net tap,fd */ case VIR_DOMAIN_NET_TYPE_BRIDGE: - if (!driver->privileged && + if (!cfg->privileged && qemuCapsGet(caps, QEMU_CAPS_NETDEV_BRIDGE)) { brname = virDomainNetGetActualBridgeName(net); virBufferAsprintf(&buf, "bridge%cbr=%s", type_sep, brname); @@ -3351,6 +3357,8 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, virBufferAsprintf(&buf, ",sndbuf=%lu", net->tune.sndbuf); } + virObjectUnref(cfg); + if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); @@ -4674,7 +4682,7 @@ error: } static int -qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, +qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg, virCommandPtr cmd, virDomainDefPtr def, qemuCapsPtr caps, @@ -4692,11 +4700,11 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, } if (graphics->data.vnc.socket || - driver->vncAutoUnixSocket) { + cfg->vncAutoUnixSocket) { if (!graphics->data.vnc.socket && virAsprintf(&graphics->data.vnc.socket, - "%s/%s.vnc", driver->libDir, def->name) == -1) { + "%s/%s.vnc", cfg->libDir, def->name) == -1) { goto no_memory; } @@ -4742,7 +4750,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, } if (!listenAddr) - listenAddr = driver->vncListen; + listenAddr = cfg->vncListen; escapeAddr = strchr(listenAddr, ':') != NULL; if (escapeAddr) @@ -4760,26 +4768,26 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, if (qemuCapsGet(caps, QEMU_CAPS_VNC_COLON)) { if (graphics->data.vnc.auth.passwd || - driver->vncPassword) + cfg->vncPassword) virBufferAddLit(&opt, ",password"); - if (driver->vncTLS) { + if (cfg->vncTLS) { virBufferAddLit(&opt, ",tls"); - if (driver->vncTLSx509verify) { + if (cfg->vncTLSx509verify) { virBufferAsprintf(&opt, ",x509verify=%s", - driver->vncTLSx509certdir); + cfg->vncTLSx509certdir); } else { virBufferAsprintf(&opt, ",x509=%s", - driver->vncTLSx509certdir); + cfg->vncTLSx509certdir); } } - if (driver->vncSASL) { + if (cfg->vncSASL) { virBufferAddLit(&opt, ",sasl"); - if (driver->vncSASLdir) + if (cfg->vncSASLdir) virCommandAddEnvPair(cmd, "SASL_CONF_DIR", - driver->vncSASLdir); + cfg->vncSASLdir); /* TODO: Support ACLs later */ } @@ -4796,7 +4804,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, * prevent it opening the host OS audio devices, since that causes * security issues and might not work when using VNC. */ - if (driver->vncAllowHostAudio) { + if (cfg->vncAllowHostAudio) { virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV"); } else { virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none"); @@ -4852,7 +4860,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, virBufferAsprintf(&opt, "port=%u", port); if (tlsPort > 0) { - if (!driver->spiceTLS) { + if (!cfg->spiceTLS) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("spice TLS port set in XML configuration," " but TLS is disabled in qemu.conf")); @@ -4895,7 +4903,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, } if (!listenAddr) - listenAddr = driver->spiceListen; + listenAddr = cfg->spiceListen; if (listenAddr) virBufferAsprintf(&opt, ",addr=%s", listenAddr); @@ -4919,12 +4927,12 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, * making it visible on CLI, so there's no use of password=XXX * in this bit of the code */ if (!graphics->data.spice.auth.passwd && - !driver->spicePassword) + !cfg->spicePassword) virBufferAddLit(&opt, ",disable-ticketing"); - if (driver->spiceTLS) + if (cfg->spiceTLS) virBufferAsprintf(&opt, ",x509-dir=%s", - driver->spiceTLSx509certdir); + cfg->spiceTLSx509certdir); switch (defaultMode) { case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE: @@ -4942,7 +4950,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, int mode = graphics->data.spice.channels[i]; switch (mode) { case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE: - if (!driver->spiceTLS) { + if (!cfg->spiceTLS) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("spice secure channels set in XML configuration, but TLS is disabled in qemu.conf")); goto error; @@ -5055,6 +5063,7 @@ qemuBuildCommandLine(virConnectPtr conn, VIR_DOMAIN_CONTROLLER_TYPE_CCID, }; virArch hostarch = virArchFromHost(); + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("conn=%p driver=%p def=%p mon=%p json=%d " "caps=%p migrateFrom=%s migrateFD=%d " @@ -5127,7 +5136,7 @@ qemuBuildCommandLine(virConnectPtr conn, if (qemuCapsGet(caps, QEMU_CAPS_NAME)) { virCommandAddArg(cmd, "-name"); - if (driver->setProcessName && + if (cfg->setProcessName && qemuCapsGet(caps, QEMU_CAPS_NAME_PROCESS)) { virCommandAddArgFormat(cmd, "%s,process=qemu:%s", def->name, def->name); @@ -5176,12 +5185,12 @@ qemuBuildCommandLine(virConnectPtr conn, def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024; virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024); if (def->mem.hugepage_backed) { - if (!driver->hugetlbfs_mount) { + if (!cfg->hugetlbfsMount) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("hugetlbfs filesystem is not mounted")); goto error; } - if (!driver->hugepage_path) { + if (!cfg->hugepagePath) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("hugepages are disabled by administrator config")); goto error; @@ -5193,7 +5202,7 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path", - driver->hugepage_path, NULL); + cfg->hugepagePath, NULL); } virCommandAddArg(cmd, "-smp"); @@ -6076,7 +6085,7 @@ qemuBuildCommandLine(virConnectPtr conn, * supported. */ if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK || - driver->privileged || + cfg->privileged || (!qemuCapsGet(caps, QEMU_CAPS_NETDEV_BRIDGE))) { int tapfd = qemuNetworkIfaceConnect(def, conn, driver, net, caps); @@ -6522,7 +6531,7 @@ qemuBuildCommandLine(virConnectPtr conn, } for (i = 0 ; i < def->ngraphics ; ++i) { - if (qemuBuildGraphicsCommandLine(driver, cmd, def, caps, + if (qemuBuildGraphicsCommandLine(cfg, cmd, def, caps, def->graphics[i]) < 0) goto error; } @@ -6994,21 +7003,23 @@ qemuBuildCommandLine(virConnectPtr conn, } if (qemuCapsGet(caps, QEMU_CAPS_SECCOMP_SANDBOX)) { - if (driver->seccompSandbox == 0) + if (cfg->seccompSandbox == 0) virCommandAddArgList(cmd, "-sandbox", "off", NULL); - else if (driver->seccompSandbox > 0) + else if (cfg->seccompSandbox > 0) virCommandAddArgList(cmd, "-sandbox", "on", NULL); - } else if (driver->seccompSandbox > 0) { + } else if (cfg->seccompSandbox > 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("QEMU does not support seccomp sandboxes")); goto error; } + virObjectUnref(cfg); return cmd; no_memory: virReportOOMError(); error: + virObjectUnref(cfg); /* free up any resources in the network driver */ for (i = 0; i <= last_good_net; i++) virDomainConfNWFilterTeardown(def->nets[i]); diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index b21392e..9419b59 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -51,10 +51,28 @@ #include "cpu/cpu.h" #include "domain_nwfilter.h" #include "virfile.h" +#include "virstring.h" #include "configmake.h" #define VIR_FROM_THIS VIR_FROM_QEMU +static virClassPtr virQEMUDriverConfigClass; +static void virQEMUDriverConfigDispose(void *obj); + +static int virQEMUConfigOnceInit(void) +{ + if (!(virQEMUDriverConfigClass = virClassNew(virClassForObject(), + "virQEMUDriverConfig", + sizeof(virQEMUDriverConfig), + virQEMUDriverConfigDispose))) + return -1; + + return 0; +} + +VIR_ONCE_GLOBAL_INIT(virQEMUConfig) + + struct _qemuDriverCloseDef { virConnectPtr conn; qemuDriverCloseCallback cb; @@ -70,68 +88,221 @@ void qemuDriverUnlock(virQEMUDriverPtr driver) } -int qemuLoadDriverConfig(virQEMUDriverPtr driver, - const char *filename) { - virConfPtr conf = NULL; - virConfValuePtr p; - char *user = NULL; - char *group = NULL; - int ret = -1; - int i; +virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged) +{ + virQEMUDriverConfigPtr cfg; + + if (virQEMUConfigInitialize() < 0) + return NULL; + + if (!(cfg = virObjectNew(virQEMUDriverConfigClass))) + return NULL; + + cfg->privileged = privileged; + cfg->uri = privileged ? "qemu:///system" : "qemu:///session"; + + if (privileged) { + if (virGetUserID(QEMU_USER, &cfg->user) < 0) + goto error; + } else { + cfg->user = 0; + } + if (privileged) { + if (virGetGroupID(QEMU_GROUP, &cfg->group) < 0) + goto error; + } else { + cfg->group = 0; + } + cfg->dynamicOwnership = privileged ? true : false; + + cfg->cgroupControllers = + (1 << VIR_CGROUP_CONTROLLER_CPU) | + (1 << VIR_CGROUP_CONTROLLER_DEVICES) | + (1 << VIR_CGROUP_CONTROLLER_MEMORY) | + (1 << VIR_CGROUP_CONTROLLER_BLKIO) | + (1 << VIR_CGROUP_CONTROLLER_CPUSET) | + (1 << VIR_CGROUP_CONTROLLER_CPUACCT); + + + if (privileged) { + if (virAsprintf(&cfg->logDir, + "%s/log/libvirt/qemu", LOCALSTATEDIR) < 0) + goto no_memory; + + if ((cfg->configBaseDir = strdup(SYSCONFDIR "/libvirt")) == NULL) + goto no_memory; + + if (virAsprintf(&cfg->stateDir, + "%s/run/libvirt/qemu", LOCALSTATEDIR) < 0) + goto no_memory; + + if (virAsprintf(&cfg->libDir, + "%s/lib/libvirt/qemu", LOCALSTATEDIR) < 0) + goto no_memory; + + if (virAsprintf(&cfg->cacheDir, + "%s/cache/libvirt/qemu", LOCALSTATEDIR) < 0) + goto no_memory; + if (virAsprintf(&cfg->saveDir, + "%s/lib/libvirt/qemu/save", LOCALSTATEDIR) < 0) + goto no_memory; + if (virAsprintf(&cfg->snapshotDir, + "%s/lib/libvirt/qemu/snapshot", LOCALSTATEDIR) < 0) + goto no_memory; + if (virAsprintf(&cfg->autoDumpPath, + "%s/lib/libvirt/qemu/dump", LOCALSTATEDIR) < 0) + goto no_memory; + } else { + char *rundir; + char *cachedir; + + cachedir = virGetUserCacheDirectory(); + if (!cachedir) + goto error; - /* Setup critical defaults */ - driver->securityDefaultConfined = true; - driver->securityRequireConfined = false; - driver->dynamicOwnership = 1; - driver->clearEmulatorCapabilities = 1; + if (virAsprintf(&cfg->logDir, + "%s/qemu/log", cachedir) < 0) { + VIR_FREE(cachedir); + goto no_memory; + } + if (virAsprintf(&cfg->cacheDir, "%s/qemu/cache", cachedir) < 0) { + VIR_FREE(cachedir); + goto no_memory; + } + VIR_FREE(cachedir); + + rundir = virGetUserRuntimeDirectory(); + if (!rundir) + goto error; + if (virAsprintf(&cfg->stateDir, "%s/qemu/run", rundir) < 0) { + VIR_FREE(rundir); + goto no_memory; + } + VIR_FREE(rundir); + + if (!(cfg->configBaseDir = virGetUserConfigDirectory())) + goto error; + + if (virAsprintf(&cfg->libDir, "%s/qemu/lib", cfg->configBaseDir) < 0) + goto no_memory; + if (virAsprintf(&cfg->saveDir, "%s/qemu/save", cfg->configBaseDir) < 0) + goto no_memory; + if (virAsprintf(&cfg->snapshotDir, "%s/qemu/snapshot", cfg->configBaseDir) < 0) + goto no_memory; + if (virAsprintf(&cfg->autoDumpPath, "%s/qemu/dump", cfg->configBaseDir) < 0) + goto no_memory; + } - if (!(driver->vncListen = strdup("127.0.0.1"))) + if (virAsprintf(&cfg->configDir, "%s/qemu", cfg->configBaseDir) < 0) + goto no_memory; + if (virAsprintf(&cfg->autostartDir, "%s/qemu/autostart", cfg->configBaseDir) < 0) goto no_memory; - driver->remotePortMin = QEMU_REMOTE_PORT_MIN; - driver->remotePortMax = QEMU_REMOTE_PORT_MAX; - if (!(driver->vncTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-vnc"))) + if (!(cfg->vncListen = strdup("127.0.0.1"))) + goto no_memory; + + if (!(cfg->vncTLSx509certdir + = strdup(SYSCONFDIR "/pki/libvirt-vnc"))) goto no_memory; - if (!(driver->spiceListen = strdup("127.0.0.1"))) + if (!(cfg->spiceListen = strdup("127.0.0.1"))) goto no_memory; - if (!(driver->spiceTLSx509certdir + if (!(cfg->spiceTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-spice"))) goto no_memory; + cfg->remotePortMin = QEMU_REMOTE_PORT_MIN; + cfg->remotePortMax = QEMU_REMOTE_PORT_MAX; + #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R /* For privileged driver, try and find hugepage mount automatically. * Non-privileged driver requires admin to create a dir for the * user, chown it, and then let user configure it manually */ - if (driver->privileged && - !(driver->hugetlbfs_mount = virFileFindMountPoint("hugetlbfs"))) { + if (privileged && + !(cfg->hugetlbfsMount = virFileFindMountPoint("hugetlbfs"))) { if (errno != ENOENT) { virReportSystemError(errno, "%s", _("unable to find hugetlbfs mountpoint")); - goto cleanup; + goto error; } } #endif - if (!(driver->lockManager = virLockManagerPluginNew("nop", - "qemu", - driver->configBaseDir, - 0))) - goto cleanup; + cfg->clearEmulatorCapabilities = true; + + cfg->securityDefaultConfined = true; + cfg->securityRequireConfined = false; + + cfg->keepAliveInterval = 5; + cfg->keepAliveCount = 5; + cfg->seccompSandbox = -1; + + return cfg; + +no_memory: + virReportOOMError(); +error: + virObjectUnref(cfg); + return NULL; +} + + +static void virQEMUDriverConfigDispose(void *obj) +{ + virQEMUDriverConfigPtr cfg = obj; + + + virStringFreeList(cfg->cgroupDeviceACL); + + VIR_FREE(cfg->configBaseDir); + VIR_FREE(cfg->configDir); + VIR_FREE(cfg->autostartDir); + VIR_FREE(cfg->logDir); + VIR_FREE(cfg->stateDir); + + VIR_FREE(cfg->libDir); + VIR_FREE(cfg->cacheDir); + VIR_FREE(cfg->saveDir); + VIR_FREE(cfg->snapshotDir); + + VIR_FREE(cfg->vncTLSx509certdir); + VIR_FREE(cfg->vncListen); + VIR_FREE(cfg->vncPassword); + VIR_FREE(cfg->vncSASLdir); + + VIR_FREE(cfg->spiceTLSx509certdir); + VIR_FREE(cfg->spiceListen); + VIR_FREE(cfg->spicePassword); + + VIR_FREE(cfg->hugetlbfsMount); + VIR_FREE(cfg->hugepagePath); + + VIR_FREE(cfg->saveImageFormat); + VIR_FREE(cfg->dumpImageFormat); + VIR_FREE(cfg->autoDumpPath); + + virStringFreeList(cfg->securityDriverNames); + + VIR_FREE(cfg->lockManagerName); +} - driver->keepAliveInterval = 5; - driver->keepAliveCount = 5; - driver->seccompSandbox = -1; + +int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, + const char *filename) +{ + virConfPtr conf = NULL; + virConfValuePtr p; + int ret = -1; + int i; /* Just check the file is readable before opening it, otherwise * libvirt emits an error. */ if (access(filename, R_OK) == -1) { VIR_INFO("Could not read qemu config file %s", filename); - ret = 0; - goto cleanup; + return 0; } if (!(conf = virConfReadFile(filename, 0))) @@ -151,6 +322,12 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, if (p) \ VAR = p->l; +#define GET_VALUE_BOOL(NAME, VAR) \ + p = virConfGetValue(conf, NAME); \ + CHECK_TYPE(NAME, VIR_CONF_LONG); \ + if (p) \ + VAR = p->l != 0; + #define GET_VALUE_STR(NAME, VAR) \ p = virConfGetValue(conf, NAME); \ CHECK_TYPE(NAME, VIR_CONF_STRING); \ @@ -160,15 +337,15 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, goto no_memory; \ } - GET_VALUE_LONG("vnc_auto_unix_socket", driver->vncAutoUnixSocket); - GET_VALUE_LONG("vnc_tls", driver->vncTLS); - GET_VALUE_LONG("vnc_tls_x509_verify", driver->vncTLSx509verify); - GET_VALUE_STR("vnc_tls_x509_cert_dir", driver->vncTLSx509certdir); - GET_VALUE_STR("vnc_listen", driver->vncListen); - GET_VALUE_STR("vnc_password", driver->vncPassword); - GET_VALUE_LONG("vnc_sasl", driver->vncSASL); - GET_VALUE_STR("vnc_sasl_dir", driver->vncSASLdir); - GET_VALUE_LONG("vnc_allow_host_audio", driver->vncAllowHostAudio); + GET_VALUE_BOOL("vnc_auto_unix_socket", cfg->vncAutoUnixSocket); + GET_VALUE_BOOL("vnc_tls", cfg->vncTLS); + GET_VALUE_BOOL("vnc_tls_x509_verify", cfg->vncTLSx509verify); + GET_VALUE_STR("vnc_tls_x509_cert_dir", cfg->vncTLSx509certdir); + GET_VALUE_STR("vnc_listen", cfg->vncListen); + GET_VALUE_STR("vnc_password", cfg->vncPassword); + GET_VALUE_BOOL("vnc_sasl", cfg->vncSASL); + GET_VALUE_STR("vnc_sasl_dir", cfg->vncSASLdir); + GET_VALUE_BOOL("vnc_allow_host_audio", cfg->vncAllowHostAudio); p = virConfGetValue(conf, "security_driver"); if (p && p->type == VIR_CONF_LIST) { @@ -184,36 +361,36 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, } } - if (VIR_ALLOC_N(driver->securityDriverNames, len + 1) < 0) + if (VIR_ALLOC_N(cfg->securityDriverNames, len + 1) < 0) goto no_memory; for (i = 0, pp = p->list; pp; i++, pp = pp->next) { - if (!(driver->securityDriverNames[i] = strdup(pp->str))) + if (!(cfg->securityDriverNames[i] = strdup(pp->str))) goto no_memory; } - driver->securityDriverNames[len] = NULL; + cfg->securityDriverNames[len] = NULL; } else { CHECK_TYPE("security_driver", VIR_CONF_STRING); if (p && p->str) { - if (VIR_ALLOC_N(driver->securityDriverNames, 2) < 0 || - !(driver->securityDriverNames[0] = strdup(p->str))) + if (VIR_ALLOC_N(cfg->securityDriverNames, 2) < 0 || + !(cfg->securityDriverNames[0] = strdup(p->str))) goto no_memory; - driver->securityDriverNames[1] = NULL; + cfg->securityDriverNames[1] = NULL; } } - GET_VALUE_LONG("security_default_confined", driver->securityDefaultConfined); - GET_VALUE_LONG("security_require_confined", driver->securityRequireConfined); + GET_VALUE_BOOL("security_default_confined", cfg->securityDefaultConfined); + GET_VALUE_BOOL("security_require_confined", cfg->securityRequireConfined); - GET_VALUE_LONG("spice_tls", driver->spiceTLS); - GET_VALUE_STR("spice_tls_x509_cert_dir", driver->spiceTLSx509certdir); - GET_VALUE_STR("spice_listen", driver->spiceListen); - GET_VALUE_STR("spice_password", driver->spicePassword); + GET_VALUE_BOOL("spice_tls", cfg->spiceTLS); + GET_VALUE_STR("spice_tls_x509_cert_dir", cfg->spiceTLSx509certdir); + GET_VALUE_STR("spice_listen", cfg->spiceListen); + GET_VALUE_STR("spice_password", cfg->spicePassword); - GET_VALUE_LONG("remote_display_port_min", driver->remotePortMin); - if (driver->remotePortMin < QEMU_REMOTE_PORT_MIN) { + GET_VALUE_LONG("remote_display_port_min", cfg->remotePortMin); + if (cfg->remotePortMin < QEMU_REMOTE_PORT_MIN) { /* if the port is too low, we can't get the display name * to tell to vnc (usually subtract 5900, e.g. localhost:1 * for port 5901) */ @@ -224,9 +401,9 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, goto cleanup; } - GET_VALUE_LONG("remote_display_port_max", driver->remotePortMax); - if (driver->remotePortMax > QEMU_REMOTE_PORT_MAX || - driver->remotePortMax < driver->remotePortMin) { + GET_VALUE_LONG("remote_display_port_max", cfg->remotePortMax); + if (cfg->remotePortMax > QEMU_REMOTE_PORT_MAX || + cfg->remotePortMax < cfg->remotePortMin) { virReportError(VIR_ERR_INTERNAL_ERROR, _("%s: remote_display_port_max: port must be between " "the minimal port and %d"), @@ -234,7 +411,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, goto cleanup; } - if (driver->remotePortMin > driver->remotePortMax) { + if (cfg->remotePortMin > cfg->remotePortMax) { virReportError(VIR_ERR_INTERNAL_ERROR, _("%s: remote_display_port_min: min port must not be " "greater than max port"), filename); @@ -243,21 +420,17 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, p = virConfGetValue(conf, "user"); CHECK_TYPE("user", VIR_CONF_STRING); - if (!(user = strdup(p && p->str ? p->str : QEMU_USER))) - goto no_memory; - - if (virGetUserID(user, &driver->user) < 0) + if (p && p->str && + virGetUserID(p->str, &cfg->user) < 0) goto cleanup; p = virConfGetValue(conf, "group"); CHECK_TYPE("group", VIR_CONF_STRING); - if (!(group = strdup(p && p->str ? p->str : QEMU_GROUP))) - goto no_memory; - - if (virGetGroupID(group, &driver->group) < 0) + if (p && p->str && + virGetGroupID(p->str, &cfg->group) < 0) goto cleanup; - GET_VALUE_LONG("dynamic_ownership", driver->dynamicOwnership); + GET_VALUE_BOOL("dynamic_ownership", cfg->dynamicOwnership); p = virConfGetValue(conf, "cgroup_controllers"); CHECK_TYPE("cgroup_controllers", VIR_CONF_LIST); @@ -277,19 +450,11 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, _("Unknown cgroup controller '%s'"), pp->str); goto cleanup; } - driver->cgroupControllers |= (1 << ctl); + cfg->cgroupControllers |= (1 << ctl); } - } else { - driver->cgroupControllers = - (1 << VIR_CGROUP_CONTROLLER_CPU) | - (1 << VIR_CGROUP_CONTROLLER_DEVICES) | - (1 << VIR_CGROUP_CONTROLLER_MEMORY) | - (1 << VIR_CGROUP_CONTROLLER_BLKIO) | - (1 << VIR_CGROUP_CONTROLLER_CPUSET) | - (1 << VIR_CGROUP_CONTROLLER_CPUACCT); } for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) { - if (driver->cgroupControllers & (1 << i)) { + if (cfg->cgroupControllers & (1 << i)) { VIR_INFO("Configured cgroup controller '%s'", virCgroupControllerTypeToString(i)); } @@ -302,7 +467,7 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, virConfValuePtr pp; for (pp = p->list; pp; pp = pp->next) len++; - if (VIR_ALLOC_N(driver->cgroupDeviceACL, 1+len) < 0) + if (VIR_ALLOC_N(cfg->cgroupDeviceACL, 1+len) < 0) goto no_memory; for (i = 0, pp = p->list; pp; ++i, pp = pp->next) { @@ -312,66 +477,41 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver, "list of strings")); goto cleanup; } - if (!(driver->cgroupDeviceACL[i] = strdup(pp->str))) + if (!(cfg->cgroupDeviceACL[i] = strdup(pp->str))) goto no_memory; } - driver->cgroupDeviceACL[i] = NULL; + cfg->cgroupDeviceACL[i] = NULL; } - GET_VALUE_STR("save_image_format", driver->saveImageFormat); - GET_VALUE_STR("dump_image_format", driver->dumpImageFormat); - GET_VALUE_STR("auto_dump_path", driver->autoDumpPath); - GET_VALUE_LONG("auto_dump_bypass_cache", driver->autoDumpBypassCache); - GET_VALUE_LONG("auto_start_bypass_cache", driver->autoStartBypassCache); - - GET_VALUE_STR("hugetlbfs_mount", driver->hugetlbfs_mount); - - p = virConfGetValue(conf, "mac_filter"); - CHECK_TYPE("mac_filter", VIR_CONF_LONG); - if (p && p->l) { - driver->macFilter = p->l; - if (!(driver->ebtables = ebtablesContextNew("qemu"))) { - driver->macFilter = 0; - virReportSystemError(errno, - _("failed to enable mac filter in '%s'"), - __FILE__); - goto cleanup; - } + GET_VALUE_STR("save_image_format", cfg->saveImageFormat); + GET_VALUE_STR("dump_image_format", cfg->dumpImageFormat); + GET_VALUE_STR("auto_dump_path", cfg->autoDumpPath); + GET_VALUE_BOOL("auto_dump_bypass_cache", cfg->autoDumpBypassCache); + GET_VALUE_BOOL("auto_start_bypass_cache", cfg->autoStartBypassCache); - if ((errno = networkDisableAllFrames(driver))) { - virReportSystemError(errno, - _("failed to add rule to drop all frames in '%s'"), - __FILE__); - goto cleanup; - } - } + GET_VALUE_STR("hugetlbfs_mount", cfg->hugetlbfsMount); - GET_VALUE_LONG("relaxed_acs_check", driver->relaxedACS); - GET_VALUE_LONG("clear_emulator_capabilities", driver->clearEmulatorCapabilities); - GET_VALUE_LONG("allow_disk_format_probing", driver->allowDiskFormatProbing); - GET_VALUE_LONG("set_process_name", driver->setProcessName); - GET_VALUE_LONG("max_processes", driver->maxProcesses); - GET_VALUE_LONG("max_files", driver->maxFiles); - - p = virConfGetValue(conf, "lock_manager"); - CHECK_TYPE("lock_manager", VIR_CONF_STRING); - if (p && p->str) { - virLockManagerPluginUnref(driver->lockManager); - if (!(driver->lockManager = - virLockManagerPluginNew(p->str, "qemu", driver->configBaseDir, 0))) - VIR_ERROR(_("Failed to load lock manager %s"), p->str); - } + GET_VALUE_BOOL("mac_filter", cfg->macFilter); + + GET_VALUE_BOOL("relaxed_acs_check", cfg->relaxedACS); + GET_VALUE_BOOL("clear_emulator_capabilities", cfg->clearEmulatorCapabilities); + GET_VALUE_BOOL("allow_disk_format_probing", cfg->allowDiskFormatProbing); + GET_VALUE_BOOL("set_process_name", cfg->setProcessName); + GET_VALUE_LONG("max_processes", cfg->maxProcesses); + GET_VALUE_LONG("max_files", cfg->maxFiles); - GET_VALUE_LONG("max_queued", driver->max_queued); - GET_VALUE_LONG("keepalive_interval", driver->keepAliveInterval); - GET_VALUE_LONG("keepalive_count", driver->keepAliveCount); - GET_VALUE_LONG("seccomp_sandbox", driver->seccompSandbox); + GET_VALUE_STR("lock_manager", cfg->lockManagerName); + + GET_VALUE_LONG("max_queued", cfg->maxQueuedJobs); + + GET_VALUE_LONG("keepalive_interval", cfg->keepAliveInterval); + GET_VALUE_LONG("keepalive_count", cfg->keepAliveCount); + + GET_VALUE_LONG("seccomp_sandbox", cfg->seccompSandbox); ret = 0; cleanup: - VIR_FREE(user); - VIR_FREE(group); virConfFree(conf); return ret; @@ -379,9 +519,15 @@ no_memory: virReportOOMError(); goto cleanup; } +#undef GET_VALUE_BOOL #undef GET_VALUE_LONG #undef GET_VALUE_STRING +virQEMUDriverConfigPtr virQEMUDriverGetConfig(virQEMUDriverPtr driver) +{ + return virObjectRef(driver->config); +} + static void qemuDriverCloseCallbackFree(void *payload, const void *name ATTRIBUTE_UNUSED) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 6009118..b9fcebf 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -53,11 +53,26 @@ typedef qemuDriverCloseDef *qemuDriverCloseDefPtr; typedef struct _virQEMUDriver virQEMUDriver; typedef virQEMUDriver *virQEMUDriverPtr; -/* Main driver state */ -struct _virQEMUDriver { - virMutex lock; - - virThreadPoolPtr workerPool; +typedef struct _virQEMUDriverConfig virQEMUDriverConfig; +typedef virQEMUDriverConfig *virQEMUDriverConfigPtr; + +/* Main driver config. The data in these object + * instances is immutable, so can be accessed + * without locking. Threads must, however, hold + * a valid reference on the object to prevent it + * being released while they use it. + * + * eg + * qemuDriverLock(driver); + * virQEMUDriverConfigPtr cfg = virObjectRef(driver->config); + * qemuDriverUnlock(driver); + * + * ...do stuff with 'cfg'.. + * + * virObjectUnref(cfg); + */ +struct _virQEMUDriverConfig { + virObject parent; bool privileged; const char *uri; @@ -66,19 +81,9 @@ struct _virQEMUDriver { gid_t group; int dynamicOwnership; - unsigned int qemuVersion; - int nextvmid; - - virCgroupPtr cgroup; int cgroupControllers; char **cgroupDeviceACL; - size_t nactive; - virStateInhibitCallback inhibitCallback; - void *inhibitOpaque; - - virDomainObjList domains; - /* These five directories are ones libvirtd uses (so must be root:root * to avoid security risk from QEMU processes */ char *configBaseDir; @@ -92,60 +97,95 @@ struct _virQEMUDriver { char *cacheDir; char *saveDir; char *snapshotDir; - char *qemuImgBinary; - unsigned int vncAutoUnixSocket : 1; - unsigned int vncTLS : 1; - unsigned int vncTLSx509verify : 1; - unsigned int vncSASL : 1; + + bool vncAutoUnixSocket; + bool vncTLS; + bool vncTLSx509verify; + bool vncSASL; char *vncTLSx509certdir; char *vncListen; char *vncPassword; char *vncSASLdir; - unsigned int spiceTLS : 1; + + bool spiceTLS; char *spiceTLSx509certdir; char *spiceListen; char *spicePassword; + int remotePortMin; int remotePortMax; - char *hugetlbfs_mount; - char *hugepage_path; - unsigned int macFilter : 1; - ebtablesContext *ebtables; + char *hugetlbfsMount; + char *hugepagePath; + + bool macFilter; - unsigned int relaxedACS : 1; - unsigned int vncAllowHostAudio : 1; - unsigned int clearEmulatorCapabilities : 1; - unsigned int allowDiskFormatProbing : 1; - unsigned int setProcessName : 1; + bool relaxedACS; + bool vncAllowHostAudio; + bool clearEmulatorCapabilities; + bool allowDiskFormatProbing; + bool setProcessName; int maxProcesses; int maxFiles; - int max_queued; - - virCapsPtr caps; - qemuCapsCachePtr capsCache; - - virDomainEventStatePtr domainEventState; + int maxQueuedJobs; char **securityDriverNames; bool securityDefaultConfined; bool securityRequireConfined; - virSecurityManagerPtr securityManager; char *saveImageFormat; char *dumpImageFormat; char *autoDumpPath; bool autoDumpBypassCache; - bool autoStartBypassCache; + char *lockManagerName; + + int keepAliveInterval; + unsigned int keepAliveCount; + + int seccompSandbox; +}; + +/* Main driver state */ +struct _virQEMUDriver { + virMutex lock; + + virQEMUDriverConfigPtr config; + + virThreadPoolPtr workerPool; + + unsigned int qemuVersion; + + int nextvmid; + + virCgroupPtr cgroup; + + size_t nactive; + + virStateInhibitCallback inhibitCallback; + void *inhibitOpaque; + + virDomainObjList domains; + + char *qemuImgBinary; + + ebtablesContext *ebtables; + + virCapsPtr caps; + + qemuCapsCachePtr capsCache; + + virDomainEventStatePtr domainEventState; + + virSecurityManagerPtr securityManager; + pciDeviceList *activePciHostdevs; usbDeviceList *activeUsbHostdevs; - /* The devices which is are not in use by the host or any guest. */ pciDeviceList *inactivePciHostdevs; virHashTablePtr sharedDisks; @@ -156,16 +196,7 @@ struct _virQEMUDriver { virLockManagerPluginPtr lockManager; - /* Mapping of 'char *uuidstr' -> qemuDriverCloseDefPtr of domains - * which want a specific cleanup to be done when a connection is - * closed. Such cleanup may be to automatically destroy the - * domain or abort a particular job running on it. - */ virHashTablePtr closeCallbacks; - - int keepAliveInterval; - unsigned int keepAliveCount; - int seccompSandbox; }; typedef struct _qemuDomainCmdlineDef qemuDomainCmdlineDef; @@ -186,8 +217,13 @@ struct _qemuDomainCmdlineDef { void qemuDriverLock(virQEMUDriverPtr driver); void qemuDriverUnlock(virQEMUDriverPtr driver); -int qemuLoadDriverConfig(virQEMUDriverPtr driver, - const char *filename); + +virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged); + +int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, + const char *filename); + +virQEMUDriverConfigPtr virQEMUDriverGetConfig(virQEMUDriverPtr driver); struct qemuDomainDiskInfo { bool removable; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1ae75e9..cc02f0e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -663,14 +663,14 @@ void qemuDomainSetNamespaceHooks(virCapsPtr caps) static void qemuDomainObjSaveJob(virQEMUDriverPtr driver, virDomainObjPtr obj) { - if (!virDomainObjIsActive(obj)) { - /* don't write the state file yet, it will be written once the domain - * gets activated */ - return; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + + if (virDomainObjIsActive(obj)) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, obj) < 0) + VIR_WARN("Failed to save status on vm %s", obj->def->name); } - if (virDomainSaveStatus(driver->caps, driver->stateDir, obj) < 0) - VIR_WARN("Failed to save status on vm %s", obj->def->name); + virObjectUnref(cfg); } void @@ -768,11 +768,15 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, unsigned long long now; unsigned long long then; bool nested = job == QEMU_JOB_ASYNC_NESTED; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); priv->jobs_queued++; - if (virTimeMillisNow(&now) < 0) + if (virTimeMillisNow(&now) < 0) { + virObjectUnref(cfg); return -1; + } + then = now + QEMU_JOB_WAIT_TIME; virObjectRef(obj); @@ -780,8 +784,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, qemuDriverUnlock(driver); retry: - if (driver->max_queued && - priv->jobs_queued > driver->max_queued) { + if (cfg->maxQueuedJobs && + priv->jobs_queued > cfg->maxQueuedJobs) { goto error; } @@ -826,6 +830,7 @@ retry: if (qemuDomainTrackJob(job)) qemuDomainObjSaveJob(driver, obj); + virObjectUnref(cfg); return 0; error: @@ -841,8 +846,8 @@ error: if (errno == ETIMEDOUT) virReportError(VIR_ERR_OPERATION_TIMEOUT, "%s", _("cannot acquire state change lock")); - else if (driver->max_queued && - priv->jobs_queued > driver->max_queued) + else if (cfg->maxQueuedJobs && + priv->jobs_queued > cfg->maxQueuedJobs) virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("cannot acquire state change lock " "due to max_queued limit")); @@ -856,6 +861,7 @@ error: virObjectLock(obj); } virObjectUnref(obj); + virObjectUnref(cfg); return -1; } @@ -1397,11 +1403,12 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, int logFD) { int i; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - if (driver->privileged && - (!driver->clearEmulatorCapabilities || - driver->user == 0 || - driver->group == 0)) + if (cfg->privileged && + (!cfg->clearEmulatorCapabilities || + cfg->user == 0 || + cfg->group == 0)) qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, logFD); if (obj->def->namespaceData) { @@ -1418,6 +1425,8 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver, for (i = 0 ; i < obj->def->nnets ; i++) qemuDomainObjCheckNetTaint(driver, obj, obj->def->nets[i], logFD); + + virObjectUnref(cfg); } @@ -1426,12 +1435,16 @@ void qemuDomainObjCheckDiskTaint(virQEMUDriverPtr driver, virDomainDiskDefPtr disk, int logFD) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + if ((!disk->format || disk->format == VIR_STORAGE_FILE_AUTO) && - driver->allowDiskFormatProbing) + cfg->allowDiskFormatProbing) qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING, logFD); if (disk->rawio == 1) qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, logFD); + + virObjectUnref(cfg); } @@ -1451,7 +1464,7 @@ void qemuDomainObjCheckNetTaint(virQEMUDriverPtr driver, static int -qemuDomainOpenLogHelper(virQEMUDriverPtr driver, +qemuDomainOpenLogHelper(virQEMUDriverConfigPtr cfg, virDomainObjPtr vm, int oflags, mode_t mode) @@ -1460,7 +1473,7 @@ qemuDomainOpenLogHelper(virQEMUDriverPtr driver, int fd = -1; bool trunc = false; - if (virAsprintf(&logfile, "%s/%s.log", driver->logDir, vm->def->name) < 0) { + if (virAsprintf(&logfile, "%s/%s.log", cfg->logDir, vm->def->name) < 0) { virReportOOMError(); return -1; } @@ -1503,27 +1516,34 @@ int qemuDomainCreateLog(virQEMUDriverPtr driver, virDomainObjPtr vm, bool append) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int oflags; + int ret; oflags = O_CREAT | O_WRONLY; /* Only logrotate files in /var/log, so only append if running privileged */ - if (driver->privileged || append) + if (cfg->privileged || append) oflags |= O_APPEND; else oflags |= O_TRUNC; - return qemuDomainOpenLogHelper(driver, vm, oflags, S_IRUSR | S_IWUSR); + ret = qemuDomainOpenLogHelper(cfg, vm, oflags, S_IRUSR | S_IWUSR); + virObjectUnref(cfg); + return ret; } int qemuDomainOpenLog(virQEMUDriverPtr driver, virDomainObjPtr vm, off_t pos) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int fd; off_t off; int whence; - if ((fd = qemuDomainOpenLogHelper(driver, vm, O_RDONLY, 0)) < 0) + fd = qemuDomainOpenLogHelper(cfg, vm, O_RDONLY, 0); + virObjectUnref(cfg); + if (fd < 0) return -1; if (pos < 0) { @@ -1748,6 +1768,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, int ret = -1; qemuDomainObjPrivatePtr priv; virDomainSnapshotObjPtr parentsnap = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (!metadata_only) { if (!virDomainObjIsActive(vm)) { @@ -1764,7 +1785,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } } - if (virAsprintf(&snapFile, "%s/%s/%s.xml", driver->snapshotDir, + if (virAsprintf(&snapFile, "%s/%s/%s.xml", cfg->snapshotDir, vm->def->name, snap->def->name) < 0) { virReportOOMError(); goto cleanup; @@ -1780,7 +1801,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } else { parentsnap->def->current = true; if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, - driver->snapshotDir) < 0) { + cfg->snapshotDir) < 0) { VIR_WARN("failed to set parent snapshot '%s' as current", snap->def->parent); parentsnap->def->current = false; @@ -1799,7 +1820,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, cleanup: VIR_FREE(snapFile); - + virObjectUnref(cfg); return ret; } @@ -1845,22 +1866,24 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, virDomainObjPtr vm) { char *snapDir; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* Remove any snapshot metadata prior to removing the domain */ if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) { VIR_WARN("unable to remove all snapshots for domain %s", vm->def->name); } - else if (virAsprintf(&snapDir, "%s/%s", driver->snapshotDir, + else if (virAsprintf(&snapDir, "%s/%s", cfg->snapshotDir, vm->def->name) < 0) { VIR_WARN("unable to remove snapshot directory %s/%s", - driver->snapshotDir, vm->def->name); + cfg->snapshotDir, vm->def->name); } else { if (rmdir(snapDir) < 0 && errno != ENOENT) VIR_WARN("unable to remove snapshot directory %s", snapDir); VIR_FREE(snapDir); } virDomainRemoveInactive(&driver->domains, vm); + virObjectUnref(cfg); } void @@ -1869,14 +1892,17 @@ qemuDomainSetFakeReboot(virQEMUDriverPtr driver, bool value) { qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (priv->fakeReboot == value) return; priv->fakeReboot = value; - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) VIR_WARN("Failed to save status on vm %s", vm->def->name); + + virObjectUnref(cfg); } int @@ -1889,6 +1915,7 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, virDomainDiskDefPtr disk; char uuid[VIR_UUID_STRING_BUFLEN]; virDomainEventPtr event = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virUUIDFormat(vm->def->uuid, uuid); @@ -1899,8 +1926,8 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, continue; if (virFileAccessibleAs(disk->src, F_OK, - driver->user, - driver->group) >= 0) { + cfg->user, + cfg->group) >= 0) { /* disk accessible */ continue; } @@ -1946,6 +1973,7 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, ret = 0; cleanup: + virObjectUnref(cfg); return ret; } @@ -2026,23 +2054,27 @@ qemuDomainDetermineDiskChain(virQEMUDriverPtr driver, virDomainDiskDefPtr disk, bool force) { - bool probe = driver->allowDiskFormatProbing; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + int ret = 0; if (!disk->src || disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) - return 0; + goto cleanup; if (disk->backingChain) { if (force) { virStorageFileFreeMetadata(disk->backingChain); disk->backingChain = NULL; } else { - return 0; + goto cleanup; } } disk->backingChain = virStorageFileGetMetadata(disk->src, disk->format, - driver->user, driver->group, - probe); + cfg->user, cfg->group, + cfg->allowDiskFormatProbing); if (!disk->backingChain) - return -1; - return 0; + ret = -1; + +cleanup: + virObjectUnref(cfg); + return ret; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3a54228..c528a02 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -286,8 +286,9 @@ qemuAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, struct qemuAutostartData *data = opaque; virErrorPtr err; int flags = 0; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(data->driver); - if (data->driver->autoStartBypassCache) + if (cfg->autoStartBypassCache) flags |= VIR_DOMAIN_START_BYPASS_CACHE; virObjectLock(vm); @@ -317,20 +318,20 @@ qemuAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); } static void qemuAutostartDomains(virQEMUDriverPtr driver) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* XXX: Figure out a better way todo this. The domain * startup code needs a connection handle in order * to lookup the bridge associated with a virtual * network */ - virConnectPtr conn = virConnectOpen(driver->privileged ? - "qemu:///system" : - "qemu:///session"); + virConnectPtr conn = virConnectOpen(cfg->uri); /* Ignoring NULL conn which is mostly harmless here */ struct qemuAutostartData data = { driver, conn }; @@ -340,6 +341,7 @@ qemuAutostartDomains(virQEMUDriverPtr driver) if (conn) virConnectClose(conn); + virObjectUnref(cfg); } static int @@ -348,16 +350,17 @@ qemuSecurityInit(virQEMUDriverPtr driver) char **names; virSecurityManagerPtr mgr = NULL; virSecurityManagerPtr stack = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - if (driver->securityDriverNames && - driver->securityDriverNames[0]) { - names = driver->securityDriverNames; + if (cfg->securityDriverNames && + cfg->securityDriverNames[0]) { + names = cfg->securityDriverNames; while (names && *names) { if (!(mgr = virSecurityManagerNew(*names, QEMU_DRIVER_NAME, - driver->allowDiskFormatProbing, - driver->securityDefaultConfined, - driver->securityRequireConfined))) + cfg->allowDiskFormatProbing, + cfg->securityDefaultConfined, + cfg->securityRequireConfined))) goto error; if (!stack) { if (!(stack = virSecurityManagerNewStack(mgr))) @@ -372,23 +375,23 @@ qemuSecurityInit(virQEMUDriverPtr driver) } else { if (!(mgr = virSecurityManagerNew(NULL, QEMU_DRIVER_NAME, - driver->allowDiskFormatProbing, - driver->securityDefaultConfined, - driver->securityRequireConfined))) + cfg->allowDiskFormatProbing, + cfg->securityDefaultConfined, + cfg->securityRequireConfined))) goto error; if (!(stack = virSecurityManagerNewStack(mgr))) goto error; mgr = NULL; } - if (driver->privileged) { + if (cfg->privileged) { if (!(mgr = virSecurityManagerNewDAC(QEMU_DRIVER_NAME, - driver->user, - driver->group, - driver->allowDiskFormatProbing, - driver->securityDefaultConfined, - driver->securityRequireConfined, - driver->dynamicOwnership))) + cfg->user, + cfg->group, + cfg->allowDiskFormatProbing, + cfg->securityDefaultConfined, + cfg->securityRequireConfined, + cfg->dynamicOwnership))) goto error; if (!stack) { if (!(stack = virSecurityManagerNewStack(mgr))) @@ -401,12 +404,14 @@ qemuSecurityInit(virQEMUDriverPtr driver) } driver->securityManager = stack; + virObjectUnref(cfg); return 0; error: VIR_ERROR(_("Failed to initialize security drivers")); virSecurityManagerFree(stack); virSecurityManagerFree(mgr); + virObjectUnref(cfg); return -1; } @@ -419,14 +424,16 @@ qemuCreateCapabilities(virQEMUDriverPtr driver) virSecurityManagerPtr *sec_managers = NULL; /* Security driver data */ const char *doi, *model; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* Basic host arch / guest machine capabilities */ if (!(caps = qemuCapsInit(driver->capsCache))) { virReportOOMError(); + virObjectUnref(cfg); return NULL; } - if (driver->allowDiskFormatProbing) { + if (cfg->allowDiskFormatProbing) { caps->defaultDiskDriverName = NULL; caps->defaultDiskDriverType = VIR_STORAGE_FILE_AUTO; } else { @@ -469,6 +476,7 @@ qemuCreateCapabilities(virQEMUDriverPtr driver) } VIR_FREE(sec_managers); + virObjectUnref(cfg); return caps; no_memory: @@ -476,6 +484,7 @@ no_memory: err_exit: VIR_FREE(sec_managers); virCapabilitiesFree(caps); + virObjectUnref(cfg); return NULL; } @@ -648,13 +657,13 @@ qemuStartup(bool privileged, virStateInhibitCallback callback, void *opaque) { - char *base; char *driverConf = NULL; int rc; virConnectPtr conn = NULL; char ebuf[1024]; char *membase = NULL; char *mempath = NULL; + virQEMUDriverConfigPtr cfg; if (VIR_ALLOC(qemu_driver) < 0) return -1; @@ -666,8 +675,6 @@ qemuStartup(bool privileged, } qemuDriverLock(qemu_driver); - qemu_driver->privileged = privileged; - qemu_driver->uri = privileged ? "qemu:///system" : "qemu:///session"; qemu_driver->inhibitCallback = callback; qemu_driver->inhibitOpaque = opaque; @@ -686,149 +693,93 @@ qemuStartup(bool privileged, if (privileged) qemu_driver->hostsysinfo = virSysinfoRead(); - if (privileged) { - if (virAsprintf(&qemu_driver->logDir, - "%s/log/libvirt/qemu", LOCALSTATEDIR) == -1) - goto out_of_memory; - - if ((qemu_driver->configBaseDir = strdup(SYSCONFDIR "/libvirt")) == NULL) - goto out_of_memory; - base = qemu_driver->configBaseDir; - - if (virAsprintf(&qemu_driver->stateDir, - "%s/run/libvirt/qemu", LOCALSTATEDIR) == -1) - goto out_of_memory; - - if (virAsprintf(&qemu_driver->libDir, - "%s/lib/libvirt/qemu", LOCALSTATEDIR) == -1) - goto out_of_memory; - - if (virAsprintf(&qemu_driver->cacheDir, - "%s/cache/libvirt/qemu", LOCALSTATEDIR) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->saveDir, - "%s/lib/libvirt/qemu/save", LOCALSTATEDIR) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->snapshotDir, - "%s/lib/libvirt/qemu/snapshot", LOCALSTATEDIR) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->autoDumpPath, - "%s/lib/libvirt/qemu/dump", LOCALSTATEDIR) == -1) - goto out_of_memory; - } else { - char *rundir; - char *cachedir; - - cachedir = virGetUserCacheDirectory(); - if (!cachedir) - goto error; - - if (virAsprintf(&qemu_driver->logDir, - "%s/qemu/log", cachedir) == -1) { - VIR_FREE(cachedir); - goto out_of_memory; - } - if (virAsprintf(&qemu_driver->cacheDir, "%s/qemu/cache", cachedir) == -1) { - VIR_FREE(cachedir); - goto out_of_memory; - } - VIR_FREE(cachedir); + if (!(qemu_driver->config = cfg = virQEMUDriverConfigNew(privileged))) + goto error; - rundir = virGetUserRuntimeDirectory(); - if (!rundir) - goto error; - if (virAsprintf(&qemu_driver->stateDir, "%s/qemu/run", rundir) == -1) { - VIR_FREE(rundir); - goto out_of_memory; - } - VIR_FREE(rundir); + if (virAsprintf(&driverConf, "%s/qemu.conf", cfg->configBaseDir) < 0) + goto out_of_memory; - if (!(qemu_driver->configBaseDir = virGetUserConfigDirectory())) - goto error; - base = qemu_driver->configBaseDir; - if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->snapshotDir, "%s/qemu/snapshot", base) == -1) - goto out_of_memory; - if (virAsprintf(&qemu_driver->autoDumpPath, "%s/qemu/dump", base) == -1) - goto out_of_memory; - } + if (virQEMUDriverConfigLoadFile(cfg, driverConf) < 0) + goto error; + VIR_FREE(driverConf); - if (virFileMakePath(qemu_driver->stateDir) < 0) { + if (virFileMakePath(cfg->stateDir) < 0) { VIR_ERROR(_("Failed to create state dir '%s': %s"), - qemu_driver->stateDir, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->stateDir, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - if (virFileMakePath(qemu_driver->libDir) < 0) { + if (virFileMakePath(cfg->libDir) < 0) { VIR_ERROR(_("Failed to create lib dir '%s': %s"), - qemu_driver->libDir, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->libDir, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - if (virFileMakePath(qemu_driver->cacheDir) < 0) { + if (virFileMakePath(cfg->cacheDir) < 0) { VIR_ERROR(_("Failed to create cache dir '%s': %s"), - qemu_driver->cacheDir, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->cacheDir, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - if (virFileMakePath(qemu_driver->saveDir) < 0) { + if (virFileMakePath(cfg->saveDir) < 0) { VIR_ERROR(_("Failed to create save dir '%s': %s"), - qemu_driver->saveDir, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->saveDir, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - if (virFileMakePath(qemu_driver->snapshotDir) < 0) { + if (virFileMakePath(cfg->snapshotDir) < 0) { VIR_ERROR(_("Failed to create save dir '%s': %s"), - qemu_driver->snapshotDir, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->snapshotDir, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - if (virFileMakePath(qemu_driver->autoDumpPath) < 0) { + if (virFileMakePath(cfg->autoDumpPath) < 0) { VIR_ERROR(_("Failed to create dump dir '%s': %s"), - qemu_driver->autoDumpPath, virStrerror(errno, ebuf, sizeof(ebuf))); + cfg->autoDumpPath, virStrerror(errno, ebuf, sizeof(ebuf))); goto error; } - /* Configuration paths are either ~/.libvirt/qemu/... (session) or - * /etc/libvirt/qemu/... (system). - */ - if (virAsprintf(&driverConf, "%s/qemu.conf", base) < 0 || - virAsprintf(&qemu_driver->configDir, "%s/qemu", base) < 0 || - virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart", base) < 0) - goto out_of_memory; - rc = virCgroupForDriver("qemu", &qemu_driver->cgroup, privileged, 1); if (rc < 0) { VIR_INFO("Unable to create cgroup for driver: %s", virStrerror(-rc, ebuf, sizeof(ebuf))); } - if (qemuLoadDriverConfig(qemu_driver, driverConf) < 0) { + + if (!(qemu_driver->lockManager = + virLockManagerPluginNew(cfg->lockManagerName ? + cfg->lockManagerName : "nop", + "qemu", + cfg->configBaseDir, + 0))) goto error; - } - VIR_FREE(driverConf); + + if (cfg->macFilter) { + if (!(qemu_driver->ebtables = ebtablesContextNew("qemu"))) { + virReportSystemError(errno, + _("failed to enable mac filter in '%s'"), + __FILE__); + goto error; + } + + if ((errno = networkDisableAllFrames(qemu_driver))) { + virReportSystemError(errno, + _("failed to add rule to drop all frames in '%s'"), + __FILE__); + goto error; + } + } /* Allocate bitmap for remote display port reservations. We cannot * do this before the config is loaded properly, since the port * numbers are configurable now */ if ((qemu_driver->remotePorts = - virPortAllocatorNew(qemu_driver->remotePortMin, - qemu_driver->remotePortMax)) == NULL) - goto error; - - /* We should always at least have the 'nop' manager, so - * NULLs here are a fatal error - */ - if (!qemu_driver->lockManager) { - VIR_ERROR(_("Missing lock manager implementation")); + virPortAllocatorNew(cfg->remotePortMin, + cfg->remotePortMax)) == NULL) goto error; - } if (qemuSecurityInit(qemu_driver) < 0) goto error; - qemu_driver->capsCache = qemuCapsCacheNew(qemu_driver->libDir, - qemu_driver->stateDir, - qemu_driver->user, - qemu_driver->group); + qemu_driver->capsCache = qemuCapsCacheNew(cfg->libDir, + cfg->stateDir, + cfg->user, + cfg->group); if (!qemu_driver->capsCache) goto error; @@ -845,28 +796,28 @@ qemuStartup(bool privileged, goto error; if (privileged) { - if (chown(qemu_driver->libDir, qemu_driver->user, qemu_driver->group) < 0) { + if (chown(cfg->libDir, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership of '%s' to user %d:%d"), - qemu_driver->libDir, qemu_driver->user, qemu_driver->group); + cfg->libDir, cfg->user, cfg->group); goto error; } - if (chown(qemu_driver->cacheDir, qemu_driver->user, qemu_driver->group) < 0) { + if (chown(cfg->cacheDir, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership of '%s' to %d:%d"), - qemu_driver->cacheDir, qemu_driver->user, qemu_driver->group); + cfg->cacheDir, cfg->user, cfg->group); goto error; } - if (chown(qemu_driver->saveDir, qemu_driver->user, qemu_driver->group) < 0) { + if (chown(cfg->saveDir, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership of '%s' to %d:%d"), - qemu_driver->saveDir, qemu_driver->user, qemu_driver->group); + cfg->saveDir, cfg->user, cfg->group); goto error; } - if (chown(qemu_driver->snapshotDir, qemu_driver->user, qemu_driver->group) < 0) { + if (chown(cfg->snapshotDir, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership of '%s' to %d:%d"), - qemu_driver->snapshotDir, qemu_driver->user, qemu_driver->group); + cfg->snapshotDir, cfg->user, cfg->group); goto error; } } @@ -881,10 +832,10 @@ qemuStartup(bool privileged, * NB the check for '/', since user may config "" to disable hugepages * even when mounted */ - if (qemu_driver->hugetlbfs_mount && - qemu_driver->hugetlbfs_mount[0] == '/') { + if (cfg->hugetlbfsMount && + cfg->hugetlbfsMount[0] == '/') { if (virAsprintf(&membase, "%s/libvirt", - qemu_driver->hugetlbfs_mount) < 0 || + cfg->hugetlbfsMount) < 0 || virAsprintf(&mempath, "%s/qemu", membase) < 0) goto out_of_memory; @@ -893,20 +844,20 @@ qemuStartup(bool privileged, _("unable to create hugepage path %s"), mempath); goto error; } - if (qemu_driver->privileged) { + if (cfg->privileged) { if (virFileUpdatePerm(membase, 0, S_IXGRP | S_IXOTH) < 0) goto error; - if (chown(mempath, qemu_driver->user, qemu_driver->group) < 0) { + if (chown(mempath, cfg->user, cfg->group) < 0) { virReportSystemError(errno, _("unable to set ownership on %s to %d:%d"), - mempath, qemu_driver->user, - qemu_driver->group); + mempath, cfg->user, + cfg->group); goto error; } } VIR_FREE(membase); - qemu_driver->hugepage_path = mempath; + cfg->hugepagePath = mempath; } if (qemuDriverCloseCallbackInit(qemu_driver) < 0) @@ -915,7 +866,7 @@ qemuStartup(bool privileged, /* Get all the running persistent or transient configs first */ if (virDomainLoadAllConfigs(qemu_driver->caps, &qemu_driver->domains, - qemu_driver->stateDir, + cfg->stateDir, NULL, 1, QEMU_EXPECTED_VIRT_TYPES, NULL, NULL) < 0) @@ -930,24 +881,26 @@ qemuStartup(bool privileged, virHashForEach(qemu_driver->domains.objs, qemuDomainNetsRestart, NULL); - conn = virConnectOpen(qemu_driver->uri); + conn = virConnectOpen(cfg->uri); qemuProcessReconnectAll(conn, qemu_driver); /* Then inactive persistent configs */ if (virDomainLoadAllConfigs(qemu_driver->caps, &qemu_driver->domains, - qemu_driver->configDir, - qemu_driver->autostartDir, + cfg->configDir, + cfg->autostartDir, 0, QEMU_EXPECTED_VIRT_TYPES, NULL, NULL) < 0) goto error; - virHashForEach(qemu_driver->domains.objs, qemuDomainSnapshotLoad, - qemu_driver->snapshotDir); + virHashForEach(qemu_driver->domains.objs, + qemuDomainSnapshotLoad, + cfg->snapshotDir); - virHashForEach(qemu_driver->domains.objs, qemuDomainManagedSaveLoad, + virHashForEach(qemu_driver->domains.objs, + qemuDomainManagedSaveLoad, qemu_driver); qemu_driver->workerPool = virThreadPoolNew(0, 1, 0, processWatchdogEvent, qemu_driver); @@ -1000,18 +953,21 @@ static void qemuNotifyLoadDomain(virDomainObjPtr vm, int newVM, void *opaque) */ static int qemuReload(void) { + virQEMUDriverConfigPtr cfg; + if (!qemu_driver) return 0; qemuDriverLock(qemu_driver); + cfg = virQEMUDriverGetConfig(qemu_driver); virDomainLoadAllConfigs(qemu_driver->caps, &qemu_driver->domains, - qemu_driver->configDir, - qemu_driver->autostartDir, + cfg->configDir, + cfg->autostartDir, 0, QEMU_EXPECTED_VIRT_TYPES, qemuNotifyLoadDomain, qemu_driver); qemuDriverUnlock(qemu_driver); - + virObjectUnref(cfg); return 0; } @@ -1025,22 +981,16 @@ qemuReload(void) { static int qemuStop(void) { int ret = -1; - const char *uri; virConnectPtr conn; - int numDomains; + int numDomains = 0; size_t i; int state; virDomainPtr *domains = NULL; unsigned int *flags = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(qemu_driver); - qemuDriverLock(qemu_driver); - uri = qemu_driver->privileged ? - "qemu:///system" : - "qemu:///session"; - qemuDriverUnlock(qemu_driver); - - if (!(conn = virConnectOpen(uri))) - return -1; + if (!(conn = virConnectOpen(cfg->uri))) + goto cleanup; if ((numDomains = virConnectListAllDomains(conn, &domains, @@ -1079,6 +1029,9 @@ qemuStop(void) { virDomainFree(domains[i]); VIR_FREE(domains); VIR_FREE(flags); + if (conn) + virConnectClose(conn); + virObjectUnref(cfg); return ret; } @@ -1090,8 +1043,6 @@ qemuStop(void) { */ static int qemuShutdown(void) { - int i; - if (!qemu_driver) return -1; @@ -1111,39 +1062,12 @@ qemuShutdown(void) { qemuDriverCloseCallbackShutdown(qemu_driver); - VIR_FREE(qemu_driver->configBaseDir); - VIR_FREE(qemu_driver->configDir); - VIR_FREE(qemu_driver->autostartDir); - VIR_FREE(qemu_driver->logDir); - VIR_FREE(qemu_driver->stateDir); - VIR_FREE(qemu_driver->libDir); - VIR_FREE(qemu_driver->cacheDir); - VIR_FREE(qemu_driver->saveDir); - VIR_FREE(qemu_driver->snapshotDir); VIR_FREE(qemu_driver->qemuImgBinary); - VIR_FREE(qemu_driver->autoDumpPath); - VIR_FREE(qemu_driver->vncTLSx509certdir); - VIR_FREE(qemu_driver->vncListen); - VIR_FREE(qemu_driver->vncPassword); - VIR_FREE(qemu_driver->vncSASLdir); - VIR_FREE(qemu_driver->spiceTLSx509certdir); - VIR_FREE(qemu_driver->spiceListen); - VIR_FREE(qemu_driver->spicePassword); - VIR_FREE(qemu_driver->hugetlbfs_mount); - VIR_FREE(qemu_driver->hugepage_path); - VIR_FREE(qemu_driver->saveImageFormat); - VIR_FREE(qemu_driver->dumpImageFormat); virSecurityManagerFree(qemu_driver->securityManager); ebtablesContextFree(qemu_driver->ebtables); - if (qemu_driver->cgroupDeviceACL) { - for (i = 0 ; qemu_driver->cgroupDeviceACL[i] != NULL ; i++) - VIR_FREE(qemu_driver->cgroupDeviceACL[i]); - VIR_FREE(qemu_driver->cgroupDeviceACL); - } - /* Free domain callback list */ virDomainEventStateFree(qemu_driver->domainEventState); @@ -1164,61 +1088,71 @@ static virDrvOpenStatus qemuOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, unsigned int flags) { + virQEMUDriverConfigPtr cfg = NULL; + virDrvOpenStatus ret = VIR_DRV_OPEN_ERROR; virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR); if (conn->uri == NULL) { - if (qemu_driver == NULL) - return VIR_DRV_OPEN_DECLINED; + if (qemu_driver == NULL) { + ret = VIR_DRV_OPEN_DECLINED; + goto cleanup; + } - if (!(conn->uri = virURIParse(qemu_driver->privileged ? - "qemu:///system" : - "qemu:///session"))) - return VIR_DRV_OPEN_ERROR; + cfg = virQEMUDriverGetConfig(qemu_driver); + + if (!(conn->uri = virURIParse(cfg->uri))) + goto cleanup; } else { /* If URI isn't 'qemu' its definitely not for us */ if (conn->uri->scheme == NULL || - STRNEQ(conn->uri->scheme, "qemu")) - return VIR_DRV_OPEN_DECLINED; + STRNEQ(conn->uri->scheme, "qemu")) { + ret = VIR_DRV_OPEN_DECLINED; + goto cleanup; + } /* Allow remote driver to deal with URIs with hostname server */ - if (conn->uri->server != NULL) - return VIR_DRV_OPEN_DECLINED; + if (conn->uri->server != NULL) { + ret = VIR_DRV_OPEN_DECLINED; + goto cleanup; + } if (qemu_driver == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("qemu state driver is not active")); - return VIR_DRV_OPEN_ERROR; + goto cleanup; } if (conn->uri->path == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("no QEMU URI path given, try %s"), - qemu_driver->privileged - ? "qemu:///system" - : "qemu:///session"); - return VIR_DRV_OPEN_ERROR; + cfg->uri); + goto cleanup; } - if (qemu_driver->privileged) { + cfg = virQEMUDriverGetConfig(qemu_driver); + if (cfg->privileged) { if (STRNEQ(conn->uri->path, "/system") && STRNEQ(conn->uri->path, "/session")) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected QEMU URI path '%s', try qemu:///system"), conn->uri->path); - return VIR_DRV_OPEN_ERROR; + goto cleanup; } } else { if (STRNEQ(conn->uri->path, "/session")) { virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected QEMU URI path '%s', try qemu:///session"), conn->uri->path); - return VIR_DRV_OPEN_ERROR; + goto cleanup; } } } conn->privateData = qemu_driver; - return VIR_DRV_OPEN_SUCCESS; + ret = VIR_DRV_OPEN_SUCCESS; +cleanup: + virObjectUnref(cfg); + return ret; } static int qemuClose(virConnectPtr conn) { @@ -1734,6 +1668,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { virDomainPausedReason reason; int eventDetail; int state; + virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1751,6 +1686,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); priv = vm->privateData; if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0) @@ -1789,7 +1725,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { eventDetail); } } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto endjob; ret = 0; @@ -1804,6 +1740,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -1814,6 +1751,7 @@ static int qemuDomainResume(virDomainPtr dom) { int ret = -1; virDomainEventPtr event = NULL; int state; + virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1826,6 +1764,8 @@ static int qemuDomainResume(virDomainPtr dom) { goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0) goto cleanup; @@ -1853,7 +1793,7 @@ static int qemuDomainResume(virDomainPtr dom) { VIR_DOMAIN_EVENT_RESUMED, VIR_DOMAIN_EVENT_RESUMED_UNPAUSED); } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto endjob; ret = 0; @@ -1867,6 +1807,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -2229,6 +2170,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, virDomainObjPtr vm; virDomainDefPtr persistentDef = NULL; int ret = -1, r; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG | @@ -2237,6 +2179,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; + cfg = virQEMUDriverGetConfig(driver); + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) goto cleanup; @@ -2260,7 +2204,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, persistentDef->mem.max_balloon = newmem; if (persistentDef->mem.cur_balloon > newmem) persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto endjob; } @@ -2295,7 +2239,7 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (flags & VIR_DOMAIN_AFFECT_CONFIG) { sa_assert(persistentDef); persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto endjob; } } @@ -2308,6 +2252,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -2696,6 +2641,7 @@ qemuOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, int path_shared = virStorageFileIsSharedFS(path); uid_t uid = getuid(); gid_t gid = getgid(); + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* path might be a pre-existing block dev, in which case * we need to skip the create step, and also avoid unlink @@ -2705,7 +2651,7 @@ qemuOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, /* Don't force chown on network-shared FS * as it is likely to fail. */ - if (path_shared <= 0 || driver->dynamicOwnership) + if (path_shared <= 0 || cfg->dynamicOwnership) vfoflags |= VIR_FILE_OPEN_FORCE_OWNER; if (stat(path, &sb) == 0) { @@ -2713,7 +2659,7 @@ qemuOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, /* If the path is regular file which exists * already and dynamic_ownership is off, we don't * want to change it's ownership, just open it as-is */ - if (is_reg && !driver->dynamicOwnership) { + if (is_reg && !cfg->dynamicOwnership) { uid = sb.st_uid; gid = sb.st_gid; } @@ -2733,11 +2679,11 @@ qemuOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, /* If we failed as root, and the error was permission-denied (EACCES or EPERM), assume it's on a network-connected share where root access is restricted (eg, root-squashed NFS). If the - qemu user (driver->user) is non-root, just set a flag to + qemu user (cfg->user) is non-root, just set a flag to bypass security driver shenanigans, and retry the operation after doing setuid to qemu user */ if ((fd != -EACCES && fd != -EPERM) || - driver->user == getuid()) { + cfg->user == getuid()) { virReportSystemError(-fd, _("Failed to create file '%s'"), path); @@ -2768,11 +2714,11 @@ qemuOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, goto cleanup; } - /* Retry creating the file as driver->user */ + /* Retry creating the file as cfg->user */ if ((fd = virFileOpenAs(path, oflags, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, - driver->user, driver->group, + cfg->user, cfg->group, vfoflags | VIR_FILE_OPEN_FORK)) < 0) { virReportSystemError(-fd, _("Error from child process creating '%s'"), @@ -2792,7 +2738,7 @@ cleanup: *needUnlink = need_unlink; if (bypassSecurityDriver) *bypassSecurityDriver = bypass_security; - + virObjectUnref(cfg); return fd; } @@ -3066,6 +3012,7 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml, int compressed; int ret = -1; virDomainObjPtr vm = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | VIR_DOMAIN_SAVE_RUNNING | @@ -3073,10 +3020,11 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml, qemuDriverLock(driver); - if (driver->saveImageFormat == NULL) + cfg = virQEMUDriverGetConfig(driver); + if (cfg->saveImageFormat == NULL) compressed = QEMU_SAVE_FORMAT_RAW; else { - compressed = qemuSaveCompressionTypeFromString(driver->saveImageFormat); + compressed = qemuSaveCompressionTypeFromString(cfg->saveImageFormat); if (compressed < 0) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Invalid save image format specified " @@ -3114,7 +3062,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); - + virObjectUnref(cfg); return ret; } @@ -3128,12 +3076,15 @@ static char * qemuDomainManagedSavePath(virQEMUDriverPtr driver, virDomainObjPtr vm) { char *ret; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - if (virAsprintf(&ret, "%s/%s.save", driver->saveDir, vm->def->name) < 0) { + if (virAsprintf(&ret, "%s/%s.save", cfg->saveDir, vm->def->name) < 0) { virReportOOMError(); + virObjectUnref(cfg); return NULL; } + virObjectUnref(cfg); return ret; } @@ -3351,30 +3302,35 @@ cleanup: static virQEMUSaveFormat getCompressionType(virQEMUDriverPtr driver) { - int compress = QEMU_SAVE_FORMAT_RAW; + int ret = QEMU_SAVE_FORMAT_RAW; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* * We reuse "save" flag for "dump" here. Then, we can support the same * format in "save" and "dump". */ - if (driver->dumpImageFormat) { - compress = qemuSaveCompressionTypeFromString(driver->dumpImageFormat); + if (cfg->dumpImageFormat) { + ret = qemuSaveCompressionTypeFromString(cfg->dumpImageFormat); /* Use "raw" as the format if the specified format is not valid, * or the compress program is not available. */ - if (compress < 0) { + if (ret < 0) { VIR_WARN("%s", _("Invalid dump image format specified in " "configuration file, using raw")); - return QEMU_SAVE_FORMAT_RAW; + ret = QEMU_SAVE_FORMAT_RAW; + goto cleanup; } - if (!qemuCompressProgramAvailable(compress)) { + if (!qemuCompressProgramAvailable(ret)) { VIR_WARN("%s", _("Compression program for dump image format " "in configuration file isn't available, " "using raw")); - return QEMU_SAVE_FORMAT_RAW; + ret = QEMU_SAVE_FORMAT_RAW; + goto cleanup; } } - return compress; +cleanup: + virObjectUnref(cfg); + return ret; } static int qemuDomainCoreDump(virDomainPtr dom, @@ -3500,6 +3456,7 @@ qemuDomainScreenshot(virDomainPtr dom, int tmp_fd = -1; char *ret = NULL; bool unlink_tmp = false; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(0, NULL); @@ -3507,6 +3464,7 @@ qemuDomainScreenshot(virDomainPtr dom, goto cleanup; priv = vm->privateData; + cfg = virQEMUDriverGetConfig(driver); if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) goto cleanup; @@ -3526,7 +3484,7 @@ qemuDomainScreenshot(virDomainPtr dom, goto endjob; } - if (virAsprintf(&tmp, "%s/qemu.screendump.XXXXXX", driver->cacheDir) < 0) { + if (virAsprintf(&tmp, "%s/qemu.screendump.XXXXXX", cfg->cacheDir) < 0) { virReportOOMError(); goto endjob; } @@ -3571,6 +3529,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -3579,9 +3538,11 @@ static void processWatchdogEvent(void *data, void *opaque) int ret; struct qemuDomainWatchdogEvent *wdEvent = data; virQEMUDriverPtr driver = opaque; + virQEMUDriverConfigPtr cfg; qemuDriverLock(driver); virObjectLock(wdEvent->vm); + cfg = virQEMUDriverGetConfig(driver); switch (wdEvent->action) { case VIR_DOMAIN_WATCHDOG_ACTION_DUMP: @@ -3590,7 +3551,7 @@ static void processWatchdogEvent(void *data, void *opaque) unsigned int flags = 0; if (virAsprintf(&dumpfile, "%s/%s-%u", - driver->autoDumpPath, + cfg->autoDumpPath, wdEvent->vm->def->name, (unsigned int)time(NULL)) < 0) { virReportOOMError(); @@ -3610,7 +3571,7 @@ static void processWatchdogEvent(void *data, void *opaque) goto endjob; } - flags |= driver->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0; + flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0; ret = doCoreDump(driver, wdEvent->vm, dumpfile, getCompressionType(driver), flags); if (ret < 0) @@ -3643,6 +3604,7 @@ unlock: virObjectUnref(wdEvent->vm); qemuDriverUnlock(driver); VIR_FREE(wdEvent); + virObjectUnref(cfg); } static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver, @@ -3858,6 +3820,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, int max; int ret = -1; bool maximum; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG | @@ -3869,6 +3832,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, return -1; } + cfg = virQEMUDriverGetConfig(driver); + if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; @@ -3927,7 +3892,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, persistentDef->vcpus = nvcpus; } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto endjob; } @@ -3940,6 +3905,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -3968,10 +3934,13 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, int newVcpuPinNum = 0; virDomainVcpuPinDefPtr *newVcpuPin = NULL; virBitmapPtr pcpumap = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); + cfg = virQEMUDriverGetConfig(driver); + if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; @@ -4066,7 +4035,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, if (newVcpuPin) virDomainVcpuPinDefArrayFree(newVcpuPin, newVcpuPinNum); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; } @@ -4099,7 +4068,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, } } - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto cleanup; } @@ -4113,6 +4082,7 @@ cleanup: if (vm) virObjectUnlock(vm); virBitmapFree(pcpumap); + virObjectUnref(cfg); return ret; } @@ -4223,10 +4193,13 @@ qemuDomainPinEmulator(virDomainPtr dom, int newVcpuPinNum = 0; virDomainVcpuPinDefPtr *newVcpuPin = NULL; virBitmapPtr pcpumap = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); + cfg = virQEMUDriverGetConfig(driver); + if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; @@ -4318,7 +4291,7 @@ qemuDomainPinEmulator(virDomainPtr dom, goto cleanup; } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; } @@ -4340,7 +4313,7 @@ qemuDomainPinEmulator(virDomainPtr dom, } } - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto cleanup; } @@ -4355,6 +4328,7 @@ cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -4883,6 +4857,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, virDomainEventPtr event; int intermediatefd = -1; virCommandPtr cmd = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (header->version == 2) { const char *prog = qemuSaveCompressionTypeToString(header->compressed); @@ -4959,7 +4934,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, "%s", _("failed to resume domain")); goto out; } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Failed to save status on vm %s", vm->def->name); goto out; } @@ -4980,7 +4955,7 @@ out: if (virSecurityManagerRestoreSavedStateLabel(driver->securityManager, vm->def, path) < 0) VIR_WARN("failed to restore save state label on %s", path); - + virObjectUnref(cfg); return ret; } @@ -5338,10 +5313,12 @@ static char *qemuDomainXMLToNative(virConnectPtr conn, virCommandPtr cmd = NULL; char *ret = NULL; int i; + virQEMUDriverConfigPtr cfg; virCheckFlags(0, NULL); qemuDriverLock(driver); + cfg = virQEMUDriverGetConfig(driver); if (STRNEQ(format, QEMU_CONFIG_FORMAT_ARGV)) { virReportError(VIR_ERR_INVALID_ARG, @@ -5431,7 +5408,7 @@ static char *qemuDomainXMLToNative(virConnectPtr conn, monitor_json = qemuCapsGet(caps, QEMU_CAPS_MONITOR_JSON); - if (qemuProcessPrepareMonitorChr(driver, &monConfig, def->name) < 0) + if (qemuProcessPrepareMonitorChr(cfg, &monConfig, def->name) < 0) goto cleanup; if (qemuAssignDeviceAliases(def, caps) < 0) @@ -5450,6 +5427,7 @@ cleanup: virObjectUnref(caps); virCommandFree(cmd); virDomainDefFree(def); + virObjectUnref(cfg); return ret; } @@ -5617,8 +5595,10 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { virDomainEventPtr event = NULL; qemuCapsPtr caps = NULL; int dupVM; + virQEMUDriverConfigPtr cfg; qemuDriverLock(driver); + cfg = virQEMUDriverGetConfig(driver); if (!(def = virDomainDefParseString(driver->caps, xml, QEMU_EXPECTED_VIRT_TYPES, VIR_DOMAIN_XML_INACTIVE))) @@ -5668,7 +5648,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { } vm->persistent = 1; - if (virDomainSaveConfig(driver->configDir, + if (virDomainSaveConfig(cfg->configDir, vm->newDef ? vm->newDef : vm->def) < 0) { if (def_backup) { /* There is backup so this VM was defined before. @@ -5707,6 +5687,7 @@ cleanup: qemuDomainEventQueue(driver, event); virObjectUnref(caps); qemuDriverUnlock(driver); + virObjectUnref(cfg); return dom; } @@ -5720,11 +5701,13 @@ qemuDomainUndefineFlags(virDomainPtr dom, char *name = NULL; int ret = -1; int nsnapshots; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE | VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA, -1); qemuDriverLock(driver); + cfg = virQEMUDriverGetConfig(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); if (!vm) { @@ -5774,7 +5757,7 @@ qemuDomainUndefineFlags(virDomainPtr dom, } } - if (virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm) < 0) + if (virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm) < 0) goto cleanup; event = virDomainEventNewFromObj(vm, @@ -5803,6 +5786,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6438,12 +6422,15 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, unsigned int affect; qemuCapsPtr caps = NULL; qemuDomainObjPrivatePtr priv; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG | (action == QEMU_DEVICE_UPDATE ? VIR_DOMAIN_DEVICE_MODIFY_FORCE : 0), -1); + cfg = virQEMUDriverGetConfig(driver); + affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG); qemuDriverLock(driver); @@ -6558,7 +6545,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, * changed even if we failed to attach the device. For example, * a new controller may be created. */ - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { ret = -1; goto endjob; } @@ -6566,7 +6553,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(driver->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false); vmdef = NULL; @@ -6586,6 +6573,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6644,10 +6632,11 @@ static int qemuDomainSetAutostart(virDomainPtr dom, virDomainObjPtr vm; char *configFile = NULL, *autostartLink = NULL; int ret = -1; + virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); - + cfg = virQEMUDriverGetConfig(driver); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -6665,16 +6654,16 @@ static int qemuDomainSetAutostart(virDomainPtr dom, autostart = (autostart != 0); if (vm->autostart != autostart) { - if ((configFile = virDomainConfigFile(driver->configDir, vm->def->name)) == NULL) + if ((configFile = virDomainConfigFile(cfg->configDir, vm->def->name)) == NULL) goto cleanup; - if ((autostartLink = virDomainConfigFile(driver->autostartDir, vm->def->name)) == NULL) + if ((autostartLink = virDomainConfigFile(cfg->autostartDir, vm->def->name)) == NULL) goto cleanup; if (autostart) { - if (virFileMakePath(driver->autostartDir) < 0) { + if (virFileMakePath(cfg->autostartDir) < 0) { virReportSystemError(errno, _("cannot create autostart directory %s"), - driver->autostartDir); + cfg->autostartDir); goto cleanup; } @@ -6703,6 +6692,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6913,6 +6903,7 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, virDomainObjPtr vm = NULL; virDomainDefPtr persistentDef = NULL; int ret = -1; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -6926,12 +6917,12 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); - if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("No such domain %s"), dom->uuid); goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) @@ -7042,7 +7033,7 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) ret = -1; } @@ -7051,6 +7042,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7256,7 +7248,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, int hard_limit_index = 0; int swap_hard_limit_index = 0; unsigned long long val = 0; - + virQEMUDriverConfigPtr cfg = NULL; int ret = -1; int rc; @@ -7283,6 +7275,8 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -7397,7 +7391,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) ret = -1; } @@ -7406,6 +7400,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7581,6 +7576,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, virCgroupPtr group = NULL; virDomainObjPtr vm = NULL; int ret = -1; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -7601,6 +7597,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, _("No such domain %s"), dom->uuid); goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) @@ -7706,7 +7703,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, if (!persistentDef->numatune.memory.placement_mode) persistentDef->numatune.memory.placement_mode = VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO; - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) ret = -1; } @@ -7715,6 +7712,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7930,6 +7928,7 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, long long value_l; int ret = -1; int rc; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -7957,6 +7956,8 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &vmdef) < 0) goto cleanup; @@ -8058,12 +8059,12 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, } } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - rc = virDomainSaveConfig(driver->configDir, vmdef); + rc = virDomainSaveConfig(cfg->configDir, vmdef); if (rc < 0) goto cleanup; @@ -8079,6 +8080,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } #undef SCHED_RANGE_CHECK @@ -8742,6 +8744,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, int ret = -1; virDomainNetDefPtr net = NULL, persistentNet = NULL; virNetDevBandwidthPtr bandwidth = NULL, newBandwidth = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -8770,6 +8773,8 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -8886,7 +8891,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto cleanup; } @@ -8898,6 +8903,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -9142,12 +9148,15 @@ qemuDomainMemoryPeek(virDomainPtr dom, char *tmp = NULL; int fd = -1, ret = -1; qemuDomainObjPrivatePtr priv; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_MEMORY_VIRTUAL | VIR_MEMORY_PHYSICAL, -1); if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; + cfg = virQEMUDriverGetConfig(driver); + if (flags != VIR_MEMORY_VIRTUAL && flags != VIR_MEMORY_PHYSICAL) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("flags parameter must be VIR_MEMORY_VIRTUAL or VIR_MEMORY_PHYSICAL")); @@ -9163,7 +9172,7 @@ qemuDomainMemoryPeek(virDomainPtr dom, goto endjob; } - if (virAsprintf(&tmp, "%s/qemu.mem.XXXXXX", driver->cacheDir) < 0) { + if (virAsprintf(&tmp, "%s/qemu.mem.XXXXXX", cfg->cacheDir) < 0) { virReportOOMError(); goto endjob; } @@ -9213,6 +9222,7 @@ cleanup: VIR_FREE(tmp); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -9231,12 +9241,15 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom, struct stat sb; int i; int format; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(0, -1); if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; + cfg = virQEMUDriverGetConfig(driver); + if (!path || path[0] == '\0') { virReportError(VIR_ERR_INVALID_ARG, "%s", _("NULL or empty path")); @@ -9270,9 +9283,10 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom, if (disk->format) { format = disk->format; } else { - if (driver->allowDiskFormatProbing) { - if ((format = virStorageFileProbeFormat(disk->src, driver->user, - driver->group)) < 0) + if (cfg->allowDiskFormatProbing) { + if ((format = virStorageFileProbeFormat(disk->src, + cfg->user, + cfg->group)) < 0) goto cleanup; } else { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -9358,6 +9372,7 @@ cleanup: VIR_FORCE_CLOSE(fd); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -9924,6 +9939,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, virDomainObjPtr vm; int ret = -1; enum qemuMigrationJobPhase phase; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(QEMU_MIGRATION_FLAGS, -1); @@ -9937,6 +9953,8 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (!qemuMigrationJobIsActive(vm, QEMU_ASYNC_JOB_MIGRATION_OUT)) goto cleanup; @@ -9957,7 +9975,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, } else if (!virDomainObjIsActive(vm) && (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE))) { if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) - virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm); + virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); qemuDomainRemoveInactive(driver, vm); vm = NULL; } @@ -9966,6 +9984,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -10400,6 +10419,7 @@ qemuDomainPrepareDiskChainElement(virQEMUDriverPtr driver, virStorageFileMetadataPtr origchain = disk->backingChain; bool origreadonly = disk->readonly; int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); disk->src = (char *) file; /* casting away const is safe here */ disk->format = VIR_STORAGE_FILE_RAW; @@ -10414,7 +10434,7 @@ qemuDomainPrepareDiskChainElement(virQEMUDriverPtr driver, VIR_WARN("Failed to teardown cgroup for disk path %s", disk->src); if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - } else if (virDomainLockDiskAttach(driver->lockManager, driver->uri, + } else if (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0 || (cgroup && qemuSetupDiskCgroup(vm, cgroup, disk) < 0) || virSecurityManagerSetImageLabel(driver->securityManager, @@ -10429,6 +10449,7 @@ cleanup: disk->format = origformat; disk->backingChain = origchain; disk->readonly = origreadonly; + virObjectUnref(cfg); return ret; } @@ -10515,16 +10536,16 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver, virDomainDiskDefPtr defdisk; virCommandPtr cmd = NULL; const char *qemuImgPath; - virBitmapPtr created; - + virBitmapPtr created = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int ret = -1; if (!(qemuImgPath = qemuFindQemuImgBinary(driver))) - return -1; + goto cleanup; if (!(created = virBitmapNew(snap->def->ndisks))) { virReportOOMError(); - return -1; + goto cleanup; } /* If reuse is true, then qemuDomainSnapshotPrepare already @@ -10554,7 +10575,7 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver, defdisk->src, virStorageFileFormatTypeToString(defdisk->format)); } else { - if (!driver->allowDiskFormatProbing) { + if (!cfg->allowDiskFormatProbing) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unknown image format of '%s' and " "format probing is disabled"), @@ -10602,7 +10623,7 @@ cleanup: virCommandFree(cmd); /* unlink images if creation has failed */ - if (ret < 0) { + if (ret < 0 && created) { ssize_t bit = -1; while ((bit = virBitmapNextSetBit(created, bit)) >= 0) { snapdisk = &(snap->def->disks[bit]); @@ -10612,6 +10633,7 @@ cleanup: } } virBitmapFree(created); + virObjectUnref(cfg); return ret; } @@ -11003,6 +11025,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, bool persist = false; bool reuse = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0; virCgroupPtr cgroup = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, @@ -11097,10 +11120,11 @@ cleanup: virCgroupFree(&cgroup); if (ret == 0 || !qemuCapsGet(priv->caps, QEMU_CAPS_TRANSACTION)) { - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0 || - (persist && virDomainSaveConfig(driver->configDir, vm->newDef) < 0)) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0 || + (persist && virDomainSaveConfig(cfg->configDir, vm->newDef) < 0)) ret = -1; } + virObjectUnref(cfg); return ret; } @@ -11288,6 +11312,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, virDomainSnapshotObjPtr other = NULL; int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL; int align_match = true; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE | VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT | @@ -11322,6 +11347,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (qemuProcessAutoDestroyActive(driver, vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain is marked for auto destroy")); @@ -11557,7 +11584,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, if (update_current) { vm->current_snapshot->def->current = false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, - driver->snapshotDir) < 0) + cfg->snapshotDir) < 0) goto cleanup; vm->current_snapshot = NULL; } @@ -11607,7 +11634,7 @@ cleanup: if (vm) { if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->snapshotDir) < 0) { + cfg->snapshotDir) < 0) { /* if writing of metadata fails, error out rather than trying * to silently carry on without completing the snapshot */ virDomainSnapshotFree(snapshot); @@ -11634,6 +11661,7 @@ cleanup: virDomainSnapshotDefFree(def); VIR_FREE(xml); qemuDriverUnlock(driver); + virObjectUnref(cfg); return snapshot; } @@ -11983,6 +12011,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, qemuDomainObjPrivatePtr priv; int rc; virDomainDefPtr config = NULL; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED | @@ -12010,6 +12039,9 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, _("no domain with matching uuid '%s'"), uuidstr); goto cleanup; } + + cfg = virQEMUDriverGetConfig(driver); + if (virDomainHasDiskMirror(vm)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", _("domain has active block copy job")); @@ -12057,7 +12089,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, if (vm->current_snapshot) { vm->current_snapshot->def->current = false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, - driver->snapshotDir) < 0) + cfg->snapshotDir) < 0) goto cleanup; vm->current_snapshot = NULL; /* XXX Should we restore vm->current_snapshot after this point @@ -12284,7 +12316,7 @@ endjob: cleanup: if (vm && ret == 0) { if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->snapshotDir) < 0) + cfg->snapshotDir) < 0) ret = -1; else vm->current_snapshot = snap; @@ -12299,6 +12331,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -12307,7 +12340,7 @@ cleanup: typedef struct _virQEMUSnapReparent virQEMUSnapReparent; typedef virQEMUSnapReparent *virQEMUSnapReparentPtr; struct _virQEMUSnapReparent { - virQEMUDriverPtr driver; + virQEMUDriverConfigPtr cfg; virDomainSnapshotObjPtr parent; virDomainObjPtr vm; int err; @@ -12343,9 +12376,10 @@ qemuDomainSnapshotReparentChildren(void *payload, rep->last = snap; rep->err = qemuDomainSnapshotWriteMetadata(rep->vm, snap, - rep->driver->snapshotDir); + rep->cfg->snapshotDir); } + static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) { @@ -12358,6 +12392,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, virQEMUSnapReparent rep; bool metadata_only = !!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY); int external = 0; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN | VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY | @@ -12372,6 +12407,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; @@ -12410,7 +12446,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { snap->def->current = true; if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->snapshotDir) < 0) { + cfg->snapshotDir) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as current"), snap->def->name); @@ -12421,7 +12457,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, vm->current_snapshot = snap; } } else if (snap->nchildren) { - rep.driver = driver; + rep.cfg = cfg; rep.parent = snap->parent; rep.vm = vm; rep.err = 0; @@ -12454,6 +12490,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -12803,6 +12840,7 @@ qemuDomainBlockPivot(virConnectPtr conn, char *oldsrc = NULL; int oldformat; virStorageFileMetadataPtr oldchain = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* Probe the status, if needed. */ if (!disk->mirroring) { @@ -12879,7 +12917,7 @@ qemuDomainBlockPivot(virConnectPtr conn, goto cleanup; } if (disk->mirrorFormat && disk->mirrorFormat != VIR_STORAGE_FILE_RAW && - (virDomainLockDiskAttach(driver->lockManager, driver->uri, + (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0 || (cgroup && qemuSetupDiskCgroup(vm, cgroup, disk) < 0) || virSecurityManagerSetImageLabel(driver->securityManager, vm->def, @@ -12942,6 +12980,7 @@ cleanup: _("resuming after drive-reopen failed")); } } + virObjectUnref(cfg); return ret; } @@ -13158,6 +13197,7 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, bool need_unlink = false; char *mirror = NULL; virCgroupPtr cgroup = NULL; + virQEMUDriverConfigPtr cfg = NULL; /* Preliminaries: find the disk we are editing, sanity checks */ virCheckFlags(VIR_DOMAIN_BLOCK_REBASE_SHALLOW | @@ -13166,7 +13206,7 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; priv = vm->privateData; - + cfg = virQEMUDriverGetConfig(driver); if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("domain is not running")); @@ -13270,8 +13310,8 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *path, * also passed the RAW flag (and format is non-NULL), or it is * safe for us to probe the format from the file that we will * be using. */ - disk->mirrorFormat = virStorageFileProbeFormat(dest, driver->user, - driver->group); + disk->mirrorFormat = virStorageFileProbeFormat(dest, cfg->user, + cfg->group); } if (!format && disk->mirrorFormat > 0) format = virStorageFileFormatTypeToString(disk->mirrorFormat); @@ -13321,6 +13361,7 @@ cleanup: VIR_FREE(device); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -13591,6 +13632,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, int idx = -1; bool set_bytes = false; bool set_iops = false; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -13621,6 +13663,8 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, goto cleanup; } priv = vm->privateData; + cfg = virQEMUDriverGetConfig(driver); + if (!qemuCapsGet(priv->caps, QEMU_CAPS_DRIVE_IOTUNE)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("block I/O throttling not supported with this " @@ -13723,7 +13767,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, info.write_iops_sec = oldinfo->write_iops_sec; } persistentDef->disks[idx]->blkdeviotune = info; - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); if (ret < 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Write to config file failed")); @@ -13740,6 +13784,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -13967,6 +14012,7 @@ qemuDomainSetMetadata(virDomainPtr dom, virDomainObjPtr vm; virDomainDefPtr persistentDef; int ret = -1; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -13974,6 +14020,8 @@ qemuDomainSetMetadata(virDomainPtr dom, if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -14032,7 +14080,7 @@ qemuDomainSetMetadata(virDomainPtr dom, break; } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto cleanup; } @@ -14041,6 +14089,7 @@ qemuDomainSetMetadata(virDomainPtr dom, cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; no_memory: virReportOOMError(); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index ba6dadd..1b8a9cd 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -410,9 +410,10 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int last_processed_hostdev_vf = -1; int i; int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs))) - return -1; + goto cleanup; /* We have to use 9 loops here. *All* devices must * be detached before we reset any of them, because @@ -430,7 +431,7 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, pciDevice *dev = pciDeviceListGet(pcidevs, i); pciDevice *other; - if (!pciDeviceIsAssignable(dev, !driver->relaxedACS)) { + if (!pciDeviceIsAssignable(dev, !cfg->relaxedACS)) { virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is not assignable"), pciDeviceGetName(dev)); @@ -482,7 +483,7 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && hostdev->parent.data.net) { if (qemuDomainHostdevNetConfigReplace(hostdev, uuid, - driver->stateDir) < 0) { + cfg->stateDir) < 0) { goto resetvfnetconfig; } } @@ -568,7 +569,7 @@ resetvfnetconfig: virDomainHostdevDefPtr hostdev = hostdevs[i]; if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && hostdev->parent.data.net) { - qemuDomainHostdevNetConfigRestore(hostdev, driver->stateDir); + qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); } } @@ -580,6 +581,7 @@ reattachdevs: cleanup: pciDeviceListFree(pcidevs); + virObjectUnref(cfg); return ret; } @@ -848,6 +850,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, { pciDeviceList *pcidevs; int i; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (!(pcidevs = qemuGetActivePciHostDeviceList(driver, hostdevs, @@ -856,7 +859,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, VIR_ERROR(_("Failed to allocate pciDeviceList: %s"), err ? err->message : _("unknown error")); virResetError(err); - return; + goto cleanup; } /* Again 4 loops; mark all devices as inactive before reset @@ -893,7 +896,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, continue; if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && hostdev->parent.data.net) { - qemuDomainHostdevNetConfigRestore(hostdev, driver->stateDir); + qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); } } @@ -914,6 +917,8 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, } pciDeviceListFree(pcidevs); +cleanup: + virObjectUnref(cfg); } static void diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 19172e1..77e9745 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -56,9 +56,10 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, { virDomainDiskDefPtr origdisk = NULL; int i; - int ret; + int ret = -1; char *driveAlias = NULL; qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); for (i = 0 ; i < vm->def->ndisks ; i++) { if (vm->def->disks[i]->bus == disk->bus && @@ -73,13 +74,13 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, _("No device with bus '%s' and target '%s'"), virDomainDiskBusTypeToString(disk->bus), disk->dst); - return -1; + goto cleanup; } if (!origdisk->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, _("missing disk device alias name for %s"), origdisk->dst); - return -1; + goto cleanup; } if (origdisk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY && @@ -87,18 +88,18 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, virReportError(VIR_ERR_INTERNAL_ERROR, _("Removable media not supported for %s device"), virDomainDiskDeviceTypeToString(disk->device)); - return -1; + goto cleanup; } - if (virDomainLockDiskAttach(driver->lockManager, driver->uri, + if (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0) - return -1; + goto cleanup; if (virSecurityManagerSetImageLabel(driver->securityManager, vm->def, disk) < 0) { if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } if (!(driveAlias = qemuDeviceDriveHostAlias(origdisk, priv->caps))) @@ -138,15 +139,15 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, disk->src = NULL; origdisk->type = disk->type; - VIR_FREE(driveAlias); virDomainDiskDefFree(disk); +cleanup: + VIR_FREE(driveAlias); + virObjectUnref(cfg); return ret; error: - VIR_FREE(driveAlias); - if (virSecurityManagerRestoreImageLabel(driver->securityManager, vm->def, disk) < 0) VIR_WARN("Unable to restore security label on new media %s", disk->src); @@ -154,7 +155,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } int @@ -205,30 +206,31 @@ int qemuDomainAttachPciDiskDevice(virConnectPtr conn, virDomainObjPtr vm, virDomainDiskDefPtr disk) { - int i, ret; + int i, ret = -1; const char* type = virDomainDiskBusTypeToString(disk->bus); qemuDomainObjPrivatePtr priv = vm->privateData; char *devstr = NULL; char *drivestr = NULL; bool releaseaddr = false; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); for (i = 0 ; i < vm->def->ndisks ; i++) { if (STREQ(vm->def->disks[i]->dst, disk->dst)) { virReportError(VIR_ERR_OPERATION_FAILED, _("target %s already exists"), disk->dst); - return -1; + goto cleanup; } } - if (virDomainLockDiskAttach(driver->lockManager, driver->uri, + if (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0) - return -1; + goto cleanup; if (virSecurityManagerSetImageLabel(driver->securityManager, vm->def, disk) < 0) { if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE)) { @@ -288,15 +290,13 @@ int qemuDomainAttachPciDiskDevice(virConnectPtr conn, virDomainDiskInsertPreAlloced(vm->def, disk); +cleanup: VIR_FREE(devstr); VIR_FREE(drivestr); - - return 0; + virObjectUnref(cfg); + return ret; error: - VIR_FREE(devstr); - VIR_FREE(drivestr); - if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) && (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && releaseaddr && @@ -311,7 +311,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -444,24 +444,25 @@ int qemuDomainAttachSCSIDisk(virConnectPtr conn, char *drivestr = NULL; char *devstr = NULL; int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); for (i = 0 ; i < vm->def->ndisks ; i++) { if (STREQ(vm->def->disks[i]->dst, disk->dst)) { virReportError(VIR_ERR_OPERATION_FAILED, _("target %s already exists"), disk->dst); - return -1; + goto cleanup; } } - if (virDomainLockDiskAttach(driver->lockManager, driver->uri, + if (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0) - return -1; + goto cleanup; if (virSecurityManagerSetImageLabel(driver->securityManager, vm->def, disk) < 0) { if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } /* We should have an address already, so make sure */ @@ -539,15 +540,13 @@ int qemuDomainAttachSCSIDisk(virConnectPtr conn, virDomainDiskInsertPreAlloced(vm->def, disk); +cleanup: VIR_FREE(devstr); VIR_FREE(drivestr); - - return 0; + virObjectUnref(cfg); + return ret; error: - VIR_FREE(devstr); - VIR_FREE(drivestr); - if (virSecurityManagerRestoreImageLabel(driver->securityManager, vm->def, disk) < 0) VIR_WARN("Unable to restore security label on %s", disk->src); @@ -555,7 +554,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -565,27 +564,28 @@ int qemuDomainAttachUsbMassstorageDevice(virConnectPtr conn, virDomainDiskDefPtr disk) { qemuDomainObjPrivatePtr priv = vm->privateData; - int i, ret; + int i, ret = -1; char *drivestr = NULL; char *devstr = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); for (i = 0 ; i < vm->def->ndisks ; i++) { if (STREQ(vm->def->disks[i]->dst, disk->dst)) { virReportError(VIR_ERR_OPERATION_FAILED, _("target %s already exists"), disk->dst); - return -1; + goto cleanup; } } - if (virDomainLockDiskAttach(driver->lockManager, driver->uri, + if (virDomainLockDiskAttach(driver->lockManager, cfg->uri, vm, disk) < 0) - return -1; + goto cleanup; if (virSecurityManagerSetImageLabel(driver->securityManager, vm->def, disk) < 0) { if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } /* XXX not correct once we allow attaching a USB CDROM */ @@ -633,15 +633,13 @@ int qemuDomainAttachUsbMassstorageDevice(virConnectPtr conn, virDomainDiskInsertPreAlloced(vm->def, disk); +cleanup: VIR_FREE(devstr); VIR_FREE(drivestr); - - return 0; + virObjectUnref(cfg); + return ret; error: - VIR_FREE(devstr); - VIR_FREE(drivestr); - if (virSecurityManagerRestoreImageLabel(driver->securityManager, vm->def, disk) < 0) VIR_WARN("Unable to restore security label on %s", disk->src); @@ -649,7 +647,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -673,11 +671,12 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, bool releaseaddr = false; bool iface_connected = false; int actualType; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* preallocate new slot for device */ if (VIR_REALLOC_N(vm->def->nets, vm->def->nnets+1) < 0) { virReportOOMError(); - return -1; + goto cleanup; } /* If appropriate, grab a physical device from the configured @@ -685,7 +684,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, * to the one defined in the network definition. */ if (networkAllocateActualDevice(net) < 0) - return -1; + goto cleanup; actualType = virDomainNetGetActualType(net); @@ -714,7 +713,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, * supported. */ if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK || - driver->privileged || + cfg->privileged || (!qemuCapsGet(priv->caps, QEMU_CAPS_NETDEV_BRIDGE))) { if ((tapfd = qemuNetworkIfaceConnect(vm->def, conn, driver, net, priv->caps)) < 0) @@ -894,6 +893,7 @@ cleanup: VIR_FORCE_CLOSE(tapfd); VIR_FREE(vhostfd_name); VIR_FORCE_CLOSE(vhostfd); + virObjectUnref(cfg); return ret; @@ -1796,11 +1796,12 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, const char *oldListenAddr, *newListenAddr; const char *oldListenNetwork, *newListenNetwork; int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (!olddev) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot find existing graphics device to modify")); - return -1; + goto cleanup; } oldListenAddr = virDomainGraphicsListenGetAddress(olddev, 0); @@ -1815,22 +1816,22 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, (olddev->data.vnc.port != dev->data.vnc.port))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change port settings on vnc graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(oldListenAddr,newListenAddr)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change listen address setting on vnc graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(oldListenNetwork,newListenNetwork)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change listen network setting on vnc graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(olddev->data.vnc.keymap, dev->data.vnc.keymap)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change keymap setting on vnc graphics")); - return -1; + goto cleanup; } /* If a password lifetime was, or is set, or action if connected has @@ -1842,11 +1843,11 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, STRNEQ_NULLABLE(olddev->data.vnc.auth.passwd, dev->data.vnc.auth.passwd)) { VIR_DEBUG("Updating password on VNC server %p %p", - dev->data.vnc.auth.passwd, driver->vncPassword); + dev->data.vnc.auth.passwd, cfg->vncPassword); ret = qemuDomainChangeGraphicsPasswords(driver, vm, VIR_DOMAIN_GRAPHICS_TYPE_VNC, &dev->data.vnc.auth, - driver->vncPassword); + cfg->vncPassword); if (ret < 0) return ret; @@ -1870,23 +1871,23 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, (olddev->data.spice.tlsPort != dev->data.spice.tlsPort))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change port settings on spice graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(oldListenAddr, newListenAddr)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change listen address setting on spice graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(oldListenNetwork, newListenNetwork)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change listen network setting on spice graphics")); - return -1; + goto cleanup; } if (STRNEQ_NULLABLE(olddev->data.spice.keymap, dev->data.spice.keymap)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot change keymap setting on spice graphics")); - return -1; + goto cleanup; } /* We must reset the password if it has changed but also if: @@ -1902,11 +1903,11 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, STRNEQ_NULLABLE(olddev->data.spice.auth.passwd, dev->data.spice.auth.passwd)) { VIR_DEBUG("Updating password on SPICE server %p %p", - dev->data.spice.auth.passwd, driver->spicePassword); + dev->data.spice.auth.passwd, cfg->spicePassword); ret = qemuDomainChangeGraphicsPasswords(driver, vm, VIR_DOMAIN_GRAPHICS_TYPE_SPICE, &dev->data.spice.auth, - driver->spicePassword); + cfg->spicePassword); if (ret < 0) return ret; @@ -1931,6 +1932,8 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, break; } +cleanup: + virObjectUnref(cfg); return ret; } @@ -2303,42 +2306,43 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv = vm->privateData; virDomainHostdevSubsysPtr subsys = &detach->source.subsys; - int ret; + int ret = -1, rv; pciDevice *pci; pciDevice *activePci; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (qemuIsMultiFunctionDevice(vm->def, detach->info)) { virReportError(VIR_ERR_OPERATION_FAILED, _("cannot hot unplug multifunction PCI device: %.4x:%.2x:%.2x.%.1x"), subsys->u.pci.domain, subsys->u.pci.bus, subsys->u.pci.slot, subsys->u.pci.function); - return -1; + goto cleanup; } if (!virDomainDeviceAddressIsValid(detach->info, VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("device cannot be detached without a PCI address")); - return -1; + goto cleanup; } qemuDomainObjEnterMonitorWithDriver(driver, vm); if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE)) { - ret = qemuMonitorDelDevice(priv->mon, detach->info->alias); + rv = qemuMonitorDelDevice(priv->mon, detach->info->alias); } else { - ret = qemuMonitorRemovePCIDevice(priv->mon, &detach->info->addr.pci); + rv = qemuMonitorRemovePCIDevice(priv->mon, &detach->info->addr.pci); } qemuDomainObjExitMonitorWithDriver(driver, vm); - virDomainAuditHostdev(vm, detach, "detach", ret == 0); - if (ret < 0) - return -1; + virDomainAuditHostdev(vm, detach, "detach", rv == 0); + if (rv < 0) + goto cleanup; /* * For SRIOV net host devices, unset mac and port profile before * reset and reattach device */ if (detach->parent.data.net) - qemuDomainHostdevNetConfigRestore(detach, driver->stateDir); + qemuDomainHostdevNetConfigRestore(detach, cfg->stateDir); pci = pciGetDevice(subsys->u.pci.domain, subsys->u.pci.bus, subsys->u.pci.slot, subsys->u.pci.function); @@ -2348,14 +2352,12 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, pciResetDevice(activePci, driver->activePciHostdevs, driver->inactivePciHostdevs) == 0) { qemuReattachPciDevice(activePci, driver); + ret = 0; } else { /* reset of the device failed, treat it as if it was returned */ pciFreeDevice(activePci); - ret = -1; } pciFreeDevice(pci); - } else { - ret = -1; } if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) && @@ -2363,6 +2365,8 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, detach->info->addr.pci.slot) < 0) VIR_WARN("Unable to release PCI address on host device"); +cleanup: + virObjectUnref(cfg); return ret; } @@ -2522,6 +2526,7 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, char *hostnet_name = NULL; char mac[VIR_MAC_STRING_BUFLEN]; virNetDevVPortProfilePtr vport = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); detachidx = virDomainNetFindIdx(vm->def, dev->data.net); if (detachidx == -2) { @@ -2529,7 +2534,7 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, _("multiple devices matching mac address %s found"), virMacAddrFormat(&dev->data.net->mac, mac)); goto cleanup; - } + } else if (detachidx < 0) { virReportError(VIR_ERR_OPERATION_FAILED, _("network device %s not found"), @@ -2617,11 +2622,11 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, virDomainNetGetActualDirectDev(detach), virDomainNetGetActualDirectMode(detach), virDomainNetGetActualVirtPortProfile(detach), - driver->stateDir)); + cfg->stateDir)); VIR_FREE(detach->ifname); } - if ((driver->macFilter) && (detach->ifname != NULL)) { + if (cfg->macFilter && (detach->ifname != NULL)) { if ((errno = networkDisallowMacOnPort(driver, detach->ifname, &detach->mac))) { @@ -2644,6 +2649,7 @@ cleanup: virDomainNetDefFree(detach); } VIR_FREE(hostnet_name); + virObjectUnref(cfg); return ret; } @@ -2658,10 +2664,13 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver, time_t now = time(NULL); char expire_time [64]; const char *connected = NULL; - int ret; + int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - if (!auth->passwd && !driver->vncPassword) - return 0; + if (!auth->passwd && !cfg->vncPassword) { + ret = 0; + goto cleanup; + } if (auth->connected) connected = virDomainGraphicsAuthConnectedTypeToString(auth->connected); @@ -2683,7 +2692,7 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver, } } if (ret != 0) - goto cleanup; + goto end_job; if (auth->expires) { time_t lifetime = auth->validTo - now; @@ -2708,9 +2717,10 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver, } } -cleanup: +end_job: qemuDomainObjExitMonitorWithDriver(driver, vm); - +cleanup: + virObjectUnref(cfg); return ret; } @@ -2718,17 +2728,24 @@ int qemuDomainAttachLease(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainLeaseDefPtr lease) { + int ret = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + if (virDomainLeaseInsertPreAlloc(vm->def) < 0) - return -1; + goto cleanup; - if (virDomainLockLeaseAttach(driver->lockManager, driver->uri, + if (virDomainLockLeaseAttach(driver->lockManager, cfg->uri, vm, lease) < 0) { virDomainLeaseInsertPreAlloced(vm->def, NULL); - return -1; + goto cleanup; } virDomainLeaseInsertPreAlloced(vm->def, lease); - return 0; + ret = 0; + +cleanup: + virObjectUnref(cfg); + return ret; } int qemuDomainDetachLease(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index d03e361..f4aa9a2 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -265,6 +265,7 @@ qemuMigrationCookieGraphicsAlloc(virQEMUDriverPtr driver, { qemuMigrationCookieGraphicsPtr mig = NULL; const char *listenAddr; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (VIR_ALLOC(mig) < 0) goto no_memory; @@ -274,32 +275,33 @@ qemuMigrationCookieGraphicsAlloc(virQEMUDriverPtr driver, mig->port = def->data.vnc.port; listenAddr = virDomainGraphicsListenGetAddress(def, 0); if (!listenAddr) - listenAddr = driver->vncListen; + listenAddr = cfg->vncListen; #ifdef WITH_GNUTLS - if (driver->vncTLS && - !(mig->tlsSubject = qemuDomainExtractTLSSubject(driver->vncTLSx509certdir))) + if (cfg->vncTLS && + !(mig->tlsSubject = qemuDomainExtractTLSSubject(cfg->vncTLSx509certdir))) goto error; #endif } else { mig->port = def->data.spice.port; - if (driver->spiceTLS) + if (cfg->spiceTLS) mig->tlsPort = def->data.spice.tlsPort; else mig->tlsPort = -1; listenAddr = virDomainGraphicsListenGetAddress(def, 0); if (!listenAddr) - listenAddr = driver->spiceListen; + listenAddr = cfg->spiceListen; #ifdef WITH_GNUTLS - if (driver->spiceTLS && - !(mig->tlsSubject = qemuDomainExtractTLSSubject(driver->spiceTLSx509certdir))) + if (cfg->spiceTLS && + !(mig->tlsSubject = qemuDomainExtractTLSSubject(cfg->spiceTLSx509certdir))) goto error; #endif } if (!(mig->listen = strdup(listenAddr))) goto no_memory; + virObjectUnref(cfg); return mig; no_memory: @@ -308,6 +310,7 @@ no_memory: error: #endif qemuMigrationCookieGraphicsFree(mig); + virObjectUnref(cfg); return NULL; } @@ -2474,6 +2477,7 @@ static int doTunnelMigrate(virQEMUDriverPtr driver, virNetSocketPtr sock = NULL; int ret = -1; qemuMigrationSpec spec; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("driver=%p, vm=%p, st=%p, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu", @@ -2485,6 +2489,7 @@ static int doTunnelMigrate(virQEMUDriverPtr driver, !qemuCapsGet(priv->caps, QEMU_CAPS_MIGRATE_QEMU_EXEC)) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Source qemu is too old to support tunnelled migration")); + virObjectUnref(cfg); return -1; } @@ -2516,13 +2521,13 @@ static int doTunnelMigrate(virQEMUDriverPtr driver, if (virAsprintf(&spec.dest.unix_socket.file, "%s/qemu.tunnelmigrate.src.%s", - driver->libDir, vm->def->name) < 0) { + cfg->libDir, vm->def->name) < 0) { virReportOOMError(); goto cleanup; } if (virNetSocketNewListenUNIX(spec.dest.unix_socket.file, 0700, - driver->user, driver->group, + cfg->user, cfg->group, &sock) < 0 || virNetSocketListen(sock, 1) < 0) goto cleanup; @@ -2542,6 +2547,7 @@ cleanup: VIR_FREE(spec.dest.unix_socket.file); } + virObjectUnref(cfg); return ret; } @@ -2902,6 +2908,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver, bool p2p; virErrorPtr orig_err = NULL; bool offline = false; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("driver=%p, sconn=%p, vm=%p, xmlin=%s, dconnuri=%s, " "uri=%s, flags=%lx, dname=%s, resource=%lu", @@ -2918,11 +2925,12 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver, if (dconn == NULL) { virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to connect to remote libvirt URI %s"), dconnuri); + virObjectUnref(cfg); return -1; } - if (virConnectSetKeepAlive(dconn, driver->keepAliveInterval, - driver->keepAliveCount) < 0) + if (virConnectSetKeepAlive(dconn, cfg->keepAliveInterval, + cfg->keepAliveCount) < 0) goto cleanup; qemuDomainObjEnterRemoteWithDriver(driver, vm); @@ -2982,7 +2990,7 @@ cleanup: virSetError(orig_err); virFreeError(orig_err); } - + virObjectUnref(cfg); return ret; } @@ -3012,6 +3020,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, int ret = -1; int resume = 0; virErrorPtr orig_err = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; @@ -3085,7 +3094,7 @@ endjob: (!vm->persistent || (ret == 0 && (flags & VIR_MIGRATE_UNDEFINE_SOURCE)))) { if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) - virDomainDeleteConfig(driver->configDir, driver->autostartDir, vm); + virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); qemuDomainRemoveInactive(driver, vm); vm = NULL; } @@ -3100,6 +3109,7 @@ cleanup: virObjectUnlock(vm); if (event) qemuDomainEventQueue(driver, event); + virObjectUnref(cfg); return ret; } @@ -3313,6 +3323,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver, virErrorPtr orig_err = NULL; int cookie_flags = 0; qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("driver=%p, dconn=%p, vm=%p, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%lx, retcode=%d", @@ -3370,7 +3381,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver, vm->newDef = vmdef = mig->persistent; else vmdef = virDomainObjGetPersistentDef(driver->caps, vm); - if (!vmdef || virDomainSaveConfig(driver->configDir, vmdef) < 0) { + if (!vmdef || virDomainSaveConfig(cfg->configDir, vmdef) < 0) { /* Hmpf. Migration was successful, but making it persistent * was not. If we report successful, then when this domain * shuts down, management tools are in for a surprise. On the @@ -3464,7 +3475,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver, } if (virDomainObjIsActive(vm) && - virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Failed to save status on vm %s", vm->def->name); goto endjob; } @@ -3503,6 +3514,7 @@ cleanup: virSetError(orig_err); virFreeError(orig_err); } + virObjectUnref(cfg); return dom; } @@ -3518,6 +3530,8 @@ int qemuMigrationConfirm(virQEMUDriverPtr driver, qemuMigrationCookiePtr mig; virDomainEventPtr event = NULL; int rv = -1; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + VIR_DEBUG("driver=%p, conn=%p, vm=%p, cookiein=%s, cookieinlen=%d, " "flags=%x, retcode=%d", driver, conn, vm, NULLSTR(cookiein), cookieinlen, @@ -3531,7 +3545,7 @@ int qemuMigrationConfirm(virQEMUDriverPtr driver, : QEMU_MIGRATION_PHASE_CONFIRM3_CANCELLED); if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen, 0))) - return -1; + goto cleanup; if (flags & VIR_MIGRATE_OFFLINE) goto done; @@ -3565,7 +3579,7 @@ int qemuMigrationConfirm(virQEMUDriverPtr driver, event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_RESUMED, VIR_DOMAIN_EVENT_RESUMED_MIGRATED); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Failed to save status on vm %s", vm->def->name); goto cleanup; } @@ -3578,6 +3592,7 @@ done: cleanup: if (event) qemuDomainEventQueue(driver, event); + virObjectUnref(cfg); return rv; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2f08215..439cdfa 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -90,10 +90,12 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver, char ebuf[1024]; char *file = NULL; qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + int ret = -1; - if (virAsprintf(&file, "%s/%s.xml", driver->stateDir, vm->def->name) < 0) { + if (virAsprintf(&file, "%s/%s.xml", cfg->stateDir, vm->def->name) < 0) { virReportOOMError(); - return -1; + goto cleanup; } if (unlink(file) < 0 && errno != ENOENT && errno != ENOTDIR) @@ -107,7 +109,10 @@ qemuProcessRemoveDomainStatus(virQEMUDriverPtr driver, VIR_WARN("Failed to remove PID file for %s: %s", vm->def->name, virStrerror(errno, ebuf, sizeof(ebuf))); - return 0; + ret = 0; +cleanup: + virObjectUnref(cfg); + return ret; } @@ -639,6 +644,7 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; qemuDomainObjPrivatePtr priv; virDomainEventPtr event = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("vm=%p", vm); @@ -665,7 +671,7 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_DOMAIN_EVENT_SHUTDOWN, VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after state change", vm->def->name); } @@ -683,6 +689,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -694,6 +701,7 @@ qemuProcessHandleStop(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { @@ -717,7 +725,7 @@ qemuProcessHandleStop(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_WARN("Unable to release lease on %s", vm->def->name); VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after state change", vm->def->name); } @@ -731,6 +739,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -742,6 +751,7 @@ qemuProcessHandleResume(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_PAUSED) { @@ -762,7 +772,7 @@ qemuProcessHandleResume(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_DOMAIN_EVENT_RESUMED_UNPAUSED); VIR_DEBUG("Using lock state '%s' on resume event", NULLSTR(priv->lockState)); - if (virDomainLockProcessResume(driver->lockManager, driver->uri, + if (virDomainLockProcessResume(driver->lockManager, cfg->uri, vm, priv->lockState) < 0) { /* Don't free priv->lockState on error, because we need * to make sure we have state still present if the user @@ -772,7 +782,7 @@ qemuProcessHandleResume(qemuMonitorPtr mon ATTRIBUTE_UNUSED, } VIR_FREE(priv->lockState); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after state change", vm->def->name); } @@ -786,7 +796,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -798,6 +808,7 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventRTCChangeNewFromObj(vm, offset); @@ -805,7 +816,7 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, if (vm->def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_VARIABLE) vm->def->clock.data.variable.adjustment = offset; - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) VIR_WARN("unable to save domain status with RTC change"); virObjectUnlock(vm); @@ -816,6 +827,7 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -828,6 +840,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr watchdogEvent = NULL; virDomainEventPtr lifecycleEvent = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); watchdogEvent = virDomainEventWatchdogNewFromObj(vm, action); @@ -847,7 +860,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_WARN("Unable to release lease on %s", vm->def->name); VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after watchdog event", vm->def->name); } @@ -884,6 +897,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -902,6 +916,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, const char *srcPath; const char *devAlias; virDomainDiskDefPtr disk; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias); @@ -932,7 +947,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_WARN("Unable to release lease on %s", vm->def->name); VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) VIR_WARN("Unable to save status on vm %s after IO error", vm->def->name); } virObjectUnlock(vm); @@ -948,6 +963,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1102,6 +1118,7 @@ qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; virDomainDiskDefPtr disk; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); disk = qemuProcessFindDomainDiskByAlias(vm, devAlias); @@ -1116,7 +1133,7 @@ qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, else if (reason == VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE) disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after tray moved event", vm->def->name); } @@ -1129,7 +1146,7 @@ qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -1140,6 +1157,7 @@ qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventPMWakeupNewFromObj(vm); @@ -1157,7 +1175,7 @@ qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_DOMAIN_EVENT_STARTED, VIR_DOMAIN_EVENT_STARTED_WAKEUP); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after wakeup event", vm->def->name); } @@ -1174,6 +1192,7 @@ qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1184,6 +1203,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventPMSuspendNewFromObj(vm); @@ -1200,7 +1220,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_DOMAIN_EVENT_PMSUSPENDED, VIR_DOMAIN_EVENT_PMSUSPENDED_MEMORY); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after suspend event", vm->def->name); } @@ -1219,7 +1239,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDomainEventQueue(driver, lifecycleEvent); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -1230,6 +1250,7 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventBalloonChangeNewFromObj(vm, actual); @@ -1238,7 +1259,7 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, vm->def->mem.cur_balloon, actual); vm->def->mem.cur_balloon = actual; - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) VIR_WARN("unable to save domain status with balloon change"); virObjectUnlock(vm); @@ -1249,6 +1270,7 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1259,6 +1281,7 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event = NULL; virDomainEventPtr lifecycleEvent = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventPMSuspendDiskNewFromObj(vm); @@ -1275,7 +1298,7 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, VIR_DOMAIN_EVENT_PMSUSPENDED, VIR_DOMAIN_EVENT_PMSUSPENDED_DISK); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps,cfg->stateDir, vm) < 0) { VIR_WARN("Unable to save status on vm %s after suspend event", vm->def->name); } @@ -1295,6 +1318,8 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); + return 0; } @@ -2164,6 +2189,7 @@ qemuProcessInitPasswords(virConnectPtr conn, { int ret = 0; qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); int i; for (i = 0 ; i < vm->def->ngraphics; ++i) { @@ -2172,12 +2198,12 @@ qemuProcessInitPasswords(virConnectPtr conn, ret = qemuDomainChangeGraphicsPasswords(driver, vm, VIR_DOMAIN_GRAPHICS_TYPE_VNC, &graphics->data.vnc.auth, - driver->vncPassword); + cfg->vncPassword); } else if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { ret = qemuDomainChangeGraphicsPasswords(driver, vm, VIR_DOMAIN_GRAPHICS_TYPE_SPICE, &graphics->data.spice.auth, - driver->spicePassword); + cfg->spicePassword); } } @@ -2210,6 +2236,7 @@ qemuProcessInitPasswords(virConnectPtr conn, } cleanup: + virObjectUnref(cfg); return ret; } @@ -2628,28 +2655,28 @@ qemuProcessPrepareChardevDevice(virDomainDefPtr def ATTRIBUTE_UNUSED, static int -qemuProcessLimits(virQEMUDriverPtr driver) +qemuProcessLimits(virQEMUDriverConfigPtr cfg) { struct rlimit rlim; - if (driver->maxProcesses > 0) { - rlim.rlim_cur = rlim.rlim_max = driver->maxProcesses; + if (cfg->maxProcesses > 0) { + rlim.rlim_cur = rlim.rlim_max = cfg->maxProcesses; if (setrlimit(RLIMIT_NPROC, &rlim) < 0) { virReportSystemError(errno, _("cannot limit number of processes to %d"), - driver->maxProcesses); + cfg->maxProcesses); return -1; } } - if (driver->maxFiles > 0) { + if (cfg->maxFiles > 0) { /* Max number of opened files is one greater than * actual limit. See man setrlimit */ - rlim.rlim_cur = rlim.rlim_max = driver->maxFiles + 1; + rlim.rlim_cur = rlim.rlim_max = cfg->maxFiles + 1; if (setrlimit(RLIMIT_NOFILE, &rlim) < 0) { virReportSystemError(errno, _("cannot set max opened files to %d"), - driver->maxFiles); + cfg->maxFiles); return -1; } } @@ -2670,6 +2697,7 @@ static int qemuProcessHook(void *data) struct qemuProcessHookData *h = data; int ret = -1; int fd; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(h->driver); /* Some later calls want pid present */ h->vm->pid = getpid(); @@ -2685,7 +2713,7 @@ static int qemuProcessHook(void *data) if (virSecurityManagerSetSocketLabel(h->driver->securityManager, h->vm->def) < 0) goto cleanup; if (virDomainLockProcessStart(h->driver->lockManager, - h->driver->uri, + cfg->uri, h->vm, /* QEMU is always paused initially */ true, @@ -2694,7 +2722,7 @@ static int qemuProcessHook(void *data) if (virSecurityManagerClearSocketLabel(h->driver->securityManager, h->vm->def) < 0) goto cleanup; - if (qemuProcessLimits(h->driver) < 0) + if (qemuProcessLimits(cfg) < 0) goto cleanup; /* This must take place before exec(), so that all QEMU @@ -2720,12 +2748,13 @@ static int qemuProcessHook(void *data) ret = 0; cleanup: + virObjectUnref(cfg); VIR_DEBUG("Hook complete ret=%d", ret); return ret; } int -qemuProcessPrepareMonitorChr(virQEMUDriverPtr driver, +qemuProcessPrepareMonitorChr(virQEMUDriverConfigPtr cfg, virDomainChrSourceDefPtr monConfig, const char *vm) { @@ -2733,7 +2762,7 @@ qemuProcessPrepareMonitorChr(virQEMUDriverPtr driver, monConfig->data.nix.listen = true; if (virAsprintf(&monConfig->data.nix.path, "%s/%s.monitor", - driver->libDir, vm) < 0) { + cfg->libDir, vm) < 0) { virReportOOMError(); return -1; } @@ -2752,17 +2781,18 @@ qemuProcessStartCPUs(virQEMUDriverPtr driver, virDomainObjPtr vm, virConnectPtr conn, virDomainRunningReason reason, enum qemuDomainAsyncJob asyncJob) { - int ret; + int ret = -1; qemuDomainObjPrivatePtr priv = vm->privateData; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("Using lock state '%s'", NULLSTR(priv->lockState)); - if (virDomainLockProcessResume(driver->lockManager, driver->uri, + if (virDomainLockProcessResume(driver->lockManager, cfg->uri, vm, priv->lockState) < 0) { /* Don't free priv->lockState on error, because we need * to make sure we have state still present if the user * tries to resume again */ - return -1; + goto cleanup; } VIR_FREE(priv->lockState); @@ -2780,6 +2810,8 @@ qemuProcessStartCPUs(virQEMUDriverPtr driver, virDomainObjPtr vm, VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); } +cleanup: + virObjectUnref(cfg); return ret; } @@ -3137,6 +3169,7 @@ qemuProcessReconnect(void *opaque) struct qemuDomainJobObj oldjob; int state; int reason; + virQEMUDriverConfigPtr cfg; memcpy(&oldjob, &data->oldjob, sizeof(oldjob)); @@ -3145,7 +3178,7 @@ qemuProcessReconnect(void *opaque) qemuDriverLock(driver); virObjectLock(obj); - + cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("Reconnect monitor to %p '%s'", obj, obj->def->name); priv = obj->privateData; @@ -3227,7 +3260,7 @@ qemuProcessReconnect(void *opaque) goto error; /* update domain state XML with possibly updated state in virDomainObj */ - if (virDomainSaveStatus(driver->caps, driver->stateDir, obj) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, obj) < 0) goto error; /* Run an hook to allow admins to do some magic */ @@ -3261,6 +3294,7 @@ endjob: qemuDriverUnlock(driver); virConnectClose(conn); + virObjectUnref(cfg); return; @@ -3301,6 +3335,7 @@ error: qemuDriverUnlock(driver); virConnectClose(conn); + virObjectUnref(cfg); } static void @@ -3500,6 +3535,7 @@ int qemuProcessStart(virConnectPtr conn, char *nodeset = NULL; virBitmapPtr nodemask = NULL; unsigned int stop_flags; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* Okay, these are just internal flags, * but doesn't hurt to check */ @@ -3522,6 +3558,7 @@ int qemuProcessStart(virConnectPtr conn, if (virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("VM is already active")); + virObjectUnref(cfg); return -1; } @@ -3579,9 +3616,9 @@ int qemuProcessStart(virConnectPtr conn, } virDomainAuditSecurityLabel(vm, true); - if (driver->hugepage_path && vm->def->mem.hugepage_backed) { + if (cfg->hugepagePath && vm->def->mem.hugepage_backed) { if (virSecurityManagerSetHugepages(driver->securityManager, - vm->def, driver->hugepage_path) < 0) { + vm->def, cfg->hugepagePath) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to set huge path in security driver")); goto cleanup; @@ -3617,7 +3654,7 @@ int qemuProcessStart(virConnectPtr conn, graphics->data.spice.port = port; } - if (driver->spiceTLS && + if (cfg->spiceTLS && (graphics->data.spice.autoport || graphics->data.spice.tlsPort == -1)) { unsigned short tlsPort; @@ -3644,9 +3681,9 @@ int qemuProcessStart(virConnectPtr conn, } graphics->listens[0].type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS; if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) - graphics->listens[0].address = strdup(driver->vncListen); + graphics->listens[0].address = strdup(cfg->vncListen); else - graphics->listens[0].address = strdup(driver->spiceListen); + graphics->listens[0].address = strdup(cfg->spiceListen); if (!graphics->listens[0].address) { VIR_SHRINK_N(graphics->listens, graphics->nListens, 1); virReportOOMError(); @@ -3656,10 +3693,10 @@ int qemuProcessStart(virConnectPtr conn, } } - if (virFileMakePath(driver->logDir) < 0) { + if (virFileMakePath(cfg->logDir) < 0) { virReportSystemError(errno, _("cannot create log directory %s"), - driver->logDir); + cfg->logDir); goto cleanup; } @@ -3721,7 +3758,7 @@ int qemuProcessStart(virConnectPtr conn, } VIR_DEBUG("Preparing monitor state"); - if (qemuProcessPrepareMonitorChr(driver, priv->monConfig, vm->def->name) < 0) + if (qemuProcessPrepareMonitorChr(cfg, priv->monConfig, vm->def->name) < 0) goto cleanup; if (qemuCapsGet(priv->caps, QEMU_CAPS_MONITOR_JSON)) @@ -3734,7 +3771,7 @@ int qemuProcessStart(virConnectPtr conn, priv->gotShutdown = false; VIR_FREE(priv->pidfile); - if (!(priv->pidfile = virPidFileBuildPath(driver->stateDir, vm->def->name))) { + if (!(priv->pidfile = virPidFileBuildPath(cfg->stateDir, vm->def->name))) { virReportSystemError(errno, "%s", _("Failed to build pidfile path.")); goto cleanup; @@ -3806,8 +3843,8 @@ int qemuProcessStart(virConnectPtr conn, virStrerror(errno, ebuf, sizeof(ebuf))); VIR_DEBUG("Clear emulator capabilities: %d", - driver->clearEmulatorCapabilities); - if (driver->clearEmulatorCapabilities) + cfg->clearEmulatorCapabilities); + if (cfg->clearEmulatorCapabilities) virCommandClearCaps(cmd); /* in case a certain disk is desirous of CAP_SYS_RAWIO, add this */ @@ -3872,7 +3909,7 @@ int qemuProcessStart(virConnectPtr conn, } VIR_DEBUG("Writing early domain status to disk"); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) { goto cleanup; } @@ -4023,7 +4060,7 @@ int qemuProcessStart(virConnectPtr conn, goto cleanup; VIR_DEBUG("Writing domain status to disk"); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; /* finally we can call the 'started' hook script if any */ @@ -4045,6 +4082,7 @@ int qemuProcessStart(virConnectPtr conn, virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); + virObjectUnref(cfg); return 0; @@ -4057,6 +4095,7 @@ cleanup: virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, stop_flags); + virObjectUnref(cfg); return -1; } @@ -4118,12 +4157,14 @@ void qemuProcessStop(virQEMUDriverPtr driver, int logfile = -1; char *timestamp; char ebuf[1024]; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("Shutting down VM '%s' pid=%d flags=%x", vm->def->name, vm->pid, flags); if (!virDomainObjIsActive(vm)) { VIR_DEBUG("VM '%s' not active", vm->def->name); + virObjectUnref(cfg); return; } @@ -4168,7 +4209,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, virDomainConfVMNWFilterTeardown(vm); - if (driver->macFilter) { + if (cfg->macFilter) { def = vm->def; for (i = 0 ; i < def->nnets ; i++) { virDomainNetDefPtr net = def->nets[i]; @@ -4262,7 +4303,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, virDomainNetGetActualDirectDev(net), virDomainNetGetActualDirectMode(net), virDomainNetGetActualVirtPortProfile(net), - driver->stateDir)); + cfg->stateDir)); VIR_FREE(net->ifname); } /* release the physical device (or any other resources used by @@ -4339,6 +4380,7 @@ retry: virSetError(orig_err); virFreeError(orig_err); } + virObjectUnref(cfg); } @@ -4361,12 +4403,14 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, virSecurityLabelDefPtr seclabeldef = NULL; virSecurityManagerPtr* sec_managers = NULL; const char *model; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("Beginning VM attach process"); if (virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("VM is already active")); + virObjectUnref(cfg); return -1; } @@ -4384,10 +4428,10 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, driver->inhibitCallback(true, driver->inhibitOpaque); driver->nactive++; - if (virFileMakePath(driver->logDir) < 0) { + if (virFileMakePath(cfg->logDir) < 0) { virReportSystemError(errno, _("cannot create log directory %s"), - driver->logDir); + cfg->logDir); goto cleanup; } @@ -4520,7 +4564,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason); VIR_DEBUG("Writing domain status to disk"); - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; /* Run an hook to allow admins to do some magic */ @@ -4543,6 +4587,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, VIR_FORCE_CLOSE(logfile); VIR_FREE(seclabel); VIR_FREE(sec_managers); + virObjectUnref(cfg); return 0; @@ -4556,6 +4601,7 @@ cleanup: VIR_FREE(seclabel); VIR_FREE(sec_managers); virDomainChrSourceDefFree(monConfig); + virObjectUnref(cfg); return -1; } diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 313fa39..2dc8041 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -25,7 +25,7 @@ # include "qemu_conf.h" # include "qemu_domain.h" -int qemuProcessPrepareMonitorChr(virQEMUDriverPtr driver, +int qemuProcessPrepareMonitorChr(virQEMUDriverConfigPtr cfg, virDomainChrSourceDefPtr monConfig, const char *vm); diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 2923324..7a4de11 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -116,10 +116,9 @@ mymain(void) { int ret = 0; + driver.config = virQEMUDriverConfigNew(false); if ((driver.caps = testQemuCapsInit()) == NULL) return EXIT_FAILURE; - if ((driver.stateDir = strdup("/nowhere")) == NULL) - return EXIT_FAILURE; # define DO_TEST_FULL(name, extraFlags, migrateFrom) \ do { \ @@ -192,17 +191,8 @@ mymain(void) DO_TEST("graphics-vnc"); DO_TEST("graphics-vnc-socket"); - driver.vncSASL = 1; - driver.vncSASLdir = strdup("/root/.sasl2"); DO_TEST("graphics-vnc-sasl"); - driver.vncTLS = 1; - driver.vncTLSx509verify = 1; - driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); DO_TEST("graphics-vnc-tls"); - driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0; - VIR_FREE(driver.vncSASLdir); - VIR_FREE(driver.vncTLSx509certdir); - driver.vncSASLdir = driver.vncTLSx509certdir = NULL; DO_TEST("graphics-sdl"); DO_TEST("graphics-sdl-fullscreen"); @@ -251,7 +241,7 @@ mymain(void) DO_TEST_FULL("qemu-ns-no-env", 1, NULL); - VIR_FREE(driver.stateDir); + virObjectUnref(driver.config); virCapabilitiesFree(driver.caps); return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args index a3f09e3..dd99025 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-vnc-tls.args @@ -2,4 +2,4 @@ LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ SASL_CONF_DIR=/root/.sasl2 QEMU_AUDIO_DRV=none /usr/bin/qemu -S -M pc -m 214 \ -smp 1 -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \ /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -vnc \ -127.0.0.1:3,tls,x509verify=/etc/pki/tls/qemu,sasl +127.0.0.1:3,tls,x509verify=/etc/pki/libvirt-vnc,sasl diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 31ed116..3cf9cbd 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -278,18 +278,23 @@ mymain(void) if (!abs_top_srcdir) abs_top_srcdir = ".."; + driver.config = virQEMUDriverConfigNew(false); + VIR_FREE(driver.config->spiceListen); + VIR_FREE(driver.config->vncListen); + if ((driver.caps = testQemuCapsInit()) == NULL) return EXIT_FAILURE; - if ((driver.stateDir = strdup("/nowhere")) == NULL) - return EXIT_FAILURE; - if ((driver.hugetlbfs_mount = strdup("/dev/hugepages")) == NULL) + VIR_FREE(driver.config->stateDir); + if ((driver.config->stateDir = strdup("/nowhere")) == NULL) return EXIT_FAILURE; - if ((driver.hugepage_path = strdup("/dev/hugepages/libvirt/qemu")) == NULL) + VIR_FREE(driver.config->hugetlbfsMount); + if ((driver.config->hugetlbfsMount = strdup("/dev/hugepages")) == NULL) return EXIT_FAILURE; - driver.spiceTLS = 1; - if (!(driver.spiceTLSx509certdir = strdup("/etc/pki/libvirt-spice"))) + VIR_FREE(driver.config->hugepagePath); + if ((driver.config->hugepagePath = strdup("/dev/hugepages/libvirt/qemu")) == NULL) return EXIT_FAILURE; - if (!(driver.spicePassword = strdup("123456"))) + driver.config->spiceTLS = 1; + if (!(driver.config->spicePassword = strdup("123456"))) return EXIT_FAILURE; if (virAsprintf(&map, "%s/src/cpu/cpu_map.xml", abs_top_srcdir) < 0 || cpuMapOverride(map) < 0) { @@ -544,17 +549,15 @@ mymain(void) DO_TEST("graphics-vnc", QEMU_CAPS_VNC); DO_TEST("graphics-vnc-socket", QEMU_CAPS_VNC); - driver.vncSASL = 1; - driver.vncSASLdir = strdup("/root/.sasl2"); + driver.config->vncSASL = 1; + VIR_FREE(driver.config->vncSASLdir); + driver.config->vncSASLdir = strdup("/root/.sasl2"); DO_TEST("graphics-vnc-sasl", QEMU_CAPS_VNC, QEMU_CAPS_VGA); - driver.vncTLS = 1; - driver.vncTLSx509verify = 1; - driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); + driver.config->vncTLS = 1; + driver.config->vncTLSx509verify = 1; DO_TEST("graphics-vnc-tls", QEMU_CAPS_VNC); - driver.vncSASL = driver.vncTLSx509verify = driver.vncTLS = 0; - VIR_FREE(driver.vncSASLdir); - VIR_FREE(driver.vncTLSx509certdir); - driver.vncSASLdir = driver.vncTLSx509certdir = NULL; + driver.config->vncSASL = driver.config->vncTLSx509verify = driver.config->vncTLS = 0; + driver.config->vncSASLdir = driver.config->vncTLSx509certdir = NULL; DO_TEST("graphics-sdl", NONE); DO_TEST("graphics-sdl-fullscreen", NONE); @@ -866,7 +869,7 @@ mymain(void) QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_VIDEO_PRIMARY, QEMU_CAPS_DEVICE_QXL, QEMU_CAPS_DEVICE_QXL_VGA); - VIR_FREE(driver.stateDir); + virObjectUnref(driver.config); virCapabilitiesFree(driver.caps); VIR_FREE(map); diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c index 93f1f1b..38b5e88 100644 --- a/tests/qemuxmlnstest.c +++ b/tests/qemuxmlnstest.c @@ -201,19 +201,9 @@ mymain(void) if (!abs_top_srcdir) abs_top_srcdir = ".."; + driver.config = virQEMUDriverConfigNew(false); if ((driver.caps = testQemuCapsInit()) == NULL) return EXIT_FAILURE; - if ((driver.stateDir = strdup("/nowhere")) == NULL) - return EXIT_FAILURE; - if ((driver.hugetlbfs_mount = strdup("/dev/hugepages")) == NULL) - return EXIT_FAILURE; - if ((driver.hugepage_path = strdup("/dev/hugepages/libvirt/qemu")) == NULL) - return EXIT_FAILURE; - driver.spiceTLS = 1; - if (!(driver.spiceTLSx509certdir = strdup("/etc/pki/libvirt-spice"))) - return EXIT_FAILURE; - if (!(driver.spicePassword = strdup("123456"))) - return EXIT_FAILURE; if (virAsprintf(&map, "%s/src/cpu/cpu_map.xml", abs_top_srcdir) < 0 || cpuMapOverride(map) < 0) { VIR_FREE(map); @@ -260,7 +250,7 @@ mymain(void) DO_TEST("qemu-ns-commandline-ns0", false, NONE); DO_TEST("qemu-ns-commandline-ns1", false, NONE); - VIR_FREE(driver.stateDir); + virObjectUnref(driver.config); virCapabilitiesFree(driver.caps); VIR_FREE(map); -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> The APIs names for accessing the domain list object are very inconsistent. Rename them all to have a standard virDomainObjList prefix. --- src/conf/domain_conf.c | 156 +++++++++++++++++--------------- src/conf/domain_conf.h | 56 ++++++------ src/libvirt_private.syms | 20 ++-- src/libxl/libxl_conf.h | 2 +- src/libxl/libxl_driver.c | 168 +++++++++++++++++----------------- src/lxc/lxc_conf.h | 2 +- src/lxc/lxc_driver.c | 144 ++++++++++++++--------------- src/lxc/lxc_process.c | 12 +-- src/openvz/openvz_conf.c | 6 +- src/openvz/openvz_conf.h | 2 +- src/openvz/openvz_driver.c | 67 +++++++------- src/parallels/parallels_driver.c | 52 ++++++----- src/parallels/parallels_storage.c | 2 +- src/parallels/parallels_utils.h | 2 +- src/qemu/qemu_conf.c | 2 +- src/qemu/qemu_conf.h | 2 +- src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_driver.c | 186 +++++++++++++++++++------------------- src/qemu/qemu_migration.c | 8 +- src/qemu/qemu_process.c | 2 +- src/test/test_driver.c | 179 ++++++++++++++++++------------------ src/uml/uml_conf.h | 2 +- src/uml/uml_driver.c | 140 ++++++++++++++-------------- src/vmware/vmware_conf.c | 7 +- src/vmware/vmware_conf.h | 2 +- src/vmware/vmware_driver.c | 72 ++++++++------- 26 files changed, 664 insertions(+), 631 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0b9ba13..408584c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -778,18 +778,30 @@ virDomainObjListDataFree(void *payload, const void *name ATTRIBUTE_UNUSED) virObjectUnref(obj); } -int virDomainObjListInit(virDomainObjListPtr doms) +virDomainObjListPtr virDomainObjListNew(void) { + virDomainObjListPtr doms; + + if (VIR_ALLOC(doms) < 0) { + virReportOOMError(); + return NULL; + } + doms->objs = virHashCreate(50, virDomainObjListDataFree); - if (!doms->objs) - return -1; - return 0; + if (!doms->objs) { + VIR_FREE(doms); + return NULL; + } + return doms; } -void virDomainObjListDeinit(virDomainObjListPtr doms) +void virDomainObjListFree(virDomainObjListPtr doms) { + if (!doms) + return; virHashFree(doms->objs); + VIR_FREE(doms); } @@ -809,8 +821,8 @@ static int virDomainObjListSearchID(const void *payload, return want; } -virDomainObjPtr virDomainFindByID(const virDomainObjListPtr doms, - int id) +virDomainObjPtr virDomainObjListFindByID(const virDomainObjListPtr doms, + int id) { virDomainObjPtr obj; obj = virHashSearch(doms->objs, virDomainObjListSearchID, &id); @@ -820,8 +832,8 @@ virDomainObjPtr virDomainFindByID(const virDomainObjListPtr doms, } -virDomainObjPtr virDomainFindByUUID(const virDomainObjListPtr doms, - const unsigned char *uuid) +virDomainObjPtr virDomainObjListFindByUUID(const virDomainObjListPtr doms, + const unsigned char *uuid) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr obj; @@ -848,8 +860,8 @@ static int virDomainObjListSearchName(const void *payload, return want; } -virDomainObjPtr virDomainFindByName(const virDomainObjListPtr doms, - const char *name) +virDomainObjPtr virDomainObjListFindByName(const virDomainObjListPtr doms, + const char *name) { virDomainObjPtr obj; obj = virHashSearch(doms->objs, virDomainObjListSearchName, name); @@ -1844,15 +1856,15 @@ void virDomainObjAssignDef(virDomainObjPtr domain, } } -virDomainObjPtr virDomainAssignDef(virCapsPtr caps, - virDomainObjListPtr doms, - const virDomainDefPtr def, - bool live) +virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, + virCapsPtr caps, + const virDomainDefPtr def, + bool live) { virDomainObjPtr domain; char uuidstr[VIR_UUID_STRING_BUFLEN]; - if ((domain = virDomainFindByUUID(doms, def->uuid))) { + if ((domain = virDomainObjListFindByUUID(doms, def->uuid))) { virDomainObjAssignDef(domain, def, live); return domain; } @@ -1984,8 +1996,8 @@ cleanup: * and must also have locked 'dom', to ensure no one else * is either waiting for 'dom' or still using it */ -void virDomainRemoveInactive(virDomainObjListPtr doms, - virDomainObjPtr dom) +void virDomainObjListRemove(virDomainObjListPtr doms, + virDomainObjPtr dom) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->def->uuid, uuidstr); @@ -14758,14 +14770,15 @@ cleanup: } -static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps, - virDomainObjListPtr doms, - const char *configDir, - const char *autostartDir, - const char *name, - unsigned int expectedVirtTypes, - virDomainLoadConfigNotify notify, - void *opaque) +static virDomainObjPtr +virDomainObjListLoadConfig(virDomainObjListPtr doms, + virCapsPtr caps, + const char *configDir, + const char *autostartDir, + const char *name, + unsigned int expectedVirtTypes, + virDomainLoadConfigNotify notify, + void *opaque) { char *configFile = NULL, *autostartLink = NULL; virDomainDefPtr def = NULL; @@ -14788,7 +14801,7 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps, /* if the domain is already in our hashtable, we only need to * update the autostart flag */ - if ((dom = virDomainFindByUUID(doms, def->uuid))) { + if ((dom = virDomainObjListFindByUUID(doms, def->uuid))) { dom->autostart = autostart; if (virDomainObjIsActive(dom) && @@ -14803,7 +14816,7 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps, return dom; } - if (!(dom = virDomainAssignDef(caps, doms, def, false))) + if (!(dom = virDomainObjListAdd(doms, caps, def, false))) goto error; dom->autostart = autostart; @@ -14822,13 +14835,14 @@ error: return NULL; } -static virDomainObjPtr virDomainLoadStatus(virCapsPtr caps, - virDomainObjListPtr doms, - const char *statusDir, - const char *name, - unsigned int expectedVirtTypes, - virDomainLoadConfigNotify notify, - void *opaque) +static virDomainObjPtr +virDomainObjListLoadStatus(virDomainObjListPtr doms, + virCapsPtr caps, + const char *statusDir, + const char *name, + unsigned int expectedVirtTypes, + virDomainLoadConfigNotify notify, + void *opaque) { char *statusFile = NULL; virDomainObjPtr obj = NULL; @@ -14867,14 +14881,14 @@ error: return NULL; } -int virDomainLoadAllConfigs(virCapsPtr caps, - virDomainObjListPtr doms, - const char *configDir, - const char *autostartDir, - int liveStatus, - unsigned int expectedVirtTypes, - virDomainLoadConfigNotify notify, - void *opaque) +int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, + virCapsPtr caps, + const char *configDir, + const char *autostartDir, + int liveStatus, + unsigned int expectedVirtTypes, + virDomainLoadConfigNotify notify, + void *opaque) { DIR *dir; struct dirent *entry; @@ -14903,22 +14917,22 @@ int virDomainLoadAllConfigs(virCapsPtr caps, kill the whole process */ VIR_INFO("Loading config file '%s.xml'", entry->d_name); if (liveStatus) - dom = virDomainLoadStatus(caps, - doms, - configDir, - entry->d_name, - expectedVirtTypes, - notify, - opaque); + dom = virDomainObjListLoadStatus(doms, + caps, + configDir, + entry->d_name, + expectedVirtTypes, + notify, + opaque); else - dom = virDomainLoadConfig(caps, - doms, - configDir, - autostartDir, - entry->d_name, - expectedVirtTypes, - notify, - opaque); + dom = virDomainObjListLoadConfig(doms, + caps, + configDir, + autostartDir, + entry->d_name, + expectedVirtTypes, + notify, + opaque); if (dom) { virObjectUnlock(dom); if (!liveStatus) @@ -15029,7 +15043,7 @@ virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def) } /* - * virDomainObjIsDuplicate: + * virDomainObjListIsDuplicate: * @doms : virDomainObjListPtr to search * @def : virDomainDefPtr definition of domain to lookup * @check_active: If true, ensure that domain is not active @@ -15039,16 +15053,16 @@ virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def) * 1 if domain is a duplicate */ int -virDomainObjIsDuplicate(virDomainObjListPtr doms, - virDomainDefPtr def, - unsigned int check_active) +virDomainObjListIsDuplicate(virDomainObjListPtr doms, + virDomainDefPtr def, + unsigned int check_active) { int ret = -1; int dupVM = 0; virDomainObjPtr vm = NULL; /* See if a VM with matching UUID already exists */ - vm = virDomainFindByUUID(doms, def->uuid); + vm = virDomainObjListFindByUUID(doms, def->uuid); if (vm) { /* UUID matches, but if names don't match, refuse it */ if (STRNEQ(vm->def->name, def->name)) { @@ -15073,7 +15087,7 @@ virDomainObjIsDuplicate(virDomainObjListPtr doms, dupVM = 1; } else { /* UUID does not match, but if a name matches, refuse it */ - vm = virDomainFindByName(doms, def->name); + vm = virDomainObjListFindByName(doms, def->name); if (vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(vm->def->uuid, uuidstr); @@ -15941,10 +15955,10 @@ cleanup: #undef MATCH int -virDomainList(virConnectPtr conn, - virHashTablePtr domobjs, - virDomainPtr **domains, - unsigned int flags) +virDomainObjListExport(virDomainObjListPtr doms, + virConnectPtr conn, + virDomainPtr **domains, + unsigned int flags) { int ret = -1; int i; @@ -15952,13 +15966,13 @@ virDomainList(virConnectPtr conn, struct virDomainListData data = { conn, NULL, flags, 0, false }; if (domains) { - if (VIR_ALLOC_N(data.domains, virHashSize(domobjs) + 1) < 0) { + if (VIR_ALLOC_N(data.domains, virHashSize(doms->objs) + 1) < 0) { virReportOOMError(); goto cleanup; } } - virHashForEach(domobjs, virDomainListPopulate, &data); + virHashForEach(doms->objs, virDomainListPopulate, &data); if (data.error) goto cleanup; @@ -15974,7 +15988,7 @@ virDomainList(virConnectPtr conn, cleanup: if (data.domains) { - int count = virHashSize(domobjs); + int count = virHashSize(doms->objs); for (i = 0; i < count; i++) virObjectUnref(data.domains[i]); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index ce36003..97acbe1 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1906,15 +1906,15 @@ virDomainObjIsActive(virDomainObjPtr dom) virDomainObjPtr virDomainObjNew(virCapsPtr caps); -int virDomainObjListInit(virDomainObjListPtr objs); -void virDomainObjListDeinit(virDomainObjListPtr objs); +virDomainObjListPtr virDomainObjListNew(void); +void virDomainObjListFree(virDomainObjListPtr objs); -virDomainObjPtr virDomainFindByID(const virDomainObjListPtr doms, - int id); -virDomainObjPtr virDomainFindByUUID(const virDomainObjListPtr doms, - const unsigned char *uuid); -virDomainObjPtr virDomainFindByName(const virDomainObjListPtr doms, - const char *name); +virDomainObjPtr virDomainObjListFindByID(const virDomainObjListPtr doms, + int id); +virDomainObjPtr virDomainObjListFindByUUID(const virDomainObjListPtr doms, + const unsigned char *uuid); +virDomainObjPtr virDomainObjListFindByName(const virDomainObjListPtr doms, + const char *name); bool virDomainObjTaint(virDomainObjPtr obj, enum virDomainTaintFlags taint); @@ -1974,10 +1974,10 @@ virDomainChrDefPtr virDomainChrDefNew(void); /* live == true means def describes an active domain (being migrated or * restored) as opposed to a new persistent configuration of the domain */ -virDomainObjPtr virDomainAssignDef(virCapsPtr caps, - virDomainObjListPtr doms, - const virDomainDefPtr def, - bool live); +virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, + virCapsPtr caps, + const virDomainDefPtr def, + bool live); void virDomainObjAssignDef(virDomainObjPtr domain, const virDomainDefPtr def, bool live); @@ -1999,8 +1999,8 @@ virDomainDefPtr virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src, virDomainDefPtr virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom); -void virDomainRemoveInactive(virDomainObjListPtr doms, - virDomainObjPtr dom); +void virDomainObjListRemove(virDomainObjListPtr doms, + virDomainObjPtr dom); virDomainDeviceDefPtr virDomainDeviceDefParse(virCapsPtr caps, virDomainDefPtr def, @@ -2137,14 +2137,14 @@ typedef void (*virDomainLoadConfigNotify)(virDomainObjPtr dom, int newDomain, void *opaque); -int virDomainLoadAllConfigs(virCapsPtr caps, - virDomainObjListPtr doms, - const char *configDir, - const char *autostartDir, - int liveStatus, - unsigned int expectedVirtTypes, - virDomainLoadConfigNotify notify, - void *opaque); +int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, + virCapsPtr caps, + const char *configDir, + const char *autostartDir, + int liveStatus, + unsigned int expectedVirtTypes, + virDomainLoadConfigNotify notify, + void *opaque); int virDomainDeleteConfig(const char *configDir, const char *autostartDir, @@ -2162,9 +2162,9 @@ int virDomainFSIndexByName(virDomainDefPtr def, const char *name); int virDomainVideoDefaultType(virDomainDefPtr def); int virDomainVideoDefaultRAM(virDomainDefPtr def, int type); -int virDomainObjIsDuplicate(virDomainObjListPtr doms, - virDomainDefPtr def, - unsigned int check_active); +int virDomainObjListIsDuplicate(virDomainObjListPtr doms, + virDomainDefPtr def, + unsigned int check_active); int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active); @@ -2361,8 +2361,10 @@ VIR_ENUM_DECL(virDomainStartupPolicy) VIR_CONNECT_LIST_DOMAINS_FILTERS_AUTOSTART | \ VIR_CONNECT_LIST_DOMAINS_FILTERS_SNAPSHOT) -int virDomainList(virConnectPtr conn, virHashTablePtr domobjs, - virDomainPtr **domains, unsigned int flags); +int virDomainObjListExport(virDomainObjListPtr doms, + virConnectPtr conn, + virDomainPtr **domains, + unsigned int flags); virDomainVcpuPinDefPtr virDomainLookupVcpuPin(virDomainDefPtr def, int vcpuid); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fc23adc..9441f48 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -283,7 +283,6 @@ virBlkioDeviceWeightArrayClear; virDiskNameToBusDeviceIndex; virDiskNameToIndex; virDomainActualNetDefFree; -virDomainAssignDef; virDomainBlockedReasonTypeFromString; virDomainBlockedReasonTypeToString; virDomainBootMenuTypeFromString; @@ -374,9 +373,6 @@ virDomainEmulatorPinAdd; virDomainEmulatorPinDel; virDomainFeatureStateTypeFromString; virDomainFeatureStateTypeToString; -virDomainFindByID; -virDomainFindByName; -virDomainFindByUUID; virDomainFSDefFree; virDomainFSIndexByName; virDomainFSTypeFromString; @@ -441,9 +437,7 @@ virDomainLifecycleCrashTypeFromString; virDomainLifecycleCrashTypeToString; virDomainLifecycleTypeFromString; virDomainLifecycleTypeToString; -virDomainList; virDomainLiveConfigHelperMethod; -virDomainLoadAllConfigs; virDomainLockFailureTypeFromString; virDomainLockFailureTypeToString; virDomainLookupVcpuPin; @@ -475,12 +469,19 @@ virDomainObjAssignDef; virDomainObjCopyPersistentDef; virDomainObjGetPersistentDef; virDomainObjGetState; -virDomainObjIsDuplicate; -virDomainObjListDeinit; +virDomainObjListAdd; +virDomainObjListExport; +virDomainObjListFindByID; +virDomainObjListFindByName; +virDomainObjListFindByUUID; +virDomainObjListFree; virDomainObjListGetActiveIDs; virDomainObjListGetInactiveNames; -virDomainObjListInit; +virDomainObjListIsDuplicate; +virDomainObjListLoadAllConfigs; +virDomainObjListNew; virDomainObjListNumOfDomains; +virDomainObjListRemove; virDomainObjNew; virDomainObjSetDefTransient; virDomainObjSetState; @@ -493,7 +494,6 @@ virDomainPMStateTypeFromString; virDomainPMStateTypeToString; virDomainRedirdevBusTypeFromString; virDomainRedirdevBusTypeToString; -virDomainRemoveInactive; virDomainRunningReasonTypeFromString; virDomainRunningReasonTypeToString; virDomainSaveConfig; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index a3cce08..1d6e80e 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -66,7 +66,7 @@ struct _libxlDriverPrivate { virStateInhibitCallback inhibitCallback; void *inhibitOpaque; - virDomainObjList domains; + virDomainObjListPtr domains; virDomainEventStatePtr domainEventState; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index a8c4cae..4afd106 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -559,7 +559,7 @@ libxlEventHandler(void *data, const libxl_event *event) } libxlVmReap(driver, vm, reason); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } break; @@ -908,7 +908,7 @@ libxlReconnectDomain(void *payload, out: libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN); if (!vm->persistent) - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); else virObjectUnlock(vm); } @@ -916,7 +916,7 @@ out: static void libxlReconnectDomains(libxlDriverPrivatePtr driver) { - virHashForEach(driver->domains.objs, libxlReconnectDomain, driver); + virHashForEach(driver->domains->objs, libxlReconnectDomain, driver); } static int @@ -927,7 +927,7 @@ libxlShutdown(void) libxlDriverLock(libxl_driver); virCapabilitiesFree(libxl_driver->caps); - virDomainObjListDeinit(&libxl_driver->domains); + virDomainObjListFree(libxl_driver->domains); libxl_ctx_free(libxl_driver->ctx); xtl_logger_destroy(libxl_driver->logger); if (libxl_driver->logger_file) @@ -994,8 +994,8 @@ libxlStartup(bool privileged, LIBXL_VNC_PORT_MAX))) goto error; - if (virDomainObjListInit(&libxl_driver->domains) < 0) - goto out_of_memory; + if (!(libxl_driver->domains = virDomainObjListNew())) + goto error; if (virAsprintf(&libxl_driver->configDir, "%s", LIBXL_CONFIG_DIR) == -1) @@ -1089,29 +1089,29 @@ libxlStartup(bool privileged, libxl_driver->caps->privateDataFreeFunc = libxlDomainObjPrivateFree; /* Load running domains first. */ - if (virDomainLoadAllConfigs(libxl_driver->caps, - &libxl_driver->domains, - libxl_driver->stateDir, - libxl_driver->autostartDir, - 1, 1 << VIR_DOMAIN_VIRT_XEN, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(libxl_driver->domains, + libxl_driver->caps, + libxl_driver->stateDir, + libxl_driver->autostartDir, + 1, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, NULL) < 0) goto error; libxlReconnectDomains(libxl_driver); /* Then inactive persistent configs */ - if (virDomainLoadAllConfigs(libxl_driver->caps, - &libxl_driver->domains, - libxl_driver->configDir, - libxl_driver->autostartDir, - 0, 1 << VIR_DOMAIN_VIRT_XEN, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(libxl_driver->domains, + libxl_driver->caps, + libxl_driver->configDir, + libxl_driver->autostartDir, + 0, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, NULL) < 0) goto error; - virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain, + virHashForEach(libxl_driver->domains->objs, libxlAutostartDomain, libxl_driver); - virHashForEach(libxl_driver->domains.objs, libxlDomainManagedSaveLoad, + virHashForEach(libxl_driver->domains->objs, libxlDomainManagedSaveLoad, libxl_driver); libxlDriverUnlock(libxl_driver); @@ -1137,14 +1137,14 @@ libxlReload(void) return 0; libxlDriverLock(libxl_driver); - virDomainLoadAllConfigs(libxl_driver->caps, - &libxl_driver->domains, - libxl_driver->configDir, - libxl_driver->autostartDir, - 1, 1 << VIR_DOMAIN_VIRT_XEN, - NULL, libxl_driver); - - virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain, + virDomainObjListLoadAllConfigs(libxl_driver->domains, + libxl_driver->caps, + libxl_driver->configDir, + libxl_driver->autostartDir, + 1, 1 << VIR_DOMAIN_VIRT_XEN, + NULL, libxl_driver); + + virHashForEach(libxl_driver->domains->objs, libxlAutostartDomain, libxl_driver); libxlDriverUnlock(libxl_driver); @@ -1265,7 +1265,7 @@ libxlListDomains(virConnectPtr conn, int *ids, int nids) int n; libxlDriverLock(driver); - n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids); + n = virDomainObjListGetActiveIDs(driver->domains, ids, nids); libxlDriverUnlock(driver); return n; @@ -1278,7 +1278,7 @@ libxlNumDomains(virConnectPtr conn) int n; libxlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); libxlDriverUnlock(driver); return n; @@ -1301,17 +1301,18 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; if (libxlVmStart(driver, vm, (flags & VIR_DOMAIN_START_PAUSED) != 0, -1) < 0) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; goto cleanup; } @@ -1336,7 +1337,7 @@ libxlDomainLookupByID(virConnectPtr conn, int id) virDomainPtr dom = NULL; libxlDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); libxlDriverUnlock(driver); if (!vm) { @@ -1362,7 +1363,7 @@ libxlDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) virDomainPtr dom = NULL; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1388,7 +1389,7 @@ libxlDomainLookupByName(virConnectPtr conn, const char *name) virDomainPtr dom = NULL; libxlDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); libxlDriverUnlock(driver); if (!vm) { @@ -1416,7 +1417,7 @@ libxlDomainSuspend(virDomainPtr dom) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1474,7 +1475,7 @@ libxlDomainResume(virDomainPtr dom) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1534,7 +1535,7 @@ libxlDomainShutdownFlags(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -1587,7 +1588,7 @@ libxlDomainReboot(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -1630,7 +1631,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -1655,7 +1656,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, } if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -1684,7 +1685,7 @@ libxlDomainGetOSType(virDomainPtr dom) char *type = NULL; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -1711,7 +1712,7 @@ libxlDomainGetMaxMemory(virDomainPtr dom) unsigned long long ret = 0; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1742,7 +1743,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, VIR_DOMAIN_MEM_MAXIMUM, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1861,7 +1862,7 @@ libxlDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1908,7 +1909,7 @@ libxlDomainGetState(virDomainPtr dom, virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -1994,7 +1995,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm, vm->hasManagedSave = true; if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2025,7 +2026,7 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml, } libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2079,17 +2080,19 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from, if (fd < 0) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, &driver->domains, def, true))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, true))) goto cleanup; def = NULL; if ((ret = libxlVmStart(driver, vm, false, fd)) < 0 && !vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2122,7 +2125,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) virCheckFlags(VIR_DUMP_LIVE | VIR_DUMP_CRASH, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2173,7 +2176,7 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) } if ((flags & VIR_DUMP_CRASH) && !vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2214,7 +2217,7 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2280,7 +2283,7 @@ libxlDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2309,7 +2312,7 @@ libxlDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2368,7 +2371,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, } libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2487,7 +2490,7 @@ libxlDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) VIR_DOMAIN_VCPU_MAXIMUM, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2544,7 +2547,7 @@ libxlDomainPinVcpu(virDomainPtr dom, unsigned int vcpu, unsigned char *cpumap, libxl_bitmap map; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2611,7 +2614,7 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo, unsigned char *cpumap; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2674,7 +2677,7 @@ libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) /* Flags checked by virDomainDefFormat */ libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -2790,7 +2793,7 @@ libxlListDefinedDomains(virConnectPtr conn, int n; libxlDriverLock(driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); libxlDriverUnlock(driver); return n; } @@ -2802,7 +2805,7 @@ libxlNumDefinedDomains(virConnectPtr conn) int n; libxlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); libxlDriverUnlock(driver); return n; @@ -2819,7 +2822,7 @@ libxlDomainCreateWithFlags(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_START_PAUSED, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2865,18 +2868,19 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if ((dupVM = virDomainObjIsDuplicate(&driver->domains, def, 0)) < 0) + if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; vm->persistent = 1; if (virDomainSaveConfig(driver->configDir, vm->newDef ? vm->newDef : vm->def) < 0) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; goto cleanup; } @@ -2913,7 +2917,7 @@ libxlDomainUndefineFlags(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_UNDEFINE_MANAGED_SAVE, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2960,7 +2964,7 @@ libxlDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -3352,7 +3356,7 @@ libxlDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid")); @@ -3553,7 +3557,7 @@ libxlDomainGetAutostart(virDomainPtr dom, int *autostart) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -3582,7 +3586,7 @@ libxlDomainSetAutostart(virDomainPtr dom, int autostart) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -3652,7 +3656,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams) libxl_scheduler sched_id; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -3717,7 +3721,7 @@ libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, virCheckFlags(0, -1); libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -3800,7 +3804,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, return -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -3870,7 +3874,7 @@ libxlDomainIsActive(virDomainPtr dom) int ret = -1; libxlDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -3892,7 +3896,7 @@ libxlDomainIsPersistent(virDomainPtr dom) int ret = -1; libxlDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -3914,7 +3918,7 @@ libxlDomainIsUpdated(virDomainPtr dom) int ret = -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -3981,7 +3985,7 @@ libxlListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); libxlDriverLock(driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); libxlDriverUnlock(driver); return ret; diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index d45e0a0..a6c111e 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -58,7 +58,7 @@ struct _virLXCDriver { virStateInhibitCallback inhibitCallback; void *inhibitOpaque; - virDomainObjList domains; + virDomainObjListPtr domains; char *configDir; char *autostartDir; char *stateDir; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 3268e22..9cd2fd8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -84,7 +84,7 @@ static int lxcVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, virHashIterator iter, void *data) { - virHashForEach(lxc_driver->domains.objs, iter, data); + virHashForEach(lxc_driver->domains->objs, iter, data); return 0; } @@ -208,7 +208,7 @@ static virDomainPtr lxcDomainLookupByID(virConnectPtr conn, virDomainPtr dom = NULL; lxcDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); lxcDriverUnlock(driver); if (!vm) { @@ -235,7 +235,7 @@ static virDomainPtr lxcDomainLookupByUUID(virConnectPtr conn, virDomainPtr dom = NULL; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); lxcDriverUnlock(driver); if (!vm) { @@ -264,7 +264,7 @@ static virDomainPtr lxcDomainLookupByName(virConnectPtr conn, virDomainPtr dom = NULL; lxcDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); lxcDriverUnlock(driver); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, @@ -290,7 +290,7 @@ static int lxcDomainIsActive(virDomainPtr dom) int ret = -1; lxcDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!obj) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -315,7 +315,7 @@ static int lxcDomainIsPersistent(virDomainPtr dom) int ret = -1; lxcDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!obj) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -339,7 +339,7 @@ static int lxcDomainIsUpdated(virDomainPtr dom) int ret = -1; lxcDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!obj) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -361,7 +361,7 @@ static int lxcListDomains(virConnectPtr conn, int *ids, int nids) { int n; lxcDriverLock(driver); - n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids); + n = virDomainObjListGetActiveIDs(driver->domains, ids, nids); lxcDriverUnlock(driver); return n; @@ -372,7 +372,7 @@ static int lxcNumDomains(virConnectPtr conn) { int n; lxcDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); lxcDriverUnlock(driver); return n; @@ -384,7 +384,7 @@ static int lxcListDefinedDomains(virConnectPtr conn, int n; lxcDriverLock(driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); lxcDriverUnlock(driver); return n; @@ -396,7 +396,7 @@ static int lxcNumDefinedDomains(virConnectPtr conn) { int n; lxcDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); lxcDriverUnlock(driver); return n; @@ -422,7 +422,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if ((dupVM = virDomainObjIsDuplicate(&driver->domains, def, 0)) < 0) + if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) goto cleanup; if ((def->nets != NULL) && !(driver->have_netns)) { @@ -431,15 +431,16 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) goto cleanup; } - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; vm->persistent = 1; if (virDomainSaveConfig(driver->configDir, vm->newDef ? vm->newDef : vm->def) < 0) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; goto cleanup; } @@ -475,7 +476,7 @@ static int lxcDomainUndefineFlags(virDomainPtr dom, virCheckFlags(0, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -502,7 +503,7 @@ static int lxcDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -531,7 +532,7 @@ static int lxcDomainGetInfo(virDomainPtr dom, int ret = -1, rc; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -596,7 +597,7 @@ lxcDomainGetState(virDomainPtr dom, virCheckFlags(0, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -623,7 +624,7 @@ static char *lxcGetOSType(virDomainPtr dom) char *ret = NULL; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -654,7 +655,7 @@ lxcDomainGetMaxMemory(virDomainPtr dom) unsigned long long ret = 0; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -679,7 +680,7 @@ static int lxcDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax) { int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -712,7 +713,7 @@ static int lxcDomainSetMemory(virDomainPtr dom, unsigned long newmem) { int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -787,7 +788,7 @@ lxcDomainSetMemoryParameters(virDomainPtr dom, return -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -857,7 +858,7 @@ lxcDomainGetMemoryParameters(virDomainPtr dom, virCheckFlags(0, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -949,7 +950,7 @@ static char *lxcDomainGetXMLDesc(virDomainPtr dom, /* Flags checked by virDomainDefFormat */ lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -989,7 +990,7 @@ static int lxcDomainStartWithFlags(virDomainPtr dom, unsigned int flags) virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -1076,7 +1077,7 @@ lxcDomainCreateAndStart(virConnectPtr conn, if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; if ((def->nets != NULL) && !(driver->have_netns)) { @@ -1086,8 +1087,9 @@ lxcDomainCreateAndStart(virConnectPtr conn, } - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; @@ -1095,7 +1097,7 @@ lxcDomainCreateAndStart(virConnectPtr conn, (flags & VIR_DOMAIN_START_AUTODESTROY), VIR_DOMAIN_RUNNING_BOOTED) < 0) { virDomainAuditStart(vm, "booted", false); - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; goto cleanup; } @@ -1127,7 +1129,7 @@ static int lxcDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr secla int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); memset(seclabel, 0, sizeof(*seclabel)); @@ -1314,7 +1316,7 @@ lxcDomainDestroyFlags(virDomainPtr dom, virCheckFlags(0, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -1337,7 +1339,7 @@ lxcDomainDestroyFlags(virDomainPtr dom, priv->doneStopEvent = true; virDomainAuditStop(vm, "destroyed"); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -1441,7 +1443,7 @@ static int lxcStartup(bool privileged, } lxcDriverLock(lxc_driver); - if (virDomainObjListInit(&lxc_driver->domains) < 0) + if (!(lxc_driver->domains = virDomainObjListNew())) goto cleanup; lxc_driver->domainEventState = virDomainEventStateNew(); @@ -1477,23 +1479,23 @@ static int lxcStartup(bool privileged, goto cleanup; /* Get all the running persistent or transient configs first */ - if (virDomainLoadAllConfigs(lxc_driver->caps, - &lxc_driver->domains, - lxc_driver->stateDir, - NULL, - 1, 1 << VIR_DOMAIN_VIRT_LXC, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(lxc_driver->domains, + lxc_driver->caps, + lxc_driver->stateDir, + NULL, + 1, 1 << VIR_DOMAIN_VIRT_LXC, + NULL, NULL) < 0) goto cleanup; - virLXCProcessReconnectAll(lxc_driver, &lxc_driver->domains); + virLXCProcessReconnectAll(lxc_driver, lxc_driver->domains); /* Then inactive persistent configs */ - if (virDomainLoadAllConfigs(lxc_driver->caps, - &lxc_driver->domains, - lxc_driver->configDir, - lxc_driver->autostartDir, - 0, 1 << VIR_DOMAIN_VIRT_LXC, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(lxc_driver->domains, + lxc_driver->caps, + lxc_driver->configDir, + lxc_driver->autostartDir, + 0, 1 << VIR_DOMAIN_VIRT_LXC, + NULL, NULL) < 0) goto cleanup; lxcDriverUnlock(lxc_driver); @@ -1535,12 +1537,12 @@ lxcReload(void) { return 0; lxcDriverLock(lxc_driver); - virDomainLoadAllConfigs(lxc_driver->caps, - &lxc_driver->domains, - lxc_driver->configDir, - lxc_driver->autostartDir, - 0, 1 << VIR_DOMAIN_VIRT_LXC, - lxcNotifyLoadDomain, lxc_driver); + virDomainObjListLoadAllConfigs(lxc_driver->domains, + lxc_driver->caps, + lxc_driver->configDir, + lxc_driver->autostartDir, + 0, 1 << VIR_DOMAIN_VIRT_LXC, + lxcNotifyLoadDomain, lxc_driver); lxcDriverUnlock(lxc_driver); return 0; @@ -1553,7 +1555,7 @@ static int lxcShutdown(void) lxcDriverLock(lxc_driver); virNWFilterUnRegisterCallbackDriver(&lxcCallbackDriver); - virDomainObjListDeinit(&lxc_driver->domains); + virDomainObjListFree(lxc_driver->domains); virDomainEventStateFree(lxc_driver->domainEventState); virLXCProcessAutoDestroyShutdown(lxc_driver); @@ -1773,7 +1775,7 @@ lxcSetSchedulerParametersFlags(virDomainPtr dom, lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1915,7 +1917,7 @@ lxcGetSchedulerParametersFlags(virDomainPtr dom, cpu_bw_status = !!rc; } - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -2028,7 +2030,7 @@ lxcDomainSetBlkioParameters(virDomainPtr dom, lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -2126,7 +2128,7 @@ lxcDomainGetBlkioParameters(virDomainPtr dom, VIR_DOMAIN_AFFECT_CONFIG, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -2225,7 +2227,7 @@ lxcDomainInterfaceStats(virDomainPtr dom, int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -2280,7 +2282,7 @@ static int lxcDomainGetAutostart(virDomainPtr dom, int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -2308,7 +2310,7 @@ static int lxcDomainSetAutostart(virDomainPtr dom, int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2476,7 +2478,7 @@ static int lxcDomainSuspend(virDomainPtr dom) int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2541,7 +2543,7 @@ static int lxcDomainResume(virDomainPtr dom) int ret = -1; lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2601,7 +2603,7 @@ lxcDomainOpenConsole(virDomainPtr dom, lxcDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -2679,7 +2681,7 @@ lxcDomainSendProcessSignal(virDomainPtr dom, lxcDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, @@ -2744,7 +2746,7 @@ lxcListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); lxcDriverLock(driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); lxcDriverUnlock(driver); return ret; @@ -2766,7 +2768,7 @@ lxcDomainShutdownFlags(virDomainPtr dom, VIR_DOMAIN_SHUTDOWN_SIGNAL, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -2855,7 +2857,7 @@ lxcDomainReboot(virDomainPtr dom, VIR_DOMAIN_REBOOT_SIGNAL, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { @@ -4298,7 +4300,7 @@ lxcDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -4482,7 +4484,7 @@ static int lxcDomainOpenNamespace(virDomainPtr dom, virCheckFlags(0, -1); lxcDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); lxcDriverUnlock(driver); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 4ad7ba0..f0aae40 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -85,8 +85,8 @@ static void virLXCProcessAutoDestroyDom(void *payload, return; } - if (!(dom = virDomainFindByUUID(&data->driver->domains, - uuid))) { + if (!(dom = virDomainObjListFindByUUID(data->driver->domains, + uuid))) { VIR_DEBUG("No domain object to kill"); return; } @@ -101,7 +101,7 @@ static void virLXCProcessAutoDestroyDom(void *payload, priv->doneStopEvent = true; if (dom && !dom->persistent) - virDomainRemoveInactive(&data->driver->domains, dom); + virDomainObjListRemove(data->driver->domains, dom); if (dom) virObjectUnlock(dom); @@ -574,7 +574,7 @@ static void virLXCProcessMonitorEOFNotify(virLXCMonitorPtr mon, VIR_DEBUG("Stop event has already been sent"); } if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } } else { @@ -588,7 +588,7 @@ static void virLXCProcessMonitorEOFNotify(virLXCMonitorPtr mon, VIR_DOMAIN_EVENT_STOPPED, priv->stopReason); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } } @@ -1288,7 +1288,7 @@ virLXCProcessAutostartAll(virLXCDriverPtr driver) struct virLXCProcessAutostartData data = { driver, conn }; lxcDriverLock(driver); - virHashForEach(driver->domains.objs, virLXCProcessAutostartDomain, &data); + virHashForEach(driver->domains->objs, virLXCProcessAutostartDomain, &data); lxcDriverUnlock(driver); if (conn) diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 59de0fe..46f30ca 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -558,7 +558,7 @@ openvzFreeDriver(struct openvz_driver *driver) if (!driver) return; - virDomainObjListDeinit(&driver->domains); + virDomainObjListFree(driver->domains); virCapabilitiesFree(driver->caps); VIR_FREE(driver); } @@ -656,14 +656,14 @@ int openvzLoadDomains(struct openvz_driver *driver) { openvzReadMemConf(dom->def, veid); virUUIDFormat(dom->def->uuid, uuidstr); - if (virHashLookup(driver->domains.objs, uuidstr)) { + if (virHashLookup(driver->domains->objs, uuidstr)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Duplicate container UUID %s detected for %d"), uuidstr, veid); goto cleanup; } - if (virHashAddEntry(driver->domains.objs, uuidstr, dom) < 0) { + if (virHashAddEntry(driver->domains->objs, uuidstr, dom) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not add UUID for container %d"), veid); goto cleanup; diff --git a/src/openvz/openvz_conf.h b/src/openvz/openvz_conf.h index c1007f0..d7f21b3 100644 --- a/src/openvz/openvz_conf.h +++ b/src/openvz/openvz_conf.h @@ -45,7 +45,7 @@ struct openvz_driver { virMutex lock; virCapsPtr caps; - virDomainObjList domains; + virDomainObjListPtr domains; int version; }; diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index e12a84b..24d4202 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -240,9 +240,8 @@ openvzDomainGetHostname(virDomainPtr dom, unsigned int flags) virDomainObjPtr vm; virCheckFlags(0, NULL); - openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -280,7 +279,7 @@ static virDomainPtr openvzDomainLookupByID(virConnectPtr conn, virDomainPtr dom = NULL; openvzDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); openvzDriverUnlock(driver); if (!vm) { @@ -313,7 +312,7 @@ static char *openvzGetOSType(virDomainPtr dom) char *ret = NULL; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -338,7 +337,7 @@ static virDomainPtr openvzDomainLookupByUUID(virConnectPtr conn, virDomainPtr dom = NULL; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); openvzDriverUnlock(driver); if (!vm) { @@ -363,7 +362,7 @@ static virDomainPtr openvzDomainLookupByName(virConnectPtr conn, virDomainPtr dom = NULL; openvzDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); openvzDriverUnlock(driver); if (!vm) { @@ -389,7 +388,7 @@ static int openvzDomainGetInfo(virDomainPtr dom, int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -437,7 +436,7 @@ openvzDomainGetState(virDomainPtr dom, virCheckFlags(0, -1); openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -462,7 +461,7 @@ static int openvzDomainIsActive(virDomainPtr dom) int ret = -1; openvzDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -484,7 +483,7 @@ static int openvzDomainIsPersistent(virDomainPtr dom) int ret = -1; openvzDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -511,7 +510,7 @@ static char *openvzDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { /* Flags checked by virDomainDefFormat */ openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -555,7 +554,7 @@ static int openvzDomainSuspend(virDomainPtr dom) { int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -593,7 +592,7 @@ static int openvzDomainResume(virDomainPtr dom) { int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -636,7 +635,7 @@ openvzDomainShutdownFlags(virDomainPtr dom, virCheckFlags(0, -1); openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -687,7 +686,7 @@ static int openvzDomainReboot(virDomainPtr dom, virCheckFlags(0, -1); openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -961,15 +960,16 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - vm = virDomainFindByName(&driver->domains, vmdef->name); + vm = virDomainObjListFindByName(driver->domains, vmdef->name); if (vm) { virReportError(VIR_ERR_OPERATION_FAILED, _("Already an OPENVZ VM active with the id '%s'"), vmdef->name); goto cleanup; } - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, vmdef, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + vmdef, false))) goto cleanup; vmdef = NULL; vm->persistent = 1; @@ -1047,15 +1047,16 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - vm = virDomainFindByName(&driver->domains, vmdef->name); + vm = virDomainObjListFindByName(driver->domains, vmdef->name); if (vm) { virReportError(VIR_ERR_OPERATION_FAILED, _("Already an OPENVZ VM defined with the id '%s'"), vmdef->name); goto cleanup; } - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, vmdef, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + vmdef, false))) goto cleanup; vmdef = NULL; /* All OpenVZ domains seem to be persistent - this is a bit of a violation @@ -1126,7 +1127,7 @@ openvzDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); openvzDriverLock(driver); - vm = virDomainFindByName(&driver->domains, dom->name); + vm = virDomainObjListFindByName(driver->domains, dom->name); openvzDriverUnlock(driver); if (!vm) { @@ -1180,7 +1181,7 @@ openvzDomainUndefineFlags(virDomainPtr dom, virCheckFlags(0, -1); openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid")); @@ -1198,7 +1199,7 @@ openvzDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -1227,7 +1228,7 @@ openvzDomainSetAutostart(virDomainPtr dom, int autostart) int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -1257,7 +1258,7 @@ openvzDomainGetAutostart(virDomainPtr dom, int *autostart) int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -1352,7 +1353,7 @@ static int openvzDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, } openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -1439,7 +1440,7 @@ static virDrvOpenStatus openvzOpen(virConnectPtr conn, return VIR_DRV_OPEN_ERROR; } - if (virDomainObjListInit(&driver->domains) < 0) + if (!(driver->domains = virDomainObjListNew())) goto cleanup; if (!(driver->caps = openvzCapsInit())) @@ -1548,7 +1549,7 @@ static int openvzNumDomains(virConnectPtr conn) { int n; openvzDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); openvzDriverUnlock(driver); return n; @@ -1662,7 +1663,7 @@ static int openvzNumDefinedDomains(virConnectPtr conn) { int n; openvzDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); openvzDriverUnlock(driver); return n; @@ -1951,7 +1952,7 @@ openvzDomainInterfaceStats(virDomainPtr dom, int ret = -1; openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); openvzDriverUnlock(driver); if (!vm) { @@ -2052,7 +2053,7 @@ openvzDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml, VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1); openvzDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -2105,7 +2106,7 @@ openvzListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); openvzDriverLock(driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); openvzDriverUnlock(driver); return ret; diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index ea193af..e472df8 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -830,8 +830,9 @@ parallelsLoadDomain(parallelsConnPtr privconn, virJSONValuePtr jobj) if (parallelsAddVNCInfo(def, jobj) < 0) goto cleanup; - if (!(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, false))) + if (!(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, false))) goto cleanup; /* dom is locked here */ @@ -928,7 +929,7 @@ parallelsOpenDefault(virConnectPtr conn) if (!(privconn->caps = parallelsBuildCapabilities())) goto error; - if (virDomainObjListInit(&privconn->domains) < 0) + if (!(privconn->domains = virDomainObjListNew())) goto error; conn->privateData = privconn; @@ -939,7 +940,7 @@ parallelsOpenDefault(virConnectPtr conn) return VIR_DRV_OPEN_SUCCESS; error: - virDomainObjListDeinit(&privconn->domains); + virDomainObjListFree(privconn->domains); virCapabilitiesFree(privconn->caps); virStoragePoolObjListFree(&privconn->pools); VIR_FREE(privconn); @@ -986,7 +987,7 @@ parallelsClose(virConnectPtr conn) parallelsDriverLock(privconn); virCapabilitiesFree(privconn->caps); - virDomainObjListDeinit(&privconn->domains); + virDomainObjListFree(privconn->domains); conn->privateData = NULL; parallelsDriverUnlock(privconn); @@ -1049,7 +1050,7 @@ parallelsListDomains(virConnectPtr conn, int *ids, int maxids) int n; parallelsDriverLock(privconn); - n = virDomainObjListGetActiveIDs(&privconn->domains, ids, maxids); + n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids); parallelsDriverUnlock(privconn); return n; @@ -1062,7 +1063,7 @@ parallelsNumOfDomains(virConnectPtr conn) int count; parallelsDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 1); + count = virDomainObjListNumOfDomains(privconn->domains, 1); parallelsDriverUnlock(privconn); return count; @@ -1076,7 +1077,7 @@ parallelsListDefinedDomains(virConnectPtr conn, char **const names, int maxnames parallelsDriverLock(privconn); memset(names, 0, sizeof(*names) * maxnames); - n = virDomainObjListGetInactiveNames(&privconn->domains, names, + n = virDomainObjListGetInactiveNames(privconn->domains, names, maxnames); parallelsDriverUnlock(privconn); @@ -1090,7 +1091,7 @@ parallelsNumOfDefinedDomains(virConnectPtr conn) int count; parallelsDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 0); + count = virDomainObjListNumOfDomains(privconn->domains, 0); parallelsDriverUnlock(privconn); return count; @@ -1106,7 +1107,7 @@ parallelsListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); parallelsDriverLock(privconn); - ret = virDomainList(conn, privconn->domains.objs, domains, flags); + ret = virDomainObjListExport(privconn->domains, conn, domains, flags); parallelsDriverUnlock(privconn); return ret; @@ -1120,7 +1121,7 @@ parallelsLookupDomainByID(virConnectPtr conn, int id) virDomainObjPtr dom; parallelsDriverLock(privconn); - dom = virDomainFindByID(&privconn->domains, id); + dom = virDomainObjListFindByID(privconn->domains, id); parallelsDriverUnlock(privconn); if (dom == NULL) { @@ -1146,7 +1147,7 @@ parallelsLookupDomainByUUID(virConnectPtr conn, const unsigned char *uuid) virDomainObjPtr dom; parallelsDriverLock(privconn); - dom = virDomainFindByUUID(&privconn->domains, uuid); + dom = virDomainObjListFindByUUID(privconn->domains, uuid); parallelsDriverUnlock(privconn); if (dom == NULL) { @@ -1175,7 +1176,7 @@ parallelsLookupDomainByName(virConnectPtr conn, const char *name) virDomainObjPtr dom; parallelsDriverLock(privconn); - dom = virDomainFindByName(&privconn->domains, name); + dom = virDomainObjListFindByName(privconn->domains, name); parallelsDriverUnlock(privconn); if (dom == NULL) { @@ -1202,7 +1203,7 @@ parallelsGetDomainInfo(virDomainPtr domain, virDomainInfoPtr info) int ret = -1; parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); parallelsDriverUnlock(privconn); if (privdom == NULL) { @@ -1232,7 +1233,7 @@ parallelsGetOSType(virDomainPtr domain) char *ret = NULL; parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); if (privdom == NULL) { parallelsDomNotFoundError(domain); goto cleanup; @@ -1256,7 +1257,7 @@ parallelsDomainIsPersistent(virDomainPtr domain) int ret = -1; parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); if (privdom == NULL) { parallelsDomNotFoundError(domain); goto cleanup; @@ -1281,7 +1282,7 @@ parallelsDomainGetState(virDomainPtr domain, virCheckFlags(0, -1); parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); parallelsDriverUnlock(privconn); if (privdom == NULL) { @@ -1309,7 +1310,7 @@ parallelsDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) /* Flags checked by virDomainDefFormat */ parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); parallelsDriverUnlock(privconn); if (privdom == NULL) { @@ -1336,7 +1337,7 @@ parallelsDomainGetAutostart(virDomainPtr domain, int *autostart) int ret = -1; parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); parallelsDriverUnlock(privconn); if (privdom == NULL) { @@ -1368,7 +1369,7 @@ parallelsDomainChangeState(virDomainPtr domain, int ret = -1; parallelsDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); parallelsDriverUnlock(privconn); if (privdom == NULL) { @@ -2326,13 +2327,13 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) goto cleanup; } - if ((dupVM = virDomainObjIsDuplicate(&privconn->domains, def, 0)) < 0) { + if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) { virReportError(VIR_ERR_INVALID_ARG, "%s", _("Already exists")); goto cleanup; } if (dupVM == 1) { - olddom = virDomainFindByUUID(&privconn->domains, def->uuid); + olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid); } else { if (STREQ(def->os.type, "hvm")) { if (parallelsCreateVm(conn, def)) @@ -2347,7 +2348,7 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) } if (parallelsLoadDomains(privconn, def->name)) goto cleanup; - olddom = virDomainFindByName(&privconn->domains, def->name); + olddom = virDomainObjListFindByName(privconn->domains, def->name); if (!olddom) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Domain for '%s' is not defined after creation"), @@ -2362,8 +2363,9 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) } virObjectUnlock(olddom); - if (!(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, false))) { + if (!(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, false))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Can't allocate domobj")); goto cleanup; diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c index 34911a4..612168e 100644 --- a/src/parallels/parallels_storage.c +++ b/src/parallels/parallels_storage.c @@ -458,7 +458,7 @@ static int parallelsLoadPools(virConnectPtr conn) data.conn = conn; data.failed = false; - virHashForEach(privconn->domains.objs, parallelsPoolsAdd, &data); + virHashForEach(privconn->domains->objs, parallelsPoolsAdd, &data); if (data.failed) goto error; diff --git a/src/parallels/parallels_utils.h b/src/parallels/parallels_utils.h index cf006e8..910cd8b 100644 --- a/src/parallels/parallels_utils.h +++ b/src/parallels/parallels_utils.h @@ -39,7 +39,7 @@ struct _parallelsConn { virMutex lock; - virDomainObjList domains; + virDomainObjListPtr domains; virStoragePoolObjList pools; virNetworkObjList networks; virCapsPtr caps; diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 9419b59..26011c7 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -671,7 +671,7 @@ qemuDriverCloseCallbackRun(void *payload, return; } - if (!(dom = virDomainFindByUUID(&data->driver->domains, uuid))) { + if (!(dom = virDomainObjListFindByUUID(data->driver->domains, uuid))) { VIR_DEBUG("No domain object with UUID %s", uuidstr); return; } diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index b9fcebf..a96ff76 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -169,7 +169,7 @@ struct _virQEMUDriver { virStateInhibitCallback inhibitCallback; void *inhibitOpaque; - virDomainObjList domains; + virDomainObjListPtr domains; char *qemuImgBinary; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cc02f0e..cb031d8 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1882,7 +1882,7 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, VIR_WARN("unable to remove snapshot directory %s", snapDir); VIR_FREE(snapDir); } - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); virObjectUnref(cfg); } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c528a02..98d9501 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -168,7 +168,7 @@ static int qemuVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, virHashIterator iter, void *data) { - virHashForEach(qemu_driver->domains.objs, iter, data); + virHashForEach(qemu_driver->domains->objs, iter, data); return 0; } @@ -206,7 +206,7 @@ qemuDomObjFromDomainDriver(virDomainPtr domain, virQEMUDriverPtr *drv) char uuidstr[VIR_UUID_STRING_BUFLEN]; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { virUUIDFormat(domain->uuid, uuidstr); virReportError(VIR_ERR_NO_DOMAIN, @@ -336,7 +336,7 @@ qemuAutostartDomains(virQEMUDriverPtr driver) struct qemuAutostartData data = { driver, conn }; qemuDriverLock(driver); - virHashForEach(driver->domains.objs, qemuAutostartDomain, &data); + virHashForEach(driver->domains->objs, qemuAutostartDomain, &data); qemuDriverUnlock(driver); if (conn) @@ -681,8 +681,8 @@ qemuStartup(bool privileged, /* Don't have a dom0 so start from 1 */ qemu_driver->nextvmid = 1; - if (virDomainObjListInit(&qemu_driver->domains) < 0) - goto out_of_memory; + if (!(qemu_driver->domains = virDomainObjListNew())) + goto error; /* Init domain events */ qemu_driver->domainEventState = virDomainEventStateNew(); @@ -864,42 +864,42 @@ qemuStartup(bool privileged, goto error; /* Get all the running persistent or transient configs first */ - if (virDomainLoadAllConfigs(qemu_driver->caps, - &qemu_driver->domains, - cfg->stateDir, - NULL, - 1, QEMU_EXPECTED_VIRT_TYPES, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(qemu_driver->domains, + qemu_driver->caps, + cfg->stateDir, + NULL, + 1, QEMU_EXPECTED_VIRT_TYPES, + NULL, NULL) < 0) goto error; /* find the maximum ID from active and transient configs to initialize * the driver with. This is to avoid race between autostart and reconnect * threads */ - virHashForEach(qemu_driver->domains.objs, + virHashForEach(qemu_driver->domains->objs, qemuDomainFindMaxID, &qemu_driver->nextvmid); - virHashForEach(qemu_driver->domains.objs, qemuDomainNetsRestart, NULL); + virHashForEach(qemu_driver->domains->objs, qemuDomainNetsRestart, NULL); conn = virConnectOpen(cfg->uri); qemuProcessReconnectAll(conn, qemu_driver); /* Then inactive persistent configs */ - if (virDomainLoadAllConfigs(qemu_driver->caps, - &qemu_driver->domains, - cfg->configDir, - cfg->autostartDir, - 0, QEMU_EXPECTED_VIRT_TYPES, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(qemu_driver->domains, + qemu_driver->caps, + cfg->configDir, + cfg->autostartDir, + 0, QEMU_EXPECTED_VIRT_TYPES, + NULL, NULL) < 0) goto error; - virHashForEach(qemu_driver->domains.objs, + virHashForEach(qemu_driver->domains->objs, qemuDomainSnapshotLoad, cfg->snapshotDir); - virHashForEach(qemu_driver->domains.objs, + virHashForEach(qemu_driver->domains->objs, qemuDomainManagedSaveLoad, qemu_driver); @@ -960,12 +960,12 @@ qemuReload(void) { qemuDriverLock(qemu_driver); cfg = virQEMUDriverGetConfig(qemu_driver); - virDomainLoadAllConfigs(qemu_driver->caps, - &qemu_driver->domains, - cfg->configDir, - cfg->autostartDir, - 0, QEMU_EXPECTED_VIRT_TYPES, - qemuNotifyLoadDomain, qemu_driver); + virDomainObjListLoadAllConfigs(qemu_driver->domains, + qemu_driver->caps, + cfg->configDir, + cfg->autostartDir, + 0, QEMU_EXPECTED_VIRT_TYPES, + qemuNotifyLoadDomain, qemu_driver); qemuDriverUnlock(qemu_driver); virObjectUnref(cfg); return 0; @@ -1055,7 +1055,7 @@ qemuShutdown(void) { virCapabilitiesFree(qemu_driver->caps); qemuCapsCacheFree(qemu_driver->capsCache); - virDomainObjListDeinit(&qemu_driver->domains); + virDomainObjListFree(qemu_driver->domains); virObjectUnref(qemu_driver->remotePorts); virSysinfoDefFree(qemu_driver->hostsysinfo); @@ -1380,7 +1380,7 @@ static virDomainPtr qemuDomainLookupByID(virConnectPtr conn, virDomainPtr dom = NULL; qemuDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); qemuDriverUnlock(driver); if (!vm) { @@ -1405,7 +1405,7 @@ static virDomainPtr qemuDomainLookupByUUID(virConnectPtr conn, virDomainPtr dom = NULL; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); qemuDriverUnlock(driver); if (!vm) { @@ -1432,7 +1432,7 @@ static virDomainPtr qemuDomainLookupByName(virConnectPtr conn, virDomainPtr dom = NULL; qemuDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); qemuDriverUnlock(driver); if (!vm) { @@ -1522,7 +1522,7 @@ static int qemuListDomains(virConnectPtr conn, int *ids, int nids) { int n; qemuDriverLock(driver); - n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids); + n = virDomainObjListGetActiveIDs(driver->domains, ids, nids); qemuDriverUnlock(driver); return n; @@ -1533,7 +1533,7 @@ static int qemuNumDomains(virConnectPtr conn) { int n; qemuDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); qemuDriverUnlock(driver); return n; @@ -1590,7 +1590,7 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) @@ -1602,9 +1602,9 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, if (qemuDomainAssignAddresses(def, caps, NULL) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; @@ -1671,7 +1671,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -1754,7 +1754,7 @@ static int qemuDomainResume(virDomainPtr dom) { virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -2049,7 +2049,7 @@ qemuDomainDestroyFlags(virDomainPtr dom, virCheckFlags(VIR_DOMAIN_DESTROY_GRACEFUL, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2276,7 +2276,7 @@ static int qemuDomainInjectNMI(virDomainPtr domain, unsigned int flags) virCheckFlags(0, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(domain->uuid, uuidstr); @@ -2353,7 +2353,7 @@ static int qemuDomainSendKey(virDomainPtr domain, } qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(domain->uuid, uuidstr); @@ -3039,7 +3039,7 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml, } } - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -3349,7 +3349,7 @@ static int qemuDomainCoreDump(virDomainPtr dom, VIR_DUMP_MEMORY_ONLY, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -4533,7 +4533,7 @@ static int qemuDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr secl int ret = -1; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); memset(seclabel, 0, sizeof(*seclabel)); @@ -4593,7 +4593,7 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom, /* Protect domain data with qemu lock */ qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -4991,13 +4991,13 @@ qemuDomainRestoreFlags(virConnectPtr conn, if (fd < 0) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, true))) { - /* virDomainAssignDef already set the error */ + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, true))) { + /* virDomainLitsAdd already set the error */ goto cleanup; } def = NULL; @@ -5204,7 +5204,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom, /* Flags checked by virDomainDefFormat */ qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -5438,7 +5438,7 @@ static int qemuListDefinedDomains(virConnectPtr conn, int n; qemuDriverLock(driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); qemuDriverUnlock(driver); return n; } @@ -5448,7 +5448,7 @@ static int qemuNumDefinedDomains(virConnectPtr conn) { int n; qemuDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); qemuDriverUnlock(driver); return n; @@ -5545,7 +5545,7 @@ qemuDomainStartWithFlags(virDomainPtr dom, unsigned int flags) VIR_DOMAIN_START_FORCE_BOOT, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -5607,7 +5607,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if ((dupVM = virDomainObjIsDuplicate(&driver->domains, def, 0)) < 0) + if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) goto cleanup; if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) @@ -5622,9 +5622,9 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { /* We need to differentiate two cases: * a) updating an existing domain - must preserve previous definition * so we can roll back if something fails - * b) defining a brand new domain - virDomainAssignDef is just sufficient + * b) defining a brand new domain - virDomainObjListAdd is just sufficient */ - if ((vm = virDomainFindByUUID(&driver->domains, def->uuid))) { + if ((vm = virDomainObjListFindByUUID(driver->domains, def->uuid))) { if (virDomainObjIsActive(vm)) { def_backup = vm->newDef; vm->newDef = def; @@ -5633,9 +5633,9 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { vm->def = def; } } else { - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, false))) { + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) { goto cleanup; } } @@ -5708,7 +5708,7 @@ qemuDomainUndefineFlags(virDomainPtr dom, qemuDriverLock(driver); cfg = virQEMUDriverGetConfig(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -6434,7 +6434,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, affect = flags & (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -6635,7 +6635,7 @@ static int qemuDomainSetAutostart(virDomainPtr dom, virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); cfg = virQEMUDriverGetConfig(driver); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -6916,7 +6916,7 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, return -1; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("No such domain %s"), dom->uuid); @@ -7071,7 +7071,7 @@ qemuDomainGetBlkioParameters(virDomainPtr dom, * that can't parse it. */ flags &= ~VIR_TYPED_PARAM_STRING_OKAY; - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -7267,7 +7267,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -7427,7 +7427,7 @@ qemuDomainGetMemoryParameters(virDomainPtr dom, /* We don't return strings, and thus trivially support this flag. */ flags &= ~VIR_TYPED_PARAM_STRING_OKAY; - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -7590,7 +7590,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -7742,7 +7742,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom, * that can't parse it. */ flags &= ~VIR_TYPED_PARAM_STRING_OKAY; - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -7948,7 +7948,7 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -8234,7 +8234,7 @@ qemuGetSchedulerParametersFlags(virDomainPtr dom, cpu_bw_status = !!rc; } - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -8765,7 +8765,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, return -1; qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -8931,7 +8931,7 @@ qemuDomainGetInterfaceParameters(virDomainPtr dom, flags &= ~VIR_TYPED_PARAM_STRING_OKAY; - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -9595,7 +9595,7 @@ qemuDomainMigratePerform(virDomainPtr dom, goto cleanup; } - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -9643,7 +9643,7 @@ qemuDomainMigrateFinish2(virConnectPtr dconn, virCheckFlags(QEMU_MIGRATION_FLAGS, NULL); qemuDriverLock(driver); - vm = virDomainFindByName(&driver->domains, dname); + vm = virDomainObjListFindByName(driver->domains, dname); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching name '%s'"), dname); @@ -9685,7 +9685,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain, virCheckFlags(QEMU_MIGRATION_FLAGS, NULL); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(domain->uuid, uuidstr); @@ -9872,7 +9872,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, virCheckFlags(QEMU_MIGRATION_FLAGS, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -9911,7 +9911,7 @@ qemuDomainMigrateFinish3(virConnectPtr dconn, virCheckFlags(QEMU_MIGRATION_FLAGS, NULL); qemuDriverLock(driver); - vm = virDomainFindByName(&driver->domains, dname); + vm = virDomainObjListFindByName(driver->domains, dname); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching name '%s'"), dname); @@ -9944,7 +9944,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, virCheckFlags(QEMU_MIGRATION_FLAGS, -1); qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(domain->uuid, uuidstr); @@ -11340,7 +11340,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, qemuDriverLock(driver); virUUIDFormat(domain->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -12033,7 +12033,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, qemuDriverLock(driver); virUUIDFormat(snapshot->domain->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, snapshot->domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, snapshot->domain->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -12400,7 +12400,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, qemuDriverLock(driver); virUUIDFormat(snapshot->domain->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, snapshot->domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, snapshot->domain->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -12590,7 +12590,7 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; if (qemuCanonicalizeMachine(def, caps) < 0) @@ -12599,9 +12599,9 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, if (qemuDomainAssignAddresses(def, caps, NULL) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; @@ -13002,7 +13002,7 @@ qemuDomainBlockJobImpl(virDomainPtr dom, const char *path, const char *base, qemuDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -13560,7 +13560,7 @@ qemuDomainOpenGraphics(virDomainPtr dom, qemuDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -13656,7 +13656,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, qemuDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -13814,7 +13814,7 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, qemuDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -14391,7 +14391,7 @@ qemuDomainGetCPUStats(virDomainPtr domain, qemuDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, domain->uuid); + vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); if (vm == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, _("No such domain %s"), domain->uuid); @@ -14588,7 +14588,7 @@ qemuListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); qemuDriverLock(driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); qemuDriverUnlock(driver); return ret; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index f4aa9a2..5e10876 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1639,12 +1639,12 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, } } - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, true))) { + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, true))) { /* virDomainAssignDef already set the error */ goto cleanup; } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 439cdfa..dad6e25 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3431,7 +3431,7 @@ void qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver) { struct qemuProcessReconnectData data = {.conn = conn, .driver = driver}; - virHashForEach(driver->domains.objs, qemuProcessReconnectHelper, &data); + virHashForEach(driver->domains->objs, qemuProcessReconnectHelper, &data); } int diff --git a/src/test/test_driver.c b/src/test/test_driver.c index a10a377..78b73b3 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -83,7 +83,7 @@ struct _testConn { int nextDomID; virCapsPtr caps; virNodeInfo nodeInfo; - virDomainObjList domains; + virDomainObjListPtr domains; virNetworkObjList networks; virInterfaceObjList ifaces; bool transaction_running; @@ -537,7 +537,7 @@ static int testOpenDefault(virConnectPtr conn) { testDriverLock(privconn); conn->privateData = privconn; - if (virDomainObjListInit(&privconn->domains) < 0) + if (!(privconn->domains = virDomainObjListNew())) goto error; memmove(&privconn->nodeInfo, &defaultNodeInfo, sizeof(defaultNodeInfo)); @@ -564,8 +564,9 @@ static int testOpenDefault(virConnectPtr conn) { if (testDomainGenerateIfnames(domdef) < 0) goto error; - if (!(domobj = virDomainAssignDef(privconn->caps, - &privconn->domains, domdef, false))) + if (!(domobj = virDomainObjListAdd(privconn->domains, + privconn->caps, + domdef, false))) goto error; domdef = NULL; @@ -627,7 +628,7 @@ static int testOpenDefault(virConnectPtr conn) { return VIR_DRV_OPEN_SUCCESS; error: - virDomainObjListDeinit(&privconn->domains); + virDomainObjListFree(privconn->domains); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); @@ -777,7 +778,7 @@ static int testOpenFromFile(virConnectPtr conn, testDriverLock(privconn); conn->privateData = privconn; - if (virDomainObjListInit(&privconn->domains) < 0) + if (!(privconn->domains = virDomainObjListNew())) goto error; if (!(privconn->caps = testBuildCapabilities(conn))) @@ -908,8 +909,9 @@ static int testOpenFromFile(virConnectPtr conn, } if (testDomainGenerateIfnames(def) < 0 || - !(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, false))) { + !(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, false))) { virDomainDefFree(def); goto error; } @@ -1095,7 +1097,7 @@ static int testOpenFromFile(virConnectPtr conn, VIR_FREE(ifaces); VIR_FREE(pools); VIR_FREE(devs); - virDomainObjListDeinit(&privconn->domains); + virDomainObjListFree(privconn->domains); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); @@ -1164,7 +1166,7 @@ static int testClose(virConnectPtr conn) testConnPtr privconn = conn->privateData; testDriverLock(privconn); virCapabilitiesFree(privconn->caps); - virDomainObjListDeinit(&privconn->domains); + virDomainObjListFree(privconn->domains); virNodeDeviceObjListFree(&privconn->devs); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); @@ -1235,7 +1237,7 @@ static int testNumOfDomains(virConnectPtr conn) int count; testDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 1); + count = virDomainObjListNumOfDomains(privconn->domains, 1); testDriverUnlock(privconn); return count; @@ -1248,7 +1250,7 @@ static int testDomainIsActive(virDomainPtr dom) int ret = -1; testDriverLock(privconn); - obj = virDomainFindByUUID(&privconn->domains, dom->uuid); + obj = virDomainObjListFindByUUID(privconn->domains, dom->uuid); testDriverUnlock(privconn); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -1269,7 +1271,7 @@ static int testDomainIsPersistent(virDomainPtr dom) int ret = -1; testDriverLock(privconn); - obj = virDomainFindByUUID(&privconn->domains, dom->uuid); + obj = virDomainObjListFindByUUID(privconn->domains, dom->uuid); testDriverUnlock(privconn); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -1306,13 +1308,14 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjIsDuplicate(&privconn->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (testDomainGenerateIfnames(def) < 0) goto cleanup; - if (!(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, false))) + if (!(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, false))) goto cleanup; def = NULL; @@ -1346,7 +1349,7 @@ static virDomainPtr testLookupDomainByID(virConnectPtr conn, virDomainObjPtr dom; testDriverLock(privconn); - dom = virDomainFindByID(&privconn->domains, id); + dom = virDomainObjListFindByID(privconn->domains, id); testDriverUnlock(privconn); if (dom == NULL) { @@ -1372,7 +1375,7 @@ static virDomainPtr testLookupDomainByUUID(virConnectPtr conn, virDomainObjPtr dom ; testDriverLock(privconn); - dom = virDomainFindByUUID(&privconn->domains, uuid); + dom = virDomainObjListFindByUUID(privconn->domains, uuid); testDriverUnlock(privconn); if (dom == NULL) { @@ -1398,7 +1401,7 @@ static virDomainPtr testLookupDomainByName(virConnectPtr conn, virDomainObjPtr dom; testDriverLock(privconn); - dom = virDomainFindByName(&privconn->domains, name); + dom = virDomainObjListFindByName(privconn->domains, name); testDriverUnlock(privconn); if (dom == NULL) { @@ -1424,7 +1427,7 @@ static int testListDomains(virConnectPtr conn, int n; testDriverLock(privconn); - n = virDomainObjListGetActiveIDs(&privconn->domains, ids, maxids); + n = virDomainObjListGetActiveIDs(privconn->domains, ids, maxids); testDriverUnlock(privconn); return n; @@ -1438,8 +1441,8 @@ static int testDestroyDomain(virDomainPtr domain) int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1452,8 +1455,8 @@ static int testDestroyDomain(virDomainPtr domain) VIR_DOMAIN_EVENT_STOPPED_DESTROYED); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -1475,8 +1478,8 @@ static int testResumeDomain(virDomainPtr domain) int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -1517,8 +1520,8 @@ static int testPauseDomain(virDomainPtr domain) int state; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -1562,8 +1565,8 @@ static int testShutdownDomainFlags(virDomainPtr domain, virCheckFlags(0, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1582,8 +1585,8 @@ static int testShutdownDomainFlags(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -1612,8 +1615,8 @@ static int testRebootDomain(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1657,8 +1660,8 @@ static int testRebootDomain(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } } @@ -1682,8 +1685,8 @@ static int testGetDomainInfo(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -1723,8 +1726,8 @@ testDomainGetState(virDomainPtr domain, virCheckFlags(0, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -1763,8 +1766,8 @@ testDomainSaveFlags(virDomainPtr domain, const char *path, } testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -1821,8 +1824,8 @@ testDomainSaveFlags(virDomainPtr domain, const char *path, VIR_DOMAIN_EVENT_STOPPED_SAVED); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -1922,13 +1925,14 @@ testDomainRestoreFlags(virConnectPtr conn, if (!def) goto cleanup; - if (virDomainObjIsDuplicate(&privconn->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (testDomainGenerateIfnames(def) < 0) goto cleanup; - if (!(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, true))) + if (!(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, true))) goto cleanup; def = NULL; @@ -1972,8 +1976,8 @@ static int testDomainCoreDump(virDomainPtr domain, virCheckFlags(VIR_DUMP_CRASH, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2005,8 +2009,8 @@ static int testDomainCoreDump(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_CRASHED); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } } @@ -2035,8 +2039,8 @@ static unsigned long long testGetMaxMemory(virDomainPtr domain) { unsigned long long ret = 0; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2060,8 +2064,8 @@ static int testSetMaxMemory(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2087,8 +2091,8 @@ static int testSetMemory(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2123,7 +2127,7 @@ testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags) VIR_DOMAIN_VCPU_MAXIMUM, -1); testDriverLock(privconn); - vm = virDomainFindByUUID(&privconn->domains, domain->uuid); + vm = virDomainObjListFindByUUID(privconn->domains, domain->uuid); testDriverUnlock(privconn); if (!vm) { @@ -2184,7 +2188,7 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus, } testDriverLock(privconn); - privdom = virDomainFindByUUID(&privconn->domains, domain->uuid); + privdom = virDomainObjListFindByUUID(privconn->domains, domain->uuid); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2267,7 +2271,7 @@ static int testDomainGetVcpus(virDomainPtr domain, unsigned long long statbase; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, domain->name); + privdom = virDomainObjListFindByName(privconn->domains, domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2353,7 +2357,7 @@ static int testDomainPinVcpu(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, domain->name); + privdom = virDomainObjListFindByName(privconn->domains, domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2407,8 +2411,8 @@ static char *testDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) /* Flags checked by virDomainDefFormat */ testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2433,7 +2437,7 @@ static int testNumOfDefinedDomains(virConnectPtr conn) { int count; testDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 0); + count = virDomainObjListNumOfDomains(privconn->domains, 0); testDriverUnlock(privconn); return count; @@ -2448,7 +2452,7 @@ static int testListDefinedDomains(virConnectPtr conn, testDriverLock(privconn); memset(names, 0, sizeof(*names)*maxnames); - n = virDomainObjListGetInactiveNames(&privconn->domains, names, maxnames); + n = virDomainObjListGetInactiveNames(privconn->domains, names, maxnames); testDriverUnlock(privconn); return n; @@ -2469,13 +2473,14 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if ((dupVM = virDomainObjIsDuplicate(&privconn->domains, def, 0)) < 0) + if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) goto cleanup; if (testDomainGenerateIfnames(def) < 0) goto cleanup; - if (!(dom = virDomainAssignDef(privconn->caps, - &privconn->domains, def, false))) + if (!(dom = virDomainObjListAdd(privconn->domains, + privconn->caps, + def, false))) goto cleanup; def = NULL; dom->persistent = 1; @@ -2536,8 +2541,8 @@ static int testDomainCreateWithFlags(virDomainPtr domain, unsigned int flags) { virCheckFlags(0, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2584,8 +2589,8 @@ static int testDomainUndefineFlags(virDomainPtr domain, virCheckFlags(0, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); if (privdom == NULL) { virReportError(VIR_ERR_INVALID_ARG, __FUNCTION__); @@ -2598,8 +2603,8 @@ static int testDomainUndefineFlags(virDomainPtr domain, if (virDomainObjIsActive(privdom)) { privdom->persistent = 0; } else { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -2627,8 +2632,8 @@ static int testDomainGetAutostart(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2654,8 +2659,8 @@ static int testDomainSetAutostart(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2700,8 +2705,8 @@ testDomainGetSchedulerParamsFlags(virDomainPtr domain, virCheckFlags(0, -1); testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2750,8 +2755,8 @@ testDomainSetSchedulerParamsFlags(virDomainPtr domain, return -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2793,8 +2798,8 @@ static int testDomainBlockStats(virDomainPtr domain, int ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -2840,8 +2845,8 @@ static int testDomainInterfaceStats(virDomainPtr domain, int i, found = 0, ret = -1; testDriverLock(privconn); - privdom = virDomainFindByName(&privconn->domains, - domain->name); + privdom = virDomainObjListFindByName(privconn->domains, + domain->name); testDriverUnlock(privconn); if (privdom == NULL) { @@ -5692,7 +5697,7 @@ static int testListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); testDriverLock(privconn); - ret = virDomainList(conn, privconn->domains.objs, domains, flags); + ret = virDomainObjListExport(privconn->domains, conn, domains, flags); testDriverUnlock(privconn); return ret; diff --git a/src/uml/uml_conf.h b/src/uml/uml_conf.h index a4e264f..ff71b45 100644 --- a/src/uml/uml_conf.h +++ b/src/uml/uml_conf.h @@ -51,7 +51,7 @@ struct uml_driver { unsigned long umlVersion; int nextvmid; - virDomainObjList domains; + virDomainObjListPtr domains; size_t nactive; char *configDir; diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index c6fef69..613973c 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -150,7 +150,7 @@ static int umlVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, virHashIterator iter, void *data) { - virHashForEach(uml_driver->domains.objs, iter, data); + virHashForEach(uml_driver->domains->objs, iter, data); return 0; } @@ -223,7 +223,7 @@ umlAutostartConfigs(struct uml_driver *driver) { struct umlAutostartData data = { driver, conn }; umlDriverLock(driver); - virHashForEach(driver->domains.objs, umlAutostartDomain, &data); + virHashForEach(driver->domains->objs, umlAutostartDomain, &data); umlDriverUnlock(driver); if (conn) @@ -336,7 +336,7 @@ reread: name = (char *)&(e->name); - dom = virDomainFindByName(&driver->domains, name); + dom = virDomainObjListFindByName(driver->domains, name); if (!dom) { continue; @@ -355,8 +355,8 @@ reread: VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!dom->persistent) { - virDomainRemoveInactive(&driver->domains, - dom); + virDomainObjListRemove(driver->domains, + dom); dom = NULL; } } else if (e->mask & (IN_CREATE | IN_MODIFY)) { @@ -389,8 +389,8 @@ reread: VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_FAILED); if (!dom->persistent) { - virDomainRemoveInactive(&driver->domains, - dom); + virDomainObjListRemove(driver->domains, + dom); dom = NULL; } } else if (umlIdentifyChrPTY(driver, dom) < 0) { @@ -402,8 +402,8 @@ reread: VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_FAILED); if (!dom->persistent) { - virDomainRemoveInactive(&driver->domains, - dom); + virDomainObjListRemove(driver->domains, + dom); dom = NULL; } } @@ -448,7 +448,7 @@ umlStartup(bool privileged, uml_driver->nextvmid = 1; uml_driver->inotifyWatch = -1; - if (virDomainObjListInit(¨_driver->domains) < 0) + if (!(uml_driver->domains = virDomainObjListNew())) goto error; uml_driver->domainEventState = virDomainEventStateNew(); @@ -533,12 +533,12 @@ umlStartup(bool privileged, if (umlProcessAutoDestroyInit(uml_driver) < 0) goto error; - if (virDomainLoadAllConfigs(uml_driver->caps, - ¨_driver->domains, - uml_driver->configDir, - uml_driver->autostartDir, - 0, 1 << VIR_DOMAIN_VIRT_UML, - NULL, NULL) < 0) + if (virDomainObjListLoadAllConfigs(uml_driver->domains, + uml_driver->caps, + uml_driver->configDir, + uml_driver->autostartDir, + 0, 1 << VIR_DOMAIN_VIRT_UML, + NULL, NULL) < 0) goto error; umlDriverUnlock(uml_driver); @@ -588,12 +588,12 @@ umlReload(void) { return 0; umlDriverLock(uml_driver); - virDomainLoadAllConfigs(uml_driver->caps, - ¨_driver->domains, - uml_driver->configDir, - uml_driver->autostartDir, - 0, 1 << VIR_DOMAIN_VIRT_UML, - umlNotifyLoadDomain, uml_driver); + virDomainObjListLoadAllConfigs(uml_driver->domains, + uml_driver->caps, + uml_driver->configDir, + uml_driver->autostartDir, + 0, 1 << VIR_DOMAIN_VIRT_UML, + umlNotifyLoadDomain, uml_driver); umlDriverUnlock(uml_driver); return 0; @@ -633,9 +633,9 @@ umlShutdown(void) { /* shutdown active VMs * XXX allow them to stay around & reconnect */ - virHashForEach(uml_driver->domains.objs, umlShutdownOneVM, uml_driver); + virHashForEach(uml_driver->domains->objs, umlShutdownOneVM, uml_driver); - virDomainObjListDeinit(¨_driver->domains); + virDomainObjListFree(uml_driver->domains); virDomainEventStateFree(uml_driver->domainEventState); @@ -688,8 +688,8 @@ static void umlProcessAutoDestroyDom(void *payload, return; } - if (!(dom = virDomainFindByUUID(&data->driver->domains, - uuid))) { + if (!(dom = virDomainObjListFindByUUID(data->driver->domains, + uuid))) { VIR_DEBUG("No domain object to kill"); return; } @@ -702,7 +702,7 @@ static void umlProcessAutoDestroyDom(void *payload, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); if (dom && !dom->persistent) - virDomainRemoveInactive(&data->driver->domains, dom); + virDomainObjListRemove(data->driver->domains, dom); if (dom) virObjectUnlock(dom); @@ -1307,7 +1307,7 @@ static virDomainPtr umlDomainLookupByID(virConnectPtr conn, virDomainPtr dom = NULL; umlDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); umlDriverUnlock(driver); if (!vm) { @@ -1331,7 +1331,7 @@ static virDomainPtr umlDomainLookupByUUID(virConnectPtr conn, virDomainPtr dom = NULL; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); umlDriverUnlock(driver); if (!vm) { @@ -1355,7 +1355,7 @@ static virDomainPtr umlDomainLookupByName(virConnectPtr conn, virDomainPtr dom = NULL; umlDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); umlDriverUnlock(driver); if (!vm) { @@ -1380,7 +1380,7 @@ static int umlDomainIsActive(virDomainPtr dom) int ret = -1; umlDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -1402,7 +1402,7 @@ static int umlDomainIsPersistent(virDomainPtr dom) int ret = -1; umlDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -1423,7 +1423,7 @@ static int umlDomainIsUpdated(virDomainPtr dom) int ret = -1; umlDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -1467,7 +1467,7 @@ static int umlListDomains(virConnectPtr conn, int *ids, int nids) { int n; umlDriverLock(driver); - n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids); + n = virDomainObjListGetActiveIDs(driver->domains, ids, nids); umlDriverUnlock(driver); return n; @@ -1477,7 +1477,7 @@ static int umlNumDomains(virConnectPtr conn) { int n; umlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); umlDriverUnlock(driver); return n; @@ -1498,20 +1498,20 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; if (umlStartVMDaemon(conn, driver, vm, (flags & VIR_DOMAIN_START_AUTODESTROY)) < 0) { virDomainAuditStart(vm, "booted", false); - virDomainRemoveInactive(&driver->domains, - vm); + virDomainObjListRemove(driver->domains, + vm); vm = NULL; goto cleanup; } @@ -1544,7 +1544,7 @@ static int umlDomainShutdownFlags(virDomainPtr dom, virCheckFlags(0, -1); umlDriverLock(driver); - vm = virDomainFindByID(&driver->domains, dom->id); + vm = virDomainObjListFindByID(driver->domains, dom->id); umlDriverUnlock(driver); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, @@ -1586,7 +1586,7 @@ umlDomainDestroyFlags(virDomainPtr dom, virCheckFlags(0, -1); umlDriverLock(driver); - vm = virDomainFindByID(&driver->domains, dom->id); + vm = virDomainObjListFindByID(driver->domains, dom->id); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching id %d"), dom->id); @@ -1599,8 +1599,8 @@ umlDomainDestroyFlags(virDomainPtr dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, - vm); + virDomainObjListRemove(driver->domains, + vm); vm = NULL; } ret = 0; @@ -1627,7 +1627,7 @@ static char *umlDomainGetOSType(virDomainPtr dom) { char *type = NULL; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -1653,7 +1653,7 @@ umlDomainGetMaxMemory(virDomainPtr dom) unsigned long long ret = 0; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1678,7 +1678,7 @@ static int umlDomainSetMaxMemory(virDomainPtr dom, unsigned long newmax) { int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1711,7 +1711,7 @@ static int umlDomainSetMemory(virDomainPtr dom, unsigned long newmem) { int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1751,7 +1751,7 @@ static int umlDomainGetInfo(virDomainPtr dom, int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1797,7 +1797,7 @@ umlDomainGetState(virDomainPtr dom, virCheckFlags(0, -1); umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1826,7 +1826,7 @@ static char *umlDomainGetXMLDesc(virDomainPtr dom, /* Flags checked by virDomainDefFormat */ umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -1852,7 +1852,7 @@ static int umlListDefinedDomains(virConnectPtr conn, int n; umlDriverLock(driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); umlDriverUnlock(driver); return n; @@ -1863,7 +1863,7 @@ static int umlNumDefinedDomains(virConnectPtr conn) { int n; umlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); umlDriverUnlock(driver); return n; @@ -1879,7 +1879,7 @@ static int umlDomainStartWithFlags(virDomainPtr dom, unsigned int flags) { virCheckFlags(VIR_DOMAIN_START_AUTODESTROY, -1); umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -1920,20 +1920,20 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) { VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, def, 0) < 0) + if (virDomainObjListIsDuplicate(driver->domains, def, 0) < 0) goto cleanup; - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, - def, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, false))) goto cleanup; def = NULL; vm->persistent = 1; if (virDomainSaveConfig(driver->configDir, vm->newDef ? vm->newDef : vm->def) < 0) { - virDomainRemoveInactive(&driver->domains, - vm); + virDomainObjListRemove(driver->domains, + vm); vm = NULL; goto cleanup; } @@ -1959,7 +1959,7 @@ static int umlDomainUndefineFlags(virDomainPtr dom, virCheckFlags(0, -1); umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", _("no domain with matching uuid")); @@ -1978,7 +1978,7 @@ static int umlDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2057,7 +2057,7 @@ static int umlDomainAttachDevice(virDomainPtr dom, const char *xml) umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2175,7 +2175,7 @@ static int umlDomainDetachDevice(virDomainPtr dom, const char *xml) { int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -2241,7 +2241,7 @@ static int umlDomainGetAutostart(virDomainPtr dom, int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -2267,7 +2267,7 @@ static int umlDomainSetAutostart(virDomainPtr dom, int ret = -1; umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -2341,7 +2341,7 @@ umlDomainBlockPeek(virDomainPtr dom, virCheckFlags(0, -1); umlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); umlDriverUnlock(driver); if (!vm) { @@ -2410,7 +2410,7 @@ umlDomainOpenConsole(virDomainPtr dom, umlDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, _("no domain with matching uuid '%s'"), uuidstr); @@ -2555,7 +2555,7 @@ static int umlListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); umlDriverLock(driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); umlDriverUnlock(driver); return ret; diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index e8a66de..d2afce3 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -43,7 +43,7 @@ vmwareFreeDriver(struct vmware_driver *driver) return; virMutexDestroy(&driver->lock); - virDomainObjListDeinit(&driver->domains); + virDomainObjListFree(driver->domains); virCapabilitiesFree(driver->caps); VIR_FREE(driver); } @@ -177,8 +177,9 @@ vmwareLoadDomains(struct vmware_driver *driver) goto cleanup; } - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, vmdef, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + vmdef, false))) goto cleanup; pDomain = vm->privateData; diff --git a/src/vmware/vmware_conf.h b/src/vmware/vmware_conf.h index 22d5240..6ab985e 100644 --- a/src/vmware/vmware_conf.h +++ b/src/vmware/vmware_conf.h @@ -37,7 +37,7 @@ struct vmware_driver { virMutex lock; virCapsPtr caps; - virDomainObjList domains; + virDomainObjListPtr domains; int version; int type; }; diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 5c0e9ca..3b2d1e5 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -128,7 +128,7 @@ vmwareOpen(virConnectPtr conn, driver->type = STRNEQ(conn->uri->scheme, "vmwareplayer") ? TYPE_WORKSTATION : TYPE_PLAYER; - if (virDomainObjListInit(&driver->domains) < 0) + if (!(driver->domains = virDomainObjListNew())) goto cleanup; if (!(driver->caps = vmwareCapsInit())) @@ -320,7 +320,7 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, vmdef, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0) goto cleanup; /* generate vmx file */ @@ -339,8 +339,9 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) } /* assign def */ - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, vmdef, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + vmdef, false))) goto cleanup; pDomain = vm->privateData; @@ -382,7 +383,7 @@ vmwareDomainShutdownFlags(virDomainPtr dom, vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -403,7 +404,7 @@ vmwareDomainShutdownFlags(virDomainPtr dom, goto cleanup; if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -441,7 +442,7 @@ vmwareDomainSuspend(virDomainPtr dom) } vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -490,7 +491,7 @@ vmwareDomainResume(virDomainPtr dom) } vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -534,7 +535,7 @@ vmwareDomainReboot(virDomainPtr dom, unsigned int flags) virCheckFlags(0, -1); vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -591,7 +592,7 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjIsDuplicate(&driver->domains, vmdef, 1) < 0) + if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0) goto cleanup; /* generate vmx file */ @@ -610,8 +611,9 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, } /* assign def */ - if (!(vm = virDomainAssignDef(driver->caps, - &driver->domains, vmdef, false))) + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + vmdef, false))) goto cleanup; pDomain = vm->privateData; @@ -621,7 +623,7 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, vmdef = NULL; if (vmwareStartVM(driver, vm) < 0) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; goto cleanup; } @@ -651,7 +653,7 @@ vmwareDomainCreateWithFlags(virDomainPtr dom, virCheckFlags(0, -1); vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(dom->uuid, uuidstr); @@ -695,7 +697,7 @@ vmwareDomainUndefineFlags(virDomainPtr dom, virCheckFlags(0, -1); vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -718,7 +720,7 @@ vmwareDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -745,7 +747,7 @@ vmwareDomainLookupByID(virConnectPtr conn, int id) virDomainPtr dom = NULL; vmwareDriverLock(driver); - vm = virDomainFindByID(&driver->domains, id); + vm = virDomainObjListFindByID(driver->domains, id); vmwareDriverUnlock(driver); if (!vm) { @@ -771,7 +773,7 @@ vmwareGetOSType(virDomainPtr dom) char *ret = NULL; vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -797,7 +799,7 @@ vmwareDomainLookupByUUID(virConnectPtr conn, const unsigned char *uuid) virDomainPtr dom = NULL; vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, uuid); + vm = virDomainObjListFindByUUID(driver->domains, uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -823,7 +825,7 @@ vmwareDomainLookupByName(virConnectPtr conn, const char *name) virDomainPtr dom = NULL; vmwareDriverLock(driver); - vm = virDomainFindByName(&driver->domains, name); + vm = virDomainObjListFindByName(driver->domains, name); vmwareDriverUnlock(driver); if (!vm) { @@ -849,7 +851,7 @@ vmwareDomainIsActive(virDomainPtr dom) int ret = -1; vmwareDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -872,7 +874,7 @@ vmwareDomainIsPersistent(virDomainPtr dom) int ret = -1; vmwareDriverLock(driver); - obj = virDomainFindByUUID(&driver->domains, dom->uuid); + obj = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!obj) { virReportError(VIR_ERR_NO_DOMAIN, NULL); @@ -897,7 +899,7 @@ vmwareDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) /* Flags checked by virDomainDefFormat */ vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -966,8 +968,8 @@ vmwareNumDefinedDomains(virConnectPtr conn) int n; vmwareDriverLock(driver); - vmwareDomainObjListUpdateAll(&driver->domains, driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + vmwareDomainObjListUpdateAll(driver->domains, driver); + n = virDomainObjListNumOfDomains(driver->domains, 0); vmwareDriverUnlock(driver); return n; @@ -980,8 +982,8 @@ vmwareNumDomains(virConnectPtr conn) int n; vmwareDriverLock(driver); - vmwareDomainObjListUpdateAll(&driver->domains, driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + vmwareDomainObjListUpdateAll(driver->domains, driver); + n = virDomainObjListNumOfDomains(driver->domains, 1); vmwareDriverUnlock(driver); return n; @@ -995,8 +997,8 @@ vmwareListDomains(virConnectPtr conn, int *ids, int nids) int n; vmwareDriverLock(driver); - vmwareDomainObjListUpdateAll(&driver->domains, driver); - n = virDomainObjListGetActiveIDs(&driver->domains, ids, nids); + vmwareDomainObjListUpdateAll(driver->domains, driver); + n = virDomainObjListGetActiveIDs(driver->domains, ids, nids); vmwareDriverUnlock(driver); return n; @@ -1010,8 +1012,8 @@ vmwareListDefinedDomains(virConnectPtr conn, int n; vmwareDriverLock(driver); - vmwareDomainObjListUpdateAll(&driver->domains, driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + vmwareDomainObjListUpdateAll(driver->domains, driver); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); vmwareDriverUnlock(driver); return n; } @@ -1024,7 +1026,7 @@ vmwareDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info) int ret = -1; vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -1062,7 +1064,7 @@ vmwareDomainGetState(virDomainPtr dom, virCheckFlags(0, -1); vmwareDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); vmwareDriverUnlock(driver); if (!vm) { @@ -1100,8 +1102,8 @@ vmwareListAllDomains(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ALL, -1); vmwareDriverLock(driver); - vmwareDomainObjListUpdateAll(&driver->domains, driver); - ret = virDomainList(conn, driver->domains.objs, domains, flags); + vmwareDomainObjListUpdateAll(driver->domains, driver); + ret = virDomainObjListExport(driver->domains, conn, domains, flags); vmwareDriverUnlock(driver); return ret; } -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> As a step towards making virDomainObjList thread-safe turn it into an opaque virObject, preventing any direct access to its internals. As part of this a new method virDomainObjListForEach is introduced to replace all existing usage of virHashForEach --- src/conf/domain_conf.c | 65 ++++++++++++++++++++++---- src/conf/domain_conf.h | 14 +++--- src/conf/nwfilter_conf.c | 22 ++++----- src/conf/nwfilter_conf.h | 6 +-- src/libvirt_private.syms | 2 +- src/libxl/libxl_driver.c | 51 +++++++++++---------- src/lxc/lxc_driver.c | 9 ++-- src/lxc/lxc_process.c | 28 +++++++----- src/nwfilter/nwfilter_gentech_driver.c | 36 +++++++-------- src/nwfilter/nwfilter_gentech_driver.h | 7 +-- src/openvz/openvz_conf.c | 71 ++++++++++++++-------------- src/parallels/parallels_driver.c | 4 +- src/parallels/parallels_storage.c | 34 ++++---------- src/qemu/qemu_driver.c | 84 +++++++++++++++++----------------- src/qemu/qemu_process.c | 15 +++--- src/test/test_driver.c | 6 +-- src/uml/uml_driver.c | 29 ++++++------ src/vmware/vmware_conf.c | 2 +- src/vmware/vmware_driver.c | 12 ++--- 19 files changed, 266 insertions(+), 231 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 408584c..e9cc696 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -58,6 +58,15 @@ * verify that it doesn't overflow an unsigned int when shifting */ verify(VIR_DOMAIN_VIRT_LAST <= 32); + +struct _virDomainObjList { + virObject parent; + + /* uuid string -> virDomainObj mapping + * for O(1), lockless lookup-by-uuid */ + virHashTable *objs; +}; + /* Private flags used internally by virDomainSaveStatus and * virDomainLoadStatus. */ typedef enum { @@ -696,7 +705,9 @@ VIR_ENUM_IMPL(virDomainNumatuneMemPlacementMode, #define VIR_DOMAIN_XML_READ_FLAGS VIR_DOMAIN_XML_INACTIVE static virClassPtr virDomainObjClass; +static virClassPtr virDomainObjListClass; static void virDomainObjDispose(void *obj); +static void virDomainObjListDispose(void *obj); static int virDomainObjOnceInit(void) { @@ -706,6 +717,12 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1; + if (!(virDomainObjListClass = virClassNew(virClassForObject(), + "virDomainObjList", + sizeof(virDomainObjList), + virDomainObjListDispose))) + return -1; + return 0; } @@ -782,26 +799,26 @@ virDomainObjListPtr virDomainObjListNew(void) { virDomainObjListPtr doms; - if (VIR_ALLOC(doms) < 0) { - virReportOOMError(); + if (virDomainObjInitialize() < 0) + return NULL; + + if (!(doms = virObjectLockableNew(virDomainObjListClass))) return NULL; - } - doms->objs = virHashCreate(50, virDomainObjListDataFree); - if (!doms->objs) { - VIR_FREE(doms); + if (!(doms->objs = virHashCreate(50, virDomainObjListDataFree))) { + virObjectUnref(doms); return NULL; } + return doms; } -void virDomainObjListFree(virDomainObjListPtr doms) +static void virDomainObjListDispose(void *obj) { - if (!doms) - return; + virDomainObjListPtr doms = obj; + virHashFree(doms->objs); - VIR_FREE(doms); } @@ -15207,6 +15224,34 @@ cleanup: return -1; } + +struct virDomainListIterData { + virDomainObjListIterator callback; + void *opaque; + int ret; +}; + +static void virDomainObjListHelper(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) +{ + struct virDomainListIterData *data = opaque; + + if (data->callback(payload, data->opaque) < 0) + data->ret = -1; +} + +int virDomainObjListForEach(virDomainObjListPtr doms, + virDomainObjListIterator callback, + void *opaque) +{ + struct virDomainListIterData data = { + callback, opaque, 0, + }; + virHashForEach(doms->objs, virDomainObjListHelper, &data); + + return data.ret; +} + + int virDomainChrDefForeach(virDomainDefPtr def, bool abortOnError, virDomainChrDefIterator iter, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 97acbe1..e534ca8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -37,7 +37,6 @@ # include "virhash.h" # include "virsocketaddr.h" # include "nwfilter_params.h" -# include "nwfilter_conf.h" # include "virnetdevmacvlan.h" # include "virsysinfo.h" # include "virnetdevvportprofile.h" @@ -1892,11 +1891,6 @@ struct _virDomainObj { typedef struct _virDomainObjList virDomainObjList; typedef virDomainObjList *virDomainObjListPtr; -struct _virDomainObjList { - /* uuid string -> virDomainObj mapping - * for O(1), lockless lookup-by-uuid */ - virHashTable *objs; -}; static inline bool virDomainObjIsActive(virDomainObjPtr dom) @@ -1907,7 +1901,6 @@ virDomainObjIsActive(virDomainObjPtr dom) virDomainObjPtr virDomainObjNew(virCapsPtr caps); virDomainObjListPtr virDomainObjListNew(void); -void virDomainObjListFree(virDomainObjListPtr objs); virDomainObjPtr virDomainObjListFindByID(const virDomainObjListPtr doms, int id); @@ -2175,6 +2168,13 @@ int virDomainObjListGetInactiveNames(virDomainObjListPtr doms, char **const names, int maxnames); +typedef int (*virDomainObjListIterator)(virDomainObjPtr dom, + void *opaque); + +int virDomainObjListForEach(virDomainObjListPtr doms, + virDomainObjListIterator callback, + void *opaque); + typedef int (*virDomainSmartcardDefIterator)(virDomainDefPtr def, virDomainSmartcardDefPtr dev, void *opaque); diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index ca22411..e63a04b 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2867,7 +2867,7 @@ virNWFilterCallbackDriversUnlock(void) } -static virHashIterator virNWFilterDomainFWUpdateCB; +static virDomainObjListIterator virNWFilterDomainFWUpdateCB; /** * virNWFilterInstFiltersOnAllVMs: @@ -2880,7 +2880,6 @@ virNWFilterInstFiltersOnAllVMs(virConnectPtr conn) int i; struct domUpdateCBStruct cb = { .conn = conn, - .err = 0, /* ignored here */ .step = STEP_APPLY_CURRENT, .skipInterfaces = NULL, /* not needed */ }; @@ -2897,10 +2896,9 @@ static int virNWFilterTriggerVMFilterRebuild(virConnectPtr conn) { int i; - int err; + int ret = 0; struct domUpdateCBStruct cb = { .conn = conn, - .err = 0, .step = STEP_APPLY_NEW, .skipInterfaces = virHashCreate(0, NULL), }; @@ -2909,16 +2907,14 @@ virNWFilterTriggerVMFilterRebuild(virConnectPtr conn) return -1; for (i = 0; i < nCallbackDriver; i++) { - callbackDrvArray[i]->vmFilterRebuild(conn, - virNWFilterDomainFWUpdateCB, - &cb); + if (callbackDrvArray[i]->vmFilterRebuild(conn, + virNWFilterDomainFWUpdateCB, + &cb) < 0) + ret = -1; } - err = cb.err; - - if (err) { + if (ret < 0) { cb.step = STEP_TEAR_NEW; /* rollback */ - cb.err = 0; for (i = 0; i < nCallbackDriver; i++) callbackDrvArray[i]->vmFilterRebuild(conn, @@ -2935,7 +2931,7 @@ virNWFilterTriggerVMFilterRebuild(virConnectPtr conn) virHashFree(cb.skipInterfaces); - return err; + return ret; } @@ -3503,7 +3499,7 @@ char *virNWFilterConfigFile(const char *dir, } -int virNWFilterConfLayerInit(virHashIterator domUpdateCB) +int virNWFilterConfLayerInit(virDomainObjListIterator domUpdateCB) { virNWFilterDomainFWUpdateCB = domUpdateCB; diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h index ca2c070..8c5a6ac 100644 --- a/src/conf/nwfilter_conf.h +++ b/src/conf/nwfilter_conf.h @@ -34,6 +34,7 @@ # include "virbuffer.h" # include "virsocketaddr.h" # include "virmacaddr.h" +# include "domain_conf.h" /* XXX * The config parser/structs should not be using platform specific @@ -587,7 +588,6 @@ enum UpdateStep { struct domUpdateCBStruct { virConnectPtr conn; enum UpdateStep step; - int err; virHashTablePtr skipInterfaces; }; @@ -724,14 +724,14 @@ void virNWFilterObjUnlock(virNWFilterObjPtr obj); void virNWFilterLockFilterUpdates(void); void virNWFilterUnlockFilterUpdates(void); -int virNWFilterConfLayerInit(virHashIterator domUpdateCB); +int virNWFilterConfLayerInit(virDomainObjListIterator domUpdateCB); void virNWFilterConfLayerShutdown(void); int virNWFilterInstFiltersOnAllVMs(virConnectPtr conn); typedef int (*virNWFilterRebuild)(virConnectPtr conn, - virHashIterator, void *data); + virDomainObjListIterator, void *data); typedef void (*virNWFilterVoidCall)(void); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9441f48..17c35e1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -474,7 +474,7 @@ virDomainObjListExport; virDomainObjListFindByID; virDomainObjListFindByName; virDomainObjListFindByUUID; -virDomainObjListFree; +virDomainObjListForEach; virDomainObjListGetActiveIDs; virDomainObjListGetInactiveNames; virDomainObjListIsDuplicate; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 4afd106..a79a9ff 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -71,12 +71,12 @@ struct libxlOSEventHookTimerInfo { int id; }; + static libxlDriverPrivatePtr libxl_driver = NULL; /* Function declarations */ -static void -libxlDomainManagedSaveLoad(void *payload, - const void *n ATTRIBUTE_UNUSED, +static int +libxlDomainManagedSaveLoad(virDomainObjPtr vm, void *opaque); static int @@ -299,13 +299,13 @@ libxlDomainEventQueue(libxlDriverPrivatePtr driver, virDomainEventPtr event) virDomainEventStateQueue(driver->domainEventState, event); } -static void -libxlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, +static int +libxlAutostartDomain(virDomainObjPtr vm, void *opaque) { libxlDriverPrivatePtr driver = opaque; - virDomainObjPtr vm = payload; virErrorPtr err; + int ret = -1; virObjectLock(vm); virResetLastError(); @@ -316,10 +316,14 @@ libxlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, VIR_ERROR(_("Failed to autostart VM '%s': %s"), vm->def->name, err ? err->message : _("unknown error")); + goto cleanup; } + ret = 0; +cleanup: if (vm) virObjectUnlock(vm); + return ret; } static int @@ -861,12 +865,10 @@ error: * Reconnect to running domains that were previously started/created * with libxenlight driver. */ -static void -libxlReconnectDomain(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +libxlReconnectDomain(virDomainObjPtr vm, void *opaque) { - virDomainObjPtr vm = payload; libxlDriverPrivatePtr driver = opaque; int rc; libxl_dominfo d_info; @@ -903,7 +905,7 @@ libxlReconnectDomain(void *payload, /* Recreate domain death et. al. events */ libxlCreateDomEvents(vm); virObjectUnlock(vm); - return; + return 0; out: libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN); @@ -911,12 +913,14 @@ out: virDomainObjListRemove(driver->domains, vm); else virObjectUnlock(vm); + + return -1; } static void libxlReconnectDomains(libxlDriverPrivatePtr driver) { - virHashForEach(driver->domains->objs, libxlReconnectDomain, driver); + virDomainObjListForEach(driver->domains, libxlReconnectDomain, driver); } static int @@ -927,7 +931,7 @@ libxlShutdown(void) libxlDriverLock(libxl_driver); virCapabilitiesFree(libxl_driver->caps); - virDomainObjListFree(libxl_driver->domains); + virObjectUnref(libxl_driver->domains); libxl_ctx_free(libxl_driver->ctx); xtl_logger_destroy(libxl_driver->logger); if (libxl_driver->logger_file) @@ -1108,11 +1112,11 @@ libxlStartup(bool privileged, NULL, NULL) < 0) goto error; - virHashForEach(libxl_driver->domains->objs, libxlAutostartDomain, - libxl_driver); + virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain, + libxl_driver); - virHashForEach(libxl_driver->domains->objs, libxlDomainManagedSaveLoad, - libxl_driver); + virDomainObjListForEach(libxl_driver->domains, libxlDomainManagedSaveLoad, + libxl_driver); libxlDriverUnlock(libxl_driver); @@ -1144,8 +1148,8 @@ libxlReload(void) 1, 1 << VIR_DOMAIN_VIRT_XEN, NULL, libxl_driver); - virHashForEach(libxl_driver->domains->objs, libxlAutostartDomain, - libxl_driver); + virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain, + libxl_driver); libxlDriverUnlock(libxl_driver); @@ -2252,14 +2256,13 @@ cleanup: return ret; } -static void -libxlDomainManagedSaveLoad(void *payload, - const void *n ATTRIBUTE_UNUSED, +static int +libxlDomainManagedSaveLoad(virDomainObjPtr vm, void *opaque) { - virDomainObjPtr vm = payload; libxlDriverPrivatePtr driver = opaque; char *name; + int ret = -1; virObjectLock(vm); @@ -2268,9 +2271,11 @@ libxlDomainManagedSaveLoad(void *payload, vm->hasManagedSave = virFileExists(name); + ret = 0; cleanup: virObjectUnlock(vm); VIR_FREE(name); + return ret; } static int diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 9cd2fd8..db183c8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -58,6 +58,7 @@ #include "fdstream.h" #include "domain_audit.h" #include "domain_nwfilter.h" +#include "nwfilter_conf.h" #include "network/bridge_driver.h" #include "virinitctl.h" #include "virnetdev.h" @@ -82,11 +83,9 @@ virLXCDriverPtr lxc_driver = NULL; /* callbacks for nwfilter */ static int lxcVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, - virHashIterator iter, void *data) + virDomainObjListIterator iter, void *data) { - virHashForEach(lxc_driver->domains->objs, iter, data); - - return 0; + return virDomainObjListForEach(lxc_driver->domains, iter, data); } static void @@ -1555,7 +1554,7 @@ static int lxcShutdown(void) lxcDriverLock(lxc_driver); virNWFilterUnRegisterCallbackDriver(&lxcCallbackDriver); - virDomainObjListFree(lxc_driver->domains); + virObjectUnref(lxc_driver->domains); virDomainEventStateFree(lxc_driver->domainEventState); virLXCProcessAutoDestroyShutdown(lxc_driver); diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index f0aae40..5eff760 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1244,17 +1244,18 @@ struct virLXCProcessAutostartData { virConnectPtr conn; }; -static void -virLXCProcessAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) +static int +virLXCProcessAutostartDomain(virDomainObjPtr vm, + void *opaque) { - virDomainObjPtr vm = payload; const struct virLXCProcessAutostartData *data = opaque; + int ret = 0; virObjectLock(vm); if (vm->autostart && !virDomainObjIsActive(vm)) { - int ret = virLXCProcessStart(data->conn, data->driver, vm, false, - VIR_DOMAIN_RUNNING_BOOTED); + ret = virLXCProcessStart(data->conn, data->driver, vm, false, + VIR_DOMAIN_RUNNING_BOOTED); virDomainAuditStart(vm, "booted", ret >= 0); if (ret < 0) { virErrorPtr err = virGetLastError(); @@ -1271,6 +1272,7 @@ virLXCProcessAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, v } } virObjectUnlock(vm); + return ret; } @@ -1288,19 +1290,22 @@ virLXCProcessAutostartAll(virLXCDriverPtr driver) struct virLXCProcessAutostartData data = { driver, conn }; lxcDriverLock(driver); - virHashForEach(driver->domains->objs, virLXCProcessAutostartDomain, &data); + virDomainObjListForEach(driver->domains, + virLXCProcessAutostartDomain, + &data); lxcDriverUnlock(driver); if (conn) virConnectClose(conn); } -static void -virLXCProcessReconnectDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) +static int +virLXCProcessReconnectDomain(virDomainObjPtr vm, + void *opaque) { - virDomainObjPtr vm = payload; virLXCDriverPtr driver = opaque; virLXCDomainObjPrivatePtr priv; + int ret = -1; virObjectLock(vm); VIR_DEBUG("Reconnect id=%d pid=%d state=%d", vm->def->id, vm->pid, vm->state.state); @@ -1344,9 +1349,10 @@ virLXCProcessReconnectDomain(void *payload, const void *name ATTRIBUTE_UNUSED, v vm->def->id = -1; } + ret = 0; cleanup: virObjectUnlock(vm); - return; + return ret; error: virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED); @@ -1358,6 +1364,6 @@ error: int virLXCProcessReconnectAll(virLXCDriverPtr driver, virDomainObjListPtr doms) { - virHashForEach(doms->objs, virLXCProcessReconnectDomain, driver); + virDomainObjListForEach(doms, virLXCProcessReconnectDomain, driver); return 0; } diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c index 8508f06..958f47a 100644 --- a/src/nwfilter/nwfilter_gentech_driver.c +++ b/src/nwfilter/nwfilter_gentech_driver.c @@ -1150,16 +1150,15 @@ virNWFilterTeardownFilter(const virDomainNetDefPtr net) } -void -virNWFilterDomainFWUpdateCB(void *payload, - const void *name ATTRIBUTE_UNUSED, +int +virNWFilterDomainFWUpdateCB(virDomainObjPtr obj, void *data) { - virDomainObjPtr obj = payload; virDomainDefPtr vm = obj->def; struct domUpdateCBStruct *cb = data; - int i, err; + int i; bool skipIface; + int ret = 0; virObjectLock(obj); @@ -1169,45 +1168,46 @@ virNWFilterDomainFWUpdateCB(void *payload, if ((net->filter) && (net->ifname)) { switch (cb->step) { case STEP_APPLY_NEW: - cb->err = virNWFilterUpdateInstantiateFilter(cb->conn, - vm->uuid, - net, - &skipIface); - if (cb->err == 0 && skipIface) { + ret = virNWFilterUpdateInstantiateFilter(cb->conn, + vm->uuid, + net, + &skipIface); + if (ret == 0 && skipIface) { /* filter tree unchanged -- no update needed */ - cb->err = virHashAddEntry(cb->skipInterfaces, - net->ifname, - (void *)~0); + ret = virHashAddEntry(cb->skipInterfaces, + net->ifname, + (void *)~0); } break; case STEP_TEAR_NEW: if (!virHashLookup(cb->skipInterfaces, net->ifname)) { - cb->err = virNWFilterRollbackUpdateFilter(net); + ret = virNWFilterRollbackUpdateFilter(net); } break; case STEP_TEAR_OLD: if (!virHashLookup(cb->skipInterfaces, net->ifname)) { - cb->err = virNWFilterTearOldFilter(net); + ret = virNWFilterTearOldFilter(net); } break; case STEP_APPLY_CURRENT: - err = virNWFilterInstantiateFilter(cb->conn, + ret = virNWFilterInstantiateFilter(cb->conn, vm->uuid, net); - if (err) + if (ret) virReportError(VIR_ERR_INTERNAL_ERROR, _("Failure while applying current filter on " "VM %s"), vm->name); break; } - if (cb->err) + if (ret) break; } } } virObjectUnlock(obj); + return ret; } diff --git a/src/nwfilter/nwfilter_gentech_driver.h b/src/nwfilter/nwfilter_gentech_driver.h index a632ca6..4b47b4a 100644 --- a/src/nwfilter/nwfilter_gentech_driver.h +++ b/src/nwfilter/nwfilter_gentech_driver.h @@ -23,6 +23,8 @@ #ifndef __NWFILTER_GENTECH_DRIVER_H # define __NWFILTER_GENTECH_DRIVER_H +# include "nwfilter_conf.h" + virNWFilterTechDriverPtr virNWFilterTechDriverForName(const char *name); int virNWFilterRuleInstAddData(virNWFilterRuleInstPtr res, @@ -60,8 +62,7 @@ int virNWFilterTeardownFilter(const virDomainNetDefPtr net); virNWFilterHashTablePtr virNWFilterCreateVarHashmap(char *macaddr, const virNWFilterVarValuePtr); -void virNWFilterDomainFWUpdateCB(void *payload, - const void *name, - void *data); +int virNWFilterDomainFWUpdateCB(virDomainObjPtr vm, + void *data); #endif diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 46f30ca..6eacbca 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -558,7 +558,7 @@ openvzFreeDriver(struct openvz_driver *driver) if (!driver) return; - virDomainObjListFree(driver->domains); + virObjectUnref(driver->domains); virCapabilitiesFree(driver->caps); VIR_FREE(driver); } @@ -570,6 +570,7 @@ int openvzLoadDomains(struct openvz_driver *driver) { char *status; char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr dom = NULL; + virDomainDefPtr def = NULL; char *temp = NULL; char *outbuf = NULL; char *line; @@ -594,35 +595,20 @@ int openvzLoadDomains(struct openvz_driver *driver) { } *line++ = '\0'; - if (!(dom = virDomainObjNew(driver->caps))) - goto cleanup; - - if (VIR_ALLOC(dom->def) < 0) + if (VIR_ALLOC(def) < 0) goto no_memory; - dom->def->virtType = VIR_DOMAIN_VIRT_OPENVZ; - - if (STREQ(status, "stopped")) { - virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, - VIR_DOMAIN_SHUTOFF_UNKNOWN); - } else { - virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, - VIR_DOMAIN_RUNNING_UNKNOWN); - } + def->virtType = VIR_DOMAIN_VIRT_OPENVZ; - dom->pid = veid; if (virDomainObjGetState(dom, NULL) == VIR_DOMAIN_SHUTOFF) - dom->def->id = -1; + def->id = -1; else - dom->def->id = veid; - /* XXX OpenVZ doesn't appear to have concept of a transient domain */ - dom->persistent = 1; - - if (virAsprintf(&dom->def->name, "%i", veid) < 0) + def->id = veid; + if (virAsprintf(&def->name, "%i", veid) < 0) goto no_memory; openvzGetVPSUUID(veid, uuidstr, sizeof(uuidstr)); - ret = virUUIDParse(uuidstr, dom->def->uuid); + ret = virUUIDParse(uuidstr, def->uuid); if (ret == -1) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -630,9 +616,9 @@ int openvzLoadDomains(struct openvz_driver *driver) { goto cleanup; } - if (!(dom->def->os.type = strdup("exe"))) + if (!(def->os.type = strdup("exe"))) goto no_memory; - if (!(dom->def->os.init = strdup("/sbin/init"))) + if (!(def->os.init = strdup("/sbin/init"))) goto no_memory; ret = openvzReadVPSConfigParam(veid, "CPUS", &temp); @@ -642,35 +628,47 @@ int openvzLoadDomains(struct openvz_driver *driver) { veid); goto cleanup; } else if (ret > 0) { - dom->def->maxvcpus = strtoI(temp); + def->maxvcpus = strtoI(temp); } - if (ret == 0 || dom->def->maxvcpus == 0) - dom->def->maxvcpus = openvzGetNodeCPUs(); - dom->def->vcpus = dom->def->maxvcpus; + if (ret == 0 || def->maxvcpus == 0) + def->maxvcpus = openvzGetNodeCPUs(); + def->vcpus = def->maxvcpus; /* XXX load rest of VM config data .... */ - openvzReadNetworkConf(dom->def, veid); - openvzReadFSConf(dom->def, veid); - openvzReadMemConf(dom->def, veid); + openvzReadNetworkConf(def, veid); + openvzReadFSConf(def, veid); + openvzReadMemConf(def, veid); - virUUIDFormat(dom->def->uuid, uuidstr); - if (virHashLookup(driver->domains->objs, uuidstr)) { + virUUIDFormat(def->uuid, uuidstr); + if (virDomainObjListIsDuplicate(driver->domains, def, true)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Duplicate container UUID %s detected for %d"), uuidstr, veid); goto cleanup; } - if (virHashAddEntry(driver->domains->objs, uuidstr, dom) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not add UUID for container %d"), veid); + if (!(dom = virDomainObjListAdd(driver->domains, + driver->caps, + def, + STRNEQ(status, "stopped")))) goto cleanup; + + if (STREQ(status, "stopped")) { + virDomainObjSetState(dom, VIR_DOMAIN_SHUTOFF, + VIR_DOMAIN_SHUTOFF_UNKNOWN); + } else { + virDomainObjSetState(dom, VIR_DOMAIN_RUNNING, + VIR_DOMAIN_RUNNING_UNKNOWN); } + /* XXX OpenVZ doesn't appear to have concept of a transient domain */ + dom->persistent = 1; + dom->pid = veid; virObjectUnlock(dom); dom = NULL; + def = NULL; } virCommandFree(cmd); @@ -687,6 +685,7 @@ int openvzLoadDomains(struct openvz_driver *driver) { VIR_FREE(temp); VIR_FREE(outbuf); virObjectUnref(dom); + virDomainDefFree(def); return -1; } diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index e472df8..ca1f862 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -940,7 +940,7 @@ parallelsOpenDefault(virConnectPtr conn) return VIR_DRV_OPEN_SUCCESS; error: - virDomainObjListFree(privconn->domains); + virObjectUnref(privconn->domains); virCapabilitiesFree(privconn->caps); virStoragePoolObjListFree(&privconn->pools); VIR_FREE(privconn); @@ -987,7 +987,7 @@ parallelsClose(virConnectPtr conn) parallelsDriverLock(privconn); virCapabilitiesFree(privconn->caps); - virDomainObjListFree(privconn->domains); + virObjectUnref(privconn->domains); conn->privateData = NULL; parallelsDriverUnlock(privconn); diff --git a/src/parallels/parallels_storage.c b/src/parallels/parallels_storage.c index 612168e..1186296 100644 --- a/src/parallels/parallels_storage.c +++ b/src/parallels/parallels_storage.c @@ -122,11 +122,6 @@ cleanup: } -struct parallelsPoolsAddData { - virConnectPtr conn; - bool failed; -}; - /* * Generate unique pool name by path */ @@ -404,26 +399,20 @@ cleanup: } -static void -parallelsPoolsAdd(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +parallelsPoolsAdd(virDomainObjPtr dom, void *opaque) { - struct parallelsPoolsAddData *data = (struct parallelsPoolsAddData *)opaque; - virDomainObjPtr dom = payload; + virConnectPtr conn = opaque; virStoragePoolObjPtr pool; - if (!(pool = parallelsPoolAddByDomain(data->conn, dom))) { - data->failed = true; - return; - } + if (!(pool = parallelsPoolAddByDomain(conn, dom))) + return -1; - if (parallelsFindVmVolumes(pool, dom)) { - data->failed = true; - return; - } + if (parallelsFindVmVolumes(pool, dom)) + return -1; - return; + return 0; } static int parallelsLoadPools(virConnectPtr conn) @@ -432,7 +421,6 @@ static int parallelsLoadPools(virConnectPtr conn) virStorageDriverStatePtr storageState = conn->storagePrivateData; char *base = NULL; size_t i; - struct parallelsPoolsAddData data; if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL) goto out_of_memory; @@ -456,11 +444,7 @@ static int parallelsLoadPools(virConnectPtr conn) goto error; } - data.conn = conn; - data.failed = false; - virHashForEach(privconn->domains->objs, parallelsPoolsAdd, &data); - - if (data.failed) + if (virDomainObjListForEach(privconn->domains, parallelsPoolsAdd, conn) < 0) goto error; for (i = 0; i < privconn->pools.count; i++) { diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 98d9501..97f010b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -79,6 +79,7 @@ #include "cpu/cpu.h" #include "virsysinfo.h" #include "domain_nwfilter.h" +#include "nwfilter_conf.h" #include "virhook.h" #include "virstoragefile.h" #include "virfile.h" @@ -144,9 +145,8 @@ static int qemuDomainObjStart(virConnectPtr conn, static int qemuDomainGetMaxVcpus(virDomainPtr dom); -static void qemuDomainManagedSaveLoad(void *payload, - const void *n ATTRIBUTE_UNUSED, - void *opaque); +static int qemuDomainManagedSaveLoad(virDomainObjPtr vm, + void *opaque); virQEMUDriverPtr qemu_driver = NULL; @@ -166,11 +166,9 @@ qemuVMDriverUnlock(void) { static int qemuVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, - virHashIterator iter, void *data) + virDomainObjListIterator iter, void *data) { - virHashForEach(qemu_driver->domains->objs, iter, data); - - return 0; + return virDomainObjListForEach(qemu_driver->domains, iter, data); } static virNWFilterCallbackDriver qemuCallbackDriver = { @@ -278,15 +276,15 @@ qemuSnapObjFromSnapshot(virDomainObjPtr vm, return qemuSnapObjFromName(vm, snapshot->name); } -static void -qemuAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, +static int +qemuAutostartDomain(virDomainObjPtr vm, void *opaque) { - virDomainObjPtr vm = payload; struct qemuAutostartData *data = opaque; virErrorPtr err; int flags = 0; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(data->driver); + int ret = -1; if (cfg->autoStartBypassCache) flags |= VIR_DOMAIN_START_BYPASS_CACHE; @@ -315,10 +313,12 @@ qemuAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, vm = NULL; } + ret = 0; cleanup: if (vm) virObjectUnlock(vm); virObjectUnref(cfg); + return ret; } @@ -336,7 +336,7 @@ qemuAutostartDomains(virQEMUDriverPtr driver) struct qemuAutostartData data = { driver, conn }; qemuDriverLock(driver); - virHashForEach(driver->domains->objs, qemuAutostartDomain, &data); + virDomainObjListForEach(driver->domains, qemuAutostartDomain, &data); qemuDriverUnlock(driver); if (conn) @@ -489,18 +489,15 @@ err_exit: } -static void -qemuDomainSnapshotLoad(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +qemuDomainSnapshotLoad(virDomainObjPtr vm, void *data) { - virDomainObjPtr vm = (virDomainObjPtr)payload; char *baseDir = (char *)data; char *snapDir = NULL; DIR *dir = NULL; struct dirent *entry; char *xmlStr; - int ret; char *fullpath; virDomainSnapshotDefPtr def = NULL; virDomainSnapshotObjPtr snap = NULL; @@ -509,6 +506,7 @@ qemuDomainSnapshotLoad(void *payload, unsigned int flags = (VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE | VIR_DOMAIN_SNAPSHOT_PARSE_DISKS | VIR_DOMAIN_SNAPSHOT_PARSE_INTERNAL); + int ret = -1; virObjectLock(vm); if (virAsprintf(&snapDir, "%s/%s", baseDir, vm->def->name) < 0) { @@ -541,8 +539,7 @@ qemuDomainSnapshotLoad(void *payload, continue; } - ret = virFileReadAll(fullpath, 1024*1024*1, &xmlStr); - if (ret < 0) { + if (virFileReadAll(fullpath, 1024*1024*1, &xmlStr) < 0) { /* Nothing we can do here, skip this one */ VIR_ERROR(_("Failed to read snapshot file %s: %s"), fullpath, virStrerror(errno, ebuf, sizeof(ebuf))); @@ -596,21 +593,21 @@ qemuDomainSnapshotLoad(void *payload, virResetLastError(); + ret = 0; cleanup: if (dir) closedir(dir); VIR_FREE(snapDir); virObjectUnlock(vm); + return ret; } -static void -qemuDomainNetsRestart(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +qemuDomainNetsRestart(virDomainObjPtr vm, void *data ATTRIBUTE_UNUSED) { int i; - virDomainObjPtr vm = (virDomainObjPtr)payload; virDomainDefPtr def = vm->def; virObjectLock(vm); @@ -631,19 +628,20 @@ qemuDomainNetsRestart(void *payload, } virObjectUnlock(vm); + return 0; } -static void -qemuDomainFindMaxID(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +qemuDomainFindMaxID(virDomainObjPtr vm, void *data) { - virDomainObjPtr vm = payload; int *driver_maxid = data; if (vm->def->id >= *driver_maxid) *driver_maxid = vm->def->id + 1; + + return 0; } @@ -875,11 +873,13 @@ qemuStartup(bool privileged, /* find the maximum ID from active and transient configs to initialize * the driver with. This is to avoid race between autostart and reconnect * threads */ - virHashForEach(qemu_driver->domains->objs, - qemuDomainFindMaxID, - &qemu_driver->nextvmid); + virDomainObjListForEach(qemu_driver->domains, + qemuDomainFindMaxID, + &qemu_driver->nextvmid); - virHashForEach(qemu_driver->domains->objs, qemuDomainNetsRestart, NULL); + virDomainObjListForEach(qemu_driver->domains, + qemuDomainNetsRestart, + NULL); conn = virConnectOpen(cfg->uri); @@ -895,13 +895,13 @@ qemuStartup(bool privileged, goto error; - virHashForEach(qemu_driver->domains->objs, - qemuDomainSnapshotLoad, - cfg->snapshotDir); + virDomainObjListForEach(qemu_driver->domains, + qemuDomainSnapshotLoad, + cfg->snapshotDir); - virHashForEach(qemu_driver->domains->objs, - qemuDomainManagedSaveLoad, - qemu_driver); + virDomainObjListForEach(qemu_driver->domains, + qemuDomainManagedSaveLoad, + qemu_driver); qemu_driver->workerPool = virThreadPoolNew(0, 1, 0, processWatchdogEvent, qemu_driver); if (!qemu_driver->workerPool) @@ -1055,7 +1055,7 @@ qemuShutdown(void) { virCapabilitiesFree(qemu_driver->caps); qemuCapsCacheFree(qemu_driver->capsCache); - virDomainObjListFree(qemu_driver->domains); + virObjectUnref(qemu_driver->domains); virObjectUnref(qemu_driver->remotePorts); virSysinfoDefFree(qemu_driver->hostsysinfo); @@ -3136,14 +3136,13 @@ cleanup: return ret; } -static void -qemuDomainManagedSaveLoad(void *payload, - const void *n ATTRIBUTE_UNUSED, +static int +qemuDomainManagedSaveLoad(virDomainObjPtr vm, void *opaque) { - virDomainObjPtr vm = payload; virQEMUDriverPtr driver = opaque; char *name; + int ret = -1; virObjectLock(vm); @@ -3152,11 +3151,14 @@ qemuDomainManagedSaveLoad(void *payload, vm->hasManagedSave = virFileExists(name); + ret = 0; cleanup: virObjectUnlock(vm); VIR_FREE(name); + return ret; } + static int qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) { diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index dad6e25..8f76dde 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3338,23 +3338,21 @@ error: virObjectUnref(cfg); } -static void -qemuProcessReconnectHelper(void *payload, - const void *name ATTRIBUTE_UNUSED, +static int +qemuProcessReconnectHelper(virDomainObjPtr obj, void *opaque) { virThread thread; struct qemuProcessReconnectData *src = opaque; struct qemuProcessReconnectData *data; - virDomainObjPtr obj = payload; if (VIR_ALLOC(data) < 0) { virReportOOMError(); - return; + return -1; } memcpy(data, src, sizeof(*data)); - data->payload = payload; + data->payload = obj; /* This iterator is called with driver being locked. * We create a separate thread to run qemuProcessReconnect in it. @@ -3415,10 +3413,11 @@ qemuProcessReconnectHelper(void *payload, virObjectUnlock(obj); - return; + return 0; error: VIR_FREE(data); + return -1; } /** @@ -3431,7 +3430,7 @@ void qemuProcessReconnectAll(virConnectPtr conn, virQEMUDriverPtr driver) { struct qemuProcessReconnectData data = {.conn = conn, .driver = driver}; - virHashForEach(driver->domains->objs, qemuProcessReconnectHelper, &data); + virDomainObjListForEach(driver->domains, qemuProcessReconnectHelper, &data); } int diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 78b73b3..c4685b7 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -628,7 +628,7 @@ static int testOpenDefault(virConnectPtr conn) { return VIR_DRV_OPEN_SUCCESS; error: - virDomainObjListFree(privconn->domains); + virObjectUnref(privconn->domains); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); @@ -1097,7 +1097,7 @@ static int testOpenFromFile(virConnectPtr conn, VIR_FREE(ifaces); VIR_FREE(pools); VIR_FREE(devs); - virDomainObjListFree(privconn->domains); + virObjectUnref(privconn->domains); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); virStoragePoolObjListFree(&privconn->pools); @@ -1166,7 +1166,7 @@ static int testClose(virConnectPtr conn) testConnPtr privconn = conn->privateData; testDriverLock(privconn); virCapabilitiesFree(privconn->caps); - virDomainObjListFree(privconn->domains); + virObjectUnref(privconn->domains); virNodeDeviceObjListFree(&privconn->devs); virNetworkObjListFree(&privconn->networks); virInterfaceObjListFree(&privconn->ifaces); diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 613973c..6702a7e 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -58,6 +58,7 @@ #include "datatypes.h" #include "virlog.h" #include "domain_nwfilter.h" +#include "nwfilter_conf.h" #include "virfile.h" #include "fdstream.h" #include "configmake.h" @@ -148,11 +149,9 @@ static struct uml_driver *uml_driver = NULL; static int umlVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED, - virHashIterator iter, void *data) + virDomainObjListIterator iter, void *data) { - virHashForEach(uml_driver->domains->objs, iter, data); - - return 0; + return virDomainObjListForEach(uml_driver->domains, iter, data); } static void @@ -179,16 +178,15 @@ struct umlAutostartData { virConnectPtr conn; }; -static void -umlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) +static int +umlAutostartDomain(virDomainObjPtr vm, + void *opaque) { - virDomainObjPtr vm = payload; const struct umlAutostartData *data = opaque; - + int ret = 0; virObjectLock(vm); if (vm->autostart && !virDomainObjIsActive(vm)) { - int ret; virResetLastError(); ret = umlStartVMDaemon(data->conn, data->driver, vm, false); virDomainAuditStart(vm, "booted", ret >= 0); @@ -206,6 +204,7 @@ umlAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaqu } } virObjectUnlock(vm); + return ret; } static void @@ -223,7 +222,7 @@ umlAutostartConfigs(struct uml_driver *driver) { struct umlAutostartData data = { driver, conn }; umlDriverLock(driver); - virHashForEach(driver->domains->objs, umlAutostartDomain, &data); + virDomainObjListForEach(driver->domains, umlAutostartDomain, &data); umlDriverUnlock(driver); if (conn) @@ -600,10 +599,9 @@ umlReload(void) { } -static void -umlShutdownOneVM(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) +static int +umlShutdownOneVM(virDomainObjPtr dom, void *opaque) { - virDomainObjPtr dom = payload; struct uml_driver *driver = opaque; virObjectLock(dom); @@ -612,6 +610,7 @@ umlShutdownOneVM(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) virDomainAuditStop(dom, "shutdown"); } virObjectUnlock(dom); + return 0; } /** @@ -633,9 +632,9 @@ umlShutdown(void) { /* shutdown active VMs * XXX allow them to stay around & reconnect */ - virHashForEach(uml_driver->domains->objs, umlShutdownOneVM, uml_driver); + virDomainObjListForEach(uml_driver->domains, umlShutdownOneVM, uml_driver); - virDomainObjListFree(uml_driver->domains); + virObjectUnref(uml_driver->domains); virDomainEventStateFree(uml_driver->domainEventState); diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index d2afce3..b616c1b 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -43,7 +43,7 @@ vmwareFreeDriver(struct vmware_driver *driver) return; virMutexDestroy(&driver->lock); - virDomainObjListFree(driver->domains); + virObjectUnref(driver->domains); virCapabilitiesFree(driver->caps); VIR_FREE(driver); } diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 3b2d1e5..b99fca3 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -946,19 +946,19 @@ vmwareDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, return xml; } -static void vmwareDomainObjListUpdateDomain(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) +static int vmwareDomainObjListUpdateDomain(virDomainObjPtr dom, void *data) { struct vmware_driver *driver = data; - virDomainObjPtr vm = payload; - virObjectLock(vm); - ignore_value(vmwareUpdateVMStatus(driver, vm)); - virObjectUnlock(vm); + virObjectLock(dom); + ignore_value(vmwareUpdateVMStatus(driver, dom)); + virObjectUnlock(dom); + return 0; } static void vmwareDomainObjListUpdateAll(virDomainObjListPtr doms, struct vmware_driver *driver) { - virHashForEach(doms->objs, vmwareDomainObjListUpdateDomain, driver); + virDomainObjListForEach(doms, vmwareDomainObjListUpdateDomain, driver); } static int -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> The duplicate VM checking should be done atomically with virDomainObjListAdd, so shoud not be a separate function. Instead just use flags to indicate what kind of checks are required. This pair, used in virDomainCreateXML: if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, false))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; This pair, used in virDomainRestoreFlags: if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, true))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, VIR_DOMAIN_OBJ_LIST_ADD_LIVE | VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; This pair, used in virDomainDefinXML: if (virDomainObjListIsDuplicate(privconn->domains, def, 0) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, false))) goto cleanup; Changes to if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, def, 0, NULL))) goto cleanup; --- src/conf/domain_conf.c | 156 +++++++++++++++++++-------------------- src/conf/domain_conf.h | 11 +-- src/libxl/libxl_driver.c | 27 ++++--- src/lxc/lxc_driver.c | 19 +++-- src/openvz/openvz_conf.c | 12 +-- src/openvz/openvz_driver.c | 6 +- src/parallels/parallels_driver.c | 16 ++-- src/qemu/qemu_driver.c | 71 +++++++----------- src/qemu/qemu_migration.c | 11 ++- src/test/test_driver.c | 31 ++++---- src/uml/uml_driver.c | 13 ++-- src/vmware/vmware_conf.c | 2 +- src/vmware/vmware_driver.c | 12 +-- 13 files changed, 174 insertions(+), 213 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e9cc696..02fcd84 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1873,30 +1873,91 @@ void virDomainObjAssignDef(virDomainObjPtr domain, } } + + +/* + * + * If flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE then + * this will refuse updating an existing def if the + * current def is Live + * + */ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virCapsPtr caps, const virDomainDefPtr def, - bool live) + unsigned int flags, + virDomainDefPtr *oldDef) { - virDomainObjPtr domain; + virDomainObjPtr vm; char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (oldDef) + *oldDef = false; - if ((domain = virDomainObjListFindByUUID(doms, def->uuid))) { - virDomainObjAssignDef(domain, def, live); - return domain; - } + /* See if a VM with matching UUID already exists */ + if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) { + /* UUID matches, but if names don't match, refuse it */ + if (STRNEQ(vm->def->name, def->name)) { + virUUIDFormat(vm->def->uuid, uuidstr); + virReportError(VIR_ERR_OPERATION_FAILED, + _("domain '%s' is already defined with uuid %s"), + vm->def->name, uuidstr); + goto cleanup; + } - if (!(domain = virDomainObjNew(caps))) - return NULL; - domain->def = def; + if (flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE) { + /* UUID & name match, but if VM is already active, refuse it */ + if (virDomainObjIsActive(vm)) { + virReportError(VIR_ERR_OPERATION_INVALID, + _("domain is already active as '%s'"), + vm->def->name); + goto cleanup; + } + } - virUUIDFormat(def->uuid, uuidstr); - if (virHashAddEntry(doms->objs, uuidstr, domain) < 0) { - VIR_FREE(domain); - return NULL; - } + if (virDomainObjIsActive(vm)) { + if (oldDef) + *oldDef = vm->newDef; + else + virDomainDefFree(vm->newDef); + vm->newDef = def; + } else { + if (flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE) { + if (!vm->newDef) + vm->newDef = vm->def; + else + virDomainDefFree(vm->newDef); + } else { + if (oldDef) + *oldDef = vm->def; + else + virDomainDefFree(vm->def); + } + vm->def = def; + } + } else { + /* UUID does not match, but if a name matches, refuse it */ + if ((vm = virDomainObjListFindByName(doms, def->name))) { + virUUIDFormat(vm->def->uuid, uuidstr); + virReportError(VIR_ERR_OPERATION_FAILED, + _("domain '%s' already exists with uuid %s"), + def->name, uuidstr); + virObjectUnlock(vm); + vm = NULL; + goto cleanup; + } - return domain; + if (!(vm = virDomainObjNew(caps))) + goto cleanup; + vm->def = def; + + virUUIDFormat(def->uuid, uuidstr); + if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) { + VIR_FREE(vm); + return NULL; + } + } +cleanup: + return vm; } /* @@ -14833,7 +14894,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, return dom; } - if (!(dom = virDomainObjListAdd(doms, caps, def, false))) + if (!(dom = virDomainObjListAdd(doms, caps, def, 0, NULL))) goto error; dom->autostart = autostart; @@ -15059,69 +15120,6 @@ virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def) return NULL; } -/* - * virDomainObjListIsDuplicate: - * @doms : virDomainObjListPtr to search - * @def : virDomainDefPtr definition of domain to lookup - * @check_active: If true, ensure that domain is not active - * - * Returns: -1 on error - * 0 if domain is new - * 1 if domain is a duplicate - */ -int -virDomainObjListIsDuplicate(virDomainObjListPtr doms, - virDomainDefPtr def, - unsigned int check_active) -{ - int ret = -1; - int dupVM = 0; - virDomainObjPtr vm = NULL; - - /* See if a VM with matching UUID already exists */ - vm = virDomainObjListFindByUUID(doms, def->uuid); - if (vm) { - /* UUID matches, but if names don't match, refuse it */ - if (STRNEQ(vm->def->name, def->name)) { - char uuidstr[VIR_UUID_STRING_BUFLEN]; - virUUIDFormat(vm->def->uuid, uuidstr); - virReportError(VIR_ERR_OPERATION_FAILED, - _("domain '%s' is already defined with uuid %s"), - vm->def->name, uuidstr); - goto cleanup; - } - - if (check_active) { - /* UUID & name match, but if VM is already active, refuse it */ - if (virDomainObjIsActive(vm)) { - virReportError(VIR_ERR_OPERATION_INVALID, - _("domain is already active as '%s'"), - vm->def->name); - goto cleanup; - } - } - - dupVM = 1; - } else { - /* UUID does not match, but if a name matches, refuse it */ - vm = virDomainObjListFindByName(doms, def->name); - if (vm) { - char uuidstr[VIR_UUID_STRING_BUFLEN]; - virUUIDFormat(vm->def->uuid, uuidstr); - virReportError(VIR_ERR_OPERATION_FAILED, - _("domain '%s' already exists with uuid %s"), - def->name, uuidstr); - goto cleanup; - } - } - - ret = dupVM; -cleanup: - if (vm) - virObjectUnlock(vm); - return ret; -} - static void virDomainObjListCountActive(void *payload, const void *name ATTRIBUTE_UNUSED, void *data) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e534ca8..5eed85d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1967,10 +1967,15 @@ virDomainChrDefPtr virDomainChrDefNew(void); /* live == true means def describes an active domain (being migrated or * restored) as opposed to a new persistent configuration of the domain */ +enum { + VIR_DOMAIN_OBJ_LIST_ADD_LIVE = (1 << 0), + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE = (1 << 1), +}; virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virCapsPtr caps, const virDomainDefPtr def, - bool live); + unsigned int flags, + virDomainDefPtr *oldDef); void virDomainObjAssignDef(virDomainObjPtr domain, const virDomainDefPtr def, bool live); @@ -2155,10 +2160,6 @@ int virDomainFSIndexByName(virDomainDefPtr def, const char *name); int virDomainVideoDefaultType(virDomainDefPtr def); int virDomainVideoDefaultRAM(virDomainDefPtr def, int type); -int virDomainObjListIsDuplicate(virDomainObjListPtr doms, - virDomainDefPtr def, - unsigned int check_active); - int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active); int virDomainObjListGetActiveIDs(virDomainObjListPtr doms, diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index a79a9ff..d72ca34 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1305,12 +1305,11 @@ libxlDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -2084,12 +2083,12 @@ libxlDomainRestoreFlags(virConnectPtr conn, const char *from, if (fd < 0) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, true))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -2865,7 +2864,7 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml) virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; virDomainEventPtr event = NULL; - int dupVM; + virDomainDefPtr oldDef = NULL; libxlDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, @@ -2873,12 +2872,11 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + 0, + &oldDef))) goto cleanup; def = NULL; vm->persistent = 1; @@ -2895,12 +2893,13 @@ libxlDomainDefineXML(virConnectPtr conn, const char *xml) dom->id = vm->def->id; event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED, - !dupVM ? + !oldDef ? VIR_DOMAIN_EVENT_DEFINED_ADDED : VIR_DOMAIN_EVENT_DEFINED_UPDATED); cleanup: virDomainDefFree(def); + virDomainDefFree(oldDef); if (vm) virObjectUnlock(vm); if (event) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index db183c8..f7ca70d 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -410,7 +410,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; virDomainEventPtr event = NULL; - int dupVM; + virDomainDefPtr oldDef = NULL; lxcDriverLock(driver); if (!(def = virDomainDefParseString(driver->caps, xml, @@ -421,9 +421,6 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) - goto cleanup; - if ((def->nets != NULL) && !(driver->have_netns)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("System lacks NETNS support")); @@ -432,7 +429,9 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + 0, + &oldDef))) goto cleanup; def = NULL; vm->persistent = 1; @@ -446,7 +445,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED, - !dupVM ? + !oldDef ? VIR_DOMAIN_EVENT_DEFINED_ADDED : VIR_DOMAIN_EVENT_DEFINED_UPDATED); @@ -456,6 +455,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml) cleanup: virDomainDefFree(def); + virDomainDefFree(oldDef); if (vm) virObjectUnlock(vm); if (event) @@ -1076,9 +1076,6 @@ lxcDomainCreateAndStart(virConnectPtr conn, if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if ((def->nets != NULL) && !(driver->have_netns)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("System lacks NETNS support")); @@ -1088,7 +1085,9 @@ lxcDomainCreateAndStart(virConnectPtr conn, if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index 6eacbca..84ba3d6 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -642,17 +642,13 @@ int openvzLoadDomains(struct openvz_driver *driver) { openvzReadMemConf(def, veid); virUUIDFormat(def->uuid, uuidstr); - if (virDomainObjListIsDuplicate(driver->domains, def, true)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Duplicate container UUID %s detected for %d"), - uuidstr, - veid); - goto cleanup; - } if (!(dom = virDomainObjListAdd(driver->domains, driver->caps, def, - STRNEQ(status, "stopped")))) + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE | + (STRNEQ(status, "stopped") ? + VIR_DOMAIN_OBJ_LIST_ADD_LIVE : 0), + NULL))) goto cleanup; if (STREQ(status, "stopped")) { diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 24d4202..0cb5a1c 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -969,7 +969,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml) } if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, false))) + vmdef, 0, NULL))) goto cleanup; vmdef = NULL; vm->persistent = 1; @@ -1056,7 +1056,9 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml, } if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, false))) + vmdef, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; vmdef = NULL; /* All OpenVZ domains seem to be persistent - this is a bit of a violation diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index ca1f862..02fbf03 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -832,7 +832,7 @@ parallelsLoadDomain(parallelsConnPtr privconn, virJSONValuePtr jobj) if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, false))) + def, 0, NULL))) goto cleanup; /* dom is locked here */ @@ -2316,7 +2316,6 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) virDomainPtr ret = NULL; virDomainDefPtr def; virDomainObjPtr dom = NULL, olddom = NULL; - int dupVM; parallelsDriverLock(privconn); if ((def = virDomainDefParseString(privconn->caps, xml, @@ -2327,14 +2326,9 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) goto cleanup; } - if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) { - virReportError(VIR_ERR_INVALID_ARG, "%s", _("Already exists")); - goto cleanup; - } - - if (dupVM == 1) { - olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid); - } else { + olddom = virDomainObjListFindByUUID(privconn->domains, def->uuid); + if (olddom == NULL) { + virResetLastError(); if (STREQ(def->os.type, "hvm")) { if (parallelsCreateVm(conn, def)) goto cleanup; @@ -2365,7 +2359,7 @@ parallelsDomainDefineXML(virConnectPtr conn, const char *xml) if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, false))) { + def, 0, NULL))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Can't allocate domobj")); goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 97f010b..603c4fa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1590,9 +1590,6 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) goto cleanup; @@ -1604,7 +1601,9 @@ static virDomainPtr qemuDomainCreate(virConnectPtr conn, const char *xml, if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -4993,15 +4992,13 @@ qemuDomainRestoreFlags(virConnectPtr conn, if (fd < 0) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, true))) { - /* virDomainLitsAdd already set the error */ + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; - } def = NULL; if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0) @@ -5591,12 +5588,11 @@ qemuDomainStart(virDomainPtr dom) static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { virQEMUDriverPtr driver = conn->privateData; virDomainDefPtr def; - virDomainDefPtr def_backup = NULL; + virDomainDefPtr oldDef = NULL; virDomainObjPtr vm = NULL; virDomainPtr dom = NULL; virDomainEventPtr event = NULL; qemuCapsPtr caps = NULL; - int dupVM; virQEMUDriverConfigPtr cfg; qemuDriverLock(driver); @@ -5609,9 +5605,6 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (virSecurityManagerVerify(driver->securityManager, def) < 0) goto cleanup; - if ((dupVM = virDomainObjListIsDuplicate(driver->domains, def, 0)) < 0) - goto cleanup; - if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) goto cleanup; @@ -5621,26 +5614,14 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (qemuDomainAssignAddresses(def, caps, NULL) < 0) goto cleanup; - /* We need to differentiate two cases: - * a) updating an existing domain - must preserve previous definition - * so we can roll back if something fails - * b) defining a brand new domain - virDomainObjListAdd is just sufficient - */ - if ((vm = virDomainObjListFindByUUID(driver->domains, def->uuid))) { - if (virDomainObjIsActive(vm)) { - def_backup = vm->newDef; - vm->newDef = def; - } else { - def_backup = vm->def; - vm->def = def; - } - } else { - if (!(vm = virDomainObjListAdd(driver->domains, - driver->caps, - def, false))) { - goto cleanup; - } - } + if (!(vm = virDomainObjListAdd(driver->domains, + driver->caps, + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + &oldDef))) + goto cleanup; + def = NULL; if (virDomainHasDiskMirror(vm)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", @@ -5652,14 +5633,15 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (virDomainSaveConfig(cfg->configDir, vm->newDef ? vm->newDef : vm->def) < 0) { - if (def_backup) { + if (oldDef) { /* There is backup so this VM was defined before. * Just restore the backup. */ VIR_INFO("Restoring domain '%s' definition", vm->def->name); if (virDomainObjIsActive(vm)) - vm->newDef = def_backup; + vm->newDef = oldDef; else - vm->def = def_backup; + vm->def = oldDef; + oldDef = NULL; } else { /* Brand new domain. Remove it */ VIR_INFO("Deleting domain '%s'", vm->def->name); @@ -5667,13 +5649,11 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { vm = NULL; } goto cleanup; - } else { - virDomainDefFree(def_backup); } event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED, - !dupVM ? + !oldDef ? VIR_DOMAIN_EVENT_DEFINED_ADDED : VIR_DOMAIN_EVENT_DEFINED_UPDATED); @@ -5682,6 +5662,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (dom) dom->id = vm->def->id; cleanup: + virDomainDefFree(oldDef); virDomainDefFree(def); if (vm) virObjectUnlock(vm); @@ -12592,9 +12573,6 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, if (!(caps = qemuCapsCacheLookup(driver->capsCache, def->emulator))) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (qemuCanonicalizeMachine(def, caps) < 0) goto cleanup; @@ -12603,7 +12581,10 @@ static virDomainPtr qemuDomainAttach(virConnectPtr conn, if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 5e10876..c59a540 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1639,15 +1639,14 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, } } - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, true))) { - /* virDomainAssignDef already set the error */ + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; - } + def = NULL; priv = vm->privateData; priv->origname = origname; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index c4685b7..a81f042 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -566,7 +566,7 @@ static int testOpenDefault(virConnectPtr conn) { goto error; if (!(domobj = virDomainObjListAdd(privconn->domains, privconn->caps, - domdef, false))) + domdef, 0, NULL))) goto error; domdef = NULL; @@ -911,7 +911,7 @@ static int testOpenFromFile(virConnectPtr conn, if (testDomainGenerateIfnames(def) < 0 || !(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, false))) { + def, 0, NULL))) { virDomainDefFree(def); goto error; } @@ -1308,14 +1308,13 @@ testDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) - goto cleanup; - if (testDomainGenerateIfnames(def) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -1925,14 +1924,14 @@ testDomainRestoreFlags(virConnectPtr conn, if (!def) goto cleanup; - if (virDomainObjListIsDuplicate(privconn->domains, def, 1) < 0) - goto cleanup; - if (testDomainGenerateIfnames(def) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, true))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -2465,7 +2464,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, virDomainDefPtr def; virDomainObjPtr dom = NULL; virDomainEventPtr event = NULL; - int dupVM; + virDomainDefPtr oldDef = NULL; testDriverLock(privconn); if ((def = virDomainDefParseString(privconn->caps, xml, @@ -2473,21 +2472,20 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if ((dupVM = virDomainObjListIsDuplicate(privconn->domains, def, 0)) < 0) - goto cleanup; - if (testDomainGenerateIfnames(def) < 0) goto cleanup; if (!(dom = virDomainObjListAdd(privconn->domains, privconn->caps, - def, false))) + def, + 0, + &oldDef))) goto cleanup; def = NULL; dom->persistent = 1; event = virDomainEventNewFromObj(dom, VIR_DOMAIN_EVENT_DEFINED, - !dupVM ? + !oldDef ? VIR_DOMAIN_EVENT_DEFINED_ADDED : VIR_DOMAIN_EVENT_DEFINED_UPDATED); @@ -2497,6 +2495,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn, cleanup: virDomainDefFree(def); + virDomainDefFree(oldDef); if (dom) virObjectUnlock(dom); if (event) diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 6702a7e..fc6bb29 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1497,12 +1497,11 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 1) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; def = NULL; @@ -1919,12 +1918,10 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) { VIR_DOMAIN_XML_INACTIVE))) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, def, 0) < 0) - goto cleanup; - if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - def, false))) + def, + 0, NULL))) goto cleanup; def = NULL; vm->persistent = 1; diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index b616c1b..1afd372 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -179,7 +179,7 @@ vmwareLoadDomains(struct vmware_driver *driver) if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, false))) + vmdef, 0, NULL))) goto cleanup; pDomain = vm->privateData; diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index b99fca3..8684f56 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -320,9 +320,6 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0) - goto cleanup; - /* generate vmx file */ vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7); if (vmx == NULL) @@ -341,7 +338,7 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) /* assign def */ if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, false))) + vmdef, 0, NULL))) goto cleanup; pDomain = vm->privateData; @@ -592,9 +589,6 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, VIR_DOMAIN_XML_INACTIVE)) == NULL) goto cleanup; - if (virDomainObjListIsDuplicate(driver->domains, vmdef, 1) < 0) - goto cleanup; - /* generate vmx file */ vmx = virVMXFormatConfig(&ctx, driver->caps, vmdef, 7); if (vmx == NULL) @@ -613,7 +607,9 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, /* assign def */ if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, false))) + vmdef, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; pDomain = vm->privateData; -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Switch virDomainObjList to inherit from virObjectLockable and make all the APIs acquire/release the mutex when running. This makes virDomainObjList completely self-locking and no longer reliant on the hypervisor driver locks --- src/conf/domain_conf.c | 75 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 02fcd84..31467d5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -60,7 +60,7 @@ verify(VIR_DOMAIN_VIRT_LAST <= 32); struct _virDomainObjList { - virObject parent; + virObjectLockable parent; /* uuid string -> virDomainObj mapping * for O(1), lockless lookup-by-uuid */ @@ -717,7 +717,7 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1; - if (!(virDomainObjListClass = virClassNew(virClassForObject(), + if (!(virDomainObjListClass = virClassNew(virClassForObjectLockable(), "virDomainObjList", sizeof(virDomainObjList), virDomainObjListDispose))) @@ -842,9 +842,11 @@ virDomainObjPtr virDomainObjListFindByID(const virDomainObjListPtr doms, int id) { virDomainObjPtr obj; + virObjectLock(doms); obj = virHashSearch(doms->objs, virDomainObjListSearchID, &id); if (obj) virObjectLock(obj); + virObjectUnlock(doms); return obj; } @@ -855,11 +857,13 @@ virDomainObjPtr virDomainObjListFindByUUID(const virDomainObjListPtr doms, char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainObjPtr obj; + virObjectLock(doms); virUUIDFormat(uuid, uuidstr); obj = virHashLookup(doms->objs, uuidstr); if (obj) virObjectLock(obj); + virObjectUnlock(doms); return obj; } @@ -881,9 +885,11 @@ virDomainObjPtr virDomainObjListFindByName(const virDomainObjListPtr doms, const char *name) { virDomainObjPtr obj; + virObjectLock(doms); obj = virHashSearch(doms->objs, virDomainObjListSearchName, name); if (obj) virObjectLock(obj); + virObjectUnlock(doms); return obj; } @@ -1882,25 +1888,32 @@ void virDomainObjAssignDef(virDomainObjPtr domain, * current def is Live * */ -virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, - virCapsPtr caps, - const virDomainDefPtr def, - unsigned int flags, - virDomainDefPtr *oldDef) +static virDomainObjPtr +virDomainObjListAddLocked(virDomainObjListPtr doms, + virCapsPtr caps, + const virDomainDefPtr def, + unsigned int flags, + virDomainDefPtr *oldDef) { virDomainObjPtr vm; char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (oldDef) *oldDef = false; + virUUIDFormat(def->uuid, uuidstr); + /* See if a VM with matching UUID already exists */ - if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) { + if ((vm = virHashLookup(doms->objs, uuidstr))) { + virObjectLock(vm); /* UUID matches, but if names don't match, refuse it */ if (STRNEQ(vm->def->name, def->name)) { virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' is already defined with uuid %s"), vm->def->name, uuidstr); + virObjectUnlock(vm); + vm = NULL; goto cleanup; } @@ -1910,6 +1923,8 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virReportError(VIR_ERR_OPERATION_INVALID, _("domain is already active as '%s'"), vm->def->name); + virObjectUnlock(vm); + vm = NULL; goto cleanup; } } @@ -1936,12 +1951,11 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, } } else { /* UUID does not match, but if a name matches, refuse it */ - if ((vm = virDomainObjListFindByName(doms, def->name))) { + if ((vm = virHashSearch(doms->objs, virDomainObjListSearchName, def->name))) { virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), def->name, uuidstr); - virObjectUnlock(vm); vm = NULL; goto cleanup; } @@ -1960,6 +1974,21 @@ cleanup: return vm; } + +virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, + virCapsPtr caps, + const virDomainDefPtr def, + unsigned int flags, + virDomainDefPtr *oldDef) +{ + virDomainObjPtr ret; + + virObjectLock(doms); + ret = virDomainObjListAddLocked(doms, caps, def, flags, oldDef); + virObjectUnlock(doms); + return ret; +} + /* * Mark the running VM config as transient. Ensures transient hotplug * operations do not persist past shutdown. @@ -2078,11 +2107,14 @@ void virDomainObjListRemove(virDomainObjListPtr doms, virDomainObjPtr dom) { char uuidstr[VIR_UUID_STRING_BUFLEN]; + + virObjectLock(doms); virUUIDFormat(dom->def->uuid, uuidstr); virObjectUnlock(dom); virHashRemoveEntry(doms->objs, uuidstr); + virObjectUnlock(doms); } @@ -14863,6 +14895,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, virDomainObjPtr dom; int autostart; int newVM = 1; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if ((configFile = virDomainConfigFile(configDir, name)) == NULL) goto error; @@ -14879,7 +14912,10 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, /* if the domain is already in our hashtable, we only need to * update the autostart flag */ - if ((dom = virDomainObjListFindByUUID(doms, def->uuid))) { + virUUIDFormat(def->uuid, uuidstr); + + if ((dom = virHashLookup(doms->objs, uuidstr))) { + virObjectLock(dom); dom->autostart = autostart; if (virDomainObjIsActive(dom) && @@ -14894,7 +14930,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, return dom; } - if (!(dom = virDomainObjListAdd(doms, caps, def, 0, NULL))) + if (!(dom = virDomainObjListAddLocked(doms, caps, def, 0, NULL))) goto error; dom->autostart = autostart; @@ -14982,6 +15018,8 @@ int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, return -1; } + virObjectLock(doms); + while ((entry = readdir(dir))) { virDomainObjPtr dom; @@ -15019,7 +15057,7 @@ int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, } closedir(dir); - + virObjectUnlock(doms); return 0; } @@ -15144,10 +15182,12 @@ static void virDomainObjListCountInactive(void *payload, const void *name ATTRIB int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active) { int count = 0; + virObjectLock(doms); if (active) virHashForEach(doms->objs, virDomainObjListCountActive, &count); else virHashForEach(doms->objs, virDomainObjListCountInactive, &count); + virObjectUnlock(doms); return count; } @@ -15172,7 +15212,9 @@ int virDomainObjListGetActiveIDs(virDomainObjListPtr doms, int maxids) { struct virDomainIDData data = { 0, maxids, ids }; + virObjectLock(doms); virHashForEach(doms->objs, virDomainObjListCopyActiveIDs, &data); + virObjectUnlock(doms); return data.numids; } @@ -15208,7 +15250,9 @@ int virDomainObjListGetInactiveNames(virDomainObjListPtr doms, { struct virDomainNameData data = { 0, 0, maxnames, names }; int i; + virObjectLock(doms); virHashForEach(doms->objs, virDomainObjListCopyInactiveNames, &data); + virObjectUnlock(doms); if (data.oom) { virReportOOMError(); goto cleanup; @@ -15244,8 +15288,9 @@ int virDomainObjListForEach(virDomainObjListPtr doms, struct virDomainListIterData data = { callback, opaque, 0, }; + virObjectLock(doms); virHashForEach(doms->objs, virDomainObjListHelper, &data); - + virObjectUnlock(doms); return data.ret; } @@ -16008,6 +16053,7 @@ virDomainObjListExport(virDomainObjListPtr doms, struct virDomainListData data = { conn, NULL, flags, 0, false }; + virObjectLock(doms); if (domains) { if (VIR_ALLOC_N(data.domains, virHashSize(doms->objs) + 1) < 0) { virReportOOMError(); @@ -16037,6 +16083,7 @@ cleanup: } VIR_FREE(data.domains); + virObjectUnlock(doms); return ret; } -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Although the nwfilter driver skips startup when running in a session libvirtd, it did not skip reload or shutdown. This caused errors to be reported when sending SIGHUP to libvirtd --- src/conf/nwfilter_conf.h | 1 + src/nwfilter/nwfilter_driver.c | 31 +++++++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h index 8c5a6ac..b4573f5 100644 --- a/src/conf/nwfilter_conf.h +++ b/src/conf/nwfilter_conf.h @@ -557,6 +557,7 @@ typedef struct _virNWFilterDriverState virNWFilterDriverState; typedef virNWFilterDriverState *virNWFilterDriverStatePtr; struct _virNWFilterDriverState { virMutex lock; + bool privileged; virNWFilterObjList nwfilters; diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index b67b704..19ebb03 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -165,7 +165,7 @@ nwfilterDriverInstallDBusMatches(DBusConnection *sysbus ATTRIBUTE_UNUSED) * Initialization function for the QEmu daemon */ static int -nwfilterDriverStartup(bool privileged ATTRIBUTE_UNUSED, +nwfilterDriverStartup(bool privileged, virStateInhibitCallback callback ATTRIBUTE_UNUSED, void *opaque ATTRIBUTE_UNUSED) { @@ -185,6 +185,7 @@ nwfilterDriverStartup(bool privileged ATTRIBUTE_UNUSED, goto err_free_driverstate; driverState->watchingFirewallD = (sysbus != NULL); + driverState->privileged = privileged; if (!privileged) return 0; @@ -275,6 +276,9 @@ nwfilterDriverReload(void) { return -1; } + if (!driverState->privileged) + return 0; + conn = virConnectOpen("qemu:///system"); if (conn) { @@ -333,21 +337,24 @@ nwfilterDriverShutdown(void) { if (!driverState) return -1; - virNWFilterConfLayerShutdown(); - virNWFilterTechDriversShutdown(); - virNWFilterDHCPSnoopShutdown(); - virNWFilterLearnShutdown(); - virNWFilterIPAddrMapShutdown(); + if (driverState->privileged) { + virNWFilterConfLayerShutdown(); + virNWFilterTechDriversShutdown(); + virNWFilterDHCPSnoopShutdown(); + virNWFilterLearnShutdown(); + virNWFilterIPAddrMapShutdown(); - nwfilterDriverLock(driverState); + nwfilterDriverLock(driverState); - nwfilterDriverRemoveDBusMatches(); + nwfilterDriverRemoveDBusMatches(); - /* free inactive nwfilters */ - virNWFilterObjListFree(&driverState->nwfilters); + /* free inactive nwfilters */ + virNWFilterObjListFree(&driverState->nwfilters); + + VIR_FREE(driverState->configDir); + nwfilterDriverUnlock(driverState); + } - VIR_FREE(driverState->configDir); - nwfilterDriverUnlock(driverState); virMutexDestroy(&driverState->lock); VIR_FREE(driverState); -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Use atomic ops to increment nextvmid and encapsulate it in a methd to prevent accidental non-atomic access --- src/qemu/qemu_conf.c | 6 ++++++ src/qemu/qemu_conf.h | 2 ++ src/qemu/qemu_process.c | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 26011c7..6cf2fad 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -52,6 +52,7 @@ #include "domain_nwfilter.h" #include "virfile.h" #include "virstring.h" +#include "viratomic.h" #include "configmake.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -780,3 +781,8 @@ qemuRemoveSharedDisk(virHashTablePtr sharedDisks, VIR_FREE(key); return 0; } + +int qemuDriverAllocateID(virQEMUDriverPtr driver) +{ + return virAtomicIntInc(&driver->nextvmid); +} diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index a96ff76..1cc277f 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -260,4 +260,6 @@ int qemuRemoveSharedDisk(virHashTablePtr sharedDisks, char * qemuGetSharedDiskKey(const char *disk_path) ATTRIBUTE_NONNULL(1); +int qemuDriverAllocateID(virQEMUDriverPtr driver); + #endif /* __QEMUD_CONF_H */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 8f76dde..9c9038b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3569,7 +3569,7 @@ int qemuProcessStart(virConnectPtr conn, if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0) goto cleanup; - vm->def->id = driver->nextvmid++; + vm->def->id = qemuDriverAllocateID(driver); qemuDomainSetFakeReboot(driver, vm, false); virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_UNKNOWN); @@ -4421,7 +4421,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0) goto cleanup; - vm->def->id = driver->nextvmid++; + vm->def->id = qemuDriverAllocateID(driver); if (!driver->nactive && driver->inhibitCallback) driver->inhibitCallback(true, driver->inhibitOpaque); -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> The QEMU driver struct has a 'qemuVersion' field that was previously used to cache the version lookup from capabilities. With the recent QEMU capabilities rewrite the caching happens at a lower level so this field is pointless. Removing it avoids worries about locking when updating it. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/qemu/qemu_conf.h | 2 -- src/qemu/qemu_driver.c | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 1cc277f..2b27a3e 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -158,8 +158,6 @@ struct _virQEMUDriver { virThreadPoolPtr workerPool; - unsigned int qemuVersion; - int nextvmid; virCgroupPtr cgroup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 603c4fa..e2c6d07 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1502,14 +1502,15 @@ cleanup: static int qemuGetVersion(virConnectPtr conn, unsigned long *version) { virQEMUDriverPtr driver = conn->privateData; int ret = -1; + unsigned int qemuVersion; qemuDriverLock(driver); if (qemuCapsGetDefaultVersion(driver->caps, driver->capsCache, - &driver->qemuVersion) < 0) + &qemuVersion) < 0) goto cleanup; - *version = driver->qemuVersion; + *version = qemuVersion; ret = 0; cleanup: -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Rename all the pciDeviceXXX and pciXXXDevice APIs to have a fixed virPCIDevice name prefix --- src/conf/node_device_conf.c | 1 - src/conf/node_device_conf.h | 5 +- src/libvirt_private.syms | 74 ++-- src/network/bridge_driver.c | 2 +- src/node_device/node_device_udev.c | 4 +- src/qemu/qemu_agent.c | 1 - src/qemu/qemu_conf.h | 5 +- src/qemu/qemu_driver.c | 52 +-- src/qemu/qemu_hostdev.c | 244 ++++++------- src/qemu/qemu_hostdev.h | 2 +- src/qemu/qemu_hotplug.c | 18 +- src/security/security_apparmor.c | 17 +- src/security/security_dac.c | 32 +- src/security/security_selinux.c | 30 +- src/security/virt-aa-helper.c | 10 +- src/util/virnetdev.c | 34 +- src/util/virnetdev.h | 2 +- src/util/virpci.c | 676 ++++++++++++++++++------------------- src/util/virpci.h | 174 +++++----- src/xen/xen_driver.c | 24 +- 20 files changed, 709 insertions(+), 698 deletions(-) diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index 53b6af2..af89fe3 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -36,7 +36,6 @@ #include "virutil.h" #include "virbuffer.h" #include "viruuid.h" -#include "virpci.h" #include "virrandom.h" #define VIR_FROM_THIS VIR_FROM_NODEDEV diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h index 12c36d8..03380df 100644 --- a/src/conf/node_device_conf.h +++ b/src/conf/node_device_conf.h @@ -28,6 +28,7 @@ # include "internal.h" # include "virutil.h" # include "virthread.h" +# include "virpci.h" # include <libxml/tree.h> @@ -111,8 +112,8 @@ struct _virNodeDevCapsDef { unsigned int class; char *product_name; char *vendor_name; - struct pci_config_address *physical_function; - struct pci_config_address **virtual_functions; + virPCIDeviceAddressPtr physical_function; + virPCIDeviceAddressPtr *virtual_functions; unsigned int num_virtual_functions; unsigned int flags; } pci_dev; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 17c35e1..dc9de46 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -989,43 +989,43 @@ virNWFilterVarValueGetSimple; # pci.h -pciConfigAddressToSysfsFile; -pciDettachDevice; -pciDeviceFileIterate; -pciDeviceGetManaged; -pciDeviceGetName; -pciDeviceGetRemoveSlot; -pciDeviceGetReprobe; -pciDeviceGetUnbindFromStub; -pciDeviceGetUsedBy; -pciDeviceGetVirtualFunctionInfo; -pciDeviceIsAssignable; -pciDeviceIsVirtualFunction; -pciDeviceListAdd; -pciDeviceListCount; -pciDeviceListDel; -pciDeviceListFind; -pciDeviceListFindIndex; -pciDeviceListFree; -pciDeviceListGet; -pciDeviceListNew; -pciDeviceListSteal; -pciDeviceListStealIndex; -pciDeviceNetName; -pciDeviceReAttachInit; -pciDeviceSetManaged; -pciDeviceSetRemoveSlot; -pciDeviceSetReprobe; -pciDeviceSetUnbindFromStub; -pciDeviceSetUsedBy; -pciFreeDevice; -pciGetDevice; -pciGetPhysicalFunction; -pciGetVirtualFunctionIndex; -pciGetVirtualFunctions; -pciReAttachDevice; -pciResetDevice; -pciWaitForDeviceCleanup; +virPCIDeviceAddressGetSysfsFile; +virPCIDeviceDettach; +virPCIDeviceFileIterate; +virPCIDeviceFree; +virPCIDeviceGetManaged; +virPCIDeviceGetName; +virPCIDeviceGetRemoveSlot; +virPCIDeviceGetReprobe; +virPCIDeviceGetUnbindFromStub; +virPCIDeviceGetUsedBy; +virPCIDeviceIsAssignable; +virPCIDeviceListAdd; +virPCIDeviceListCount; +virPCIDeviceListDel; +virPCIDeviceListFind; +virPCIDeviceListFindIndex; +virPCIDeviceListFree; +virPCIDeviceListGet; +virPCIDeviceListNew; +virPCIDeviceListSteal; +virPCIDeviceListStealIndex; +virPCIDeviceNew; +virPCIDeviceReAttach; +virPCIDeviceReAttachInit; +virPCIDeviceReset; +virPCIDeviceSetManaged; +virPCIDeviceSetRemoveSlot; +virPCIDeviceSetReprobe; +virPCIDeviceSetUnbindFromStub; +virPCIDeviceSetUsedBy; +virPCIDeviceWaitForCleanup; +virPCIGetNetName; +virPCIGetPhysicalFunction; +virPCIGetVirtualFunctionIndex; +virPCIGetVirtualFunctionInfo; +virPCIGetVirtualFunctions; +virPCIIsVirtualFunction; # secret_conf.h diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 268dada..942c17f 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3621,7 +3621,7 @@ static int networkCreateInterfacePool(virNetworkDefPtr netdef) { unsigned int num_virt_fns = 0; char **vfname = NULL; - struct pci_config_address **virt_fns; + virPCIDeviceAddressPtr *virt_fns; int ret = -1, ii = 0; if ((virNetDevGetVirtualFunctions(netdef->forward.pfs->dev, diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index a9b30b2..566e7ab 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -481,10 +481,10 @@ static int udevProcessPCI(struct udev_device *device, goto out; } - if (!pciGetPhysicalFunction(syspath, &data->pci_dev.physical_function)) + if (!virPCIGetPhysicalFunction(syspath, &data->pci_dev.physical_function)) data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION; - if (!pciGetVirtualFunctions(syspath, &data->pci_dev.virtual_functions, + if (!virPCIGetVirtualFunctions(syspath, &data->pci_dev.virtual_functions, &data->pci_dev.num_virtual_functions) || data->pci_dev.num_virtual_functions > 0) data->pci_dev.flags |= VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION; diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index ae54228..05641da 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -33,7 +33,6 @@ #include <sys/time.h> #include "qemu_agent.h" -#include "qemu_command.h" #include "viralloc.h" #include "virlog.h" #include "virerror.h" diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 2b27a3e..be45cf0 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -181,11 +181,10 @@ struct _virQEMUDriver { virSecurityManagerPtr securityManager; - pciDeviceList *activePciHostdevs; + virPCIDeviceListPtr activePciHostdevs; + virPCIDeviceListPtr inactivePciHostdevs; usbDeviceList *activeUsbHostdevs; - pciDeviceList *inactivePciHostdevs; - virHashTablePtr sharedDisks; virPortAllocatorPtr remotePorts; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e2c6d07..d36f2c0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -781,13 +781,13 @@ qemuStartup(bool privileged, if (!qemu_driver->capsCache) goto error; - if ((qemu_driver->activePciHostdevs = pciDeviceListNew()) == NULL) + if ((qemu_driver->activePciHostdevs = virPCIDeviceListNew()) == NULL) goto error; if ((qemu_driver->activeUsbHostdevs = usbDeviceListNew()) == NULL) goto error; - if ((qemu_driver->inactivePciHostdevs = pciDeviceListNew()) == NULL) + if ((qemu_driver->inactivePciHostdevs = virPCIDeviceListNew()) == NULL) goto error; if (!(qemu_driver->sharedDisks = virHashCreate(30, NULL))) @@ -1048,8 +1048,8 @@ qemuShutdown(void) { qemuDriverLock(qemu_driver); virNWFilterUnRegisterCallbackDriver(&qemuCallbackDriver); - pciDeviceListFree(qemu_driver->activePciHostdevs); - pciDeviceListFree(qemu_driver->inactivePciHostdevs); + virPCIDeviceListFree(qemu_driver->activePciHostdevs); + virPCIDeviceListFree(qemu_driver->inactivePciHostdevs); usbDeviceListFree(qemu_driver->activeUsbHostdevs); virHashFree(qemu_driver->sharedDisks); virCapabilitiesFree(qemu_driver->caps); @@ -10023,7 +10023,7 @@ static int qemuNodeDeviceDettach(virNodeDevicePtr dev) { virQEMUDriverPtr driver = dev->conn->privateData; - pciDevice *pci; + virPCIDevicePtr pci; unsigned domain, bus, slot, function; int ret = -1; bool in_inactive_list = false; @@ -10031,22 +10031,22 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) if (qemuNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; qemuDriverLock(driver); - in_inactive_list = pciDeviceListFind(driver->inactivePciHostdevs, pci); + in_inactive_list = virPCIDeviceListFind(driver->inactivePciHostdevs, pci); - if (pciDettachDevice(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs, "pci-stub") < 0) + if (virPCIDeviceDettach(pci, driver->activePciHostdevs, + driver->inactivePciHostdevs, "pci-stub") < 0) goto out; ret = 0; out: qemuDriverUnlock(driver); if (in_inactive_list) - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } @@ -10054,43 +10054,43 @@ static int qemuNodeDeviceReAttach(virNodeDevicePtr dev) { virQEMUDriverPtr driver = dev->conn->privateData; - pciDevice *pci; - pciDevice *other; + virPCIDevicePtr pci; + virPCIDevicePtr other; unsigned domain, bus, slot, function; int ret = -1; if (qemuNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; - other = pciDeviceListFind(driver->activePciHostdevs, pci); + other = virPCIDeviceListFind(driver->activePciHostdevs, pci); if (other) { - const char *other_name = pciDeviceGetUsedBy(other); + const char *other_name = virPCIDeviceGetUsedBy(other); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is still in use by domain %s"), - pciDeviceGetName(pci), other_name); + virPCIDeviceGetName(pci), other_name); else virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is still in use"), - pciDeviceGetName(pci)); + virPCIDeviceGetName(pci)); } - pciDeviceReAttachInit(pci); + virPCIDeviceReAttachInit(pci); qemuDriverLock(driver); - if (pciReAttachDevice(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs, "pci-stub") < 0) + if (virPCIDeviceReAttach(pci, driver->activePciHostdevs, + driver->inactivePciHostdevs, "pci-stub") < 0) goto out; ret = 0; out: qemuDriverUnlock(driver); - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } @@ -10098,27 +10098,27 @@ static int qemuNodeDeviceReset(virNodeDevicePtr dev) { virQEMUDriverPtr driver = dev->conn->privateData; - pciDevice *pci; + virPCIDevicePtr pci; unsigned domain, bus, slot, function; int ret = -1; if (qemuNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; qemuDriverLock(driver); - if (pciResetDevice(pci, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) + if (virPCIDeviceReset(pci, driver->activePciHostdevs, + driver->inactivePciHostdevs) < 0) goto out; ret = 0; out: qemuDriverUnlock(driver); - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1b8a9cd..b5d7c5e 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -33,84 +33,84 @@ #define VIR_FROM_THIS VIR_FROM_QEMU -static pciDeviceList * +static virPCIDeviceListPtr qemuGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) { - pciDeviceList *list; + virPCIDeviceListPtr list; int i; - if (!(list = pciDeviceListNew())) + if (!(list = virPCIDeviceListNew())) return NULL; for (i = 0 ; i < nhostdevs ; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; - pciDevice *dev; + virPCIDevicePtr dev; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; - dev = pciGetDevice(hostdev->source.subsys.u.pci.domain, - hostdev->source.subsys.u.pci.bus, - hostdev->source.subsys.u.pci.slot, - hostdev->source.subsys.u.pci.function); + dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.domain, + hostdev->source.subsys.u.pci.bus, + hostdev->source.subsys.u.pci.slot, + hostdev->source.subsys.u.pci.function); if (!dev) { - pciDeviceListFree(list); + virPCIDeviceListFree(list); return NULL; } - if (pciDeviceListAdd(list, dev) < 0) { - pciFreeDevice(dev); - pciDeviceListFree(list); + if (virPCIDeviceListAdd(list, dev) < 0) { + virPCIDeviceFree(dev); + virPCIDeviceListFree(list); return NULL; } - pciDeviceSetManaged(dev, hostdev->managed); + virPCIDeviceSetManaged(dev, hostdev->managed); } return list; } -static pciDeviceList * +static virPCIDeviceListPtr qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { - pciDeviceList *list; + virPCIDeviceListPtr list; int i; - if (!(list = pciDeviceListNew())) + if (!(list = virPCIDeviceListNew())) return NULL; for (i = 0 ; i < nhostdevs ; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; - pciDevice *dev; - pciDevice *activeDev; + virPCIDevicePtr dev; + virPCIDevicePtr activeDev; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; - dev = pciGetDevice(hostdev->source.subsys.u.pci.domain, - hostdev->source.subsys.u.pci.bus, - hostdev->source.subsys.u.pci.slot, - hostdev->source.subsys.u.pci.function); + dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.domain, + hostdev->source.subsys.u.pci.bus, + hostdev->source.subsys.u.pci.slot, + hostdev->source.subsys.u.pci.function); if (!dev) { - pciDeviceListFree(list); + virPCIDeviceListFree(list); return NULL; } - if ((activeDev = pciDeviceListFind(driver->activePciHostdevs, dev))) { - if (pciDeviceListAdd(list, activeDev) < 0) { - pciFreeDevice(dev); - pciDeviceListFree(list); + if ((activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev))) { + if (virPCIDeviceListAdd(list, activeDev) < 0) { + virPCIDeviceFree(dev); + virPCIDeviceListFree(list); return NULL; } } - pciFreeDevice(dev); + virPCIDeviceFree(dev); } return list; @@ -126,7 +126,7 @@ int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, return 0; for (i = 0; i < def->nhostdevs; i++) { - pciDevice *dev = NULL; + virPCIDevicePtr dev = NULL; hostdev = def->hostdevs[i]; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -134,24 +134,24 @@ int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; - dev = pciGetDevice(hostdev->source.subsys.u.pci.domain, - hostdev->source.subsys.u.pci.bus, - hostdev->source.subsys.u.pci.slot, - hostdev->source.subsys.u.pci.function); + dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.domain, + hostdev->source.subsys.u.pci.bus, + hostdev->source.subsys.u.pci.slot, + hostdev->source.subsys.u.pci.function); if (!dev) return -1; - pciDeviceSetManaged(dev, hostdev->managed); - pciDeviceSetUsedBy(dev, def->name); + virPCIDeviceSetManaged(dev, hostdev->managed); + virPCIDeviceSetUsedBy(dev, def->name); /* Setup the original states for the PCI device */ - pciDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub); - pciDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot); - pciDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe); + virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub); + virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot); + virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe); - if (pciDeviceListAdd(driver->activePciHostdevs, dev) < 0) { - pciFreeDevice(dev); + if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) { + virPCIDeviceFree(dev); return -1; } } @@ -203,14 +203,14 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, static int qemuDomainHostdevPciSysfsPath(virDomainHostdevDefPtr hostdev, char **sysfs_path) { - struct pci_config_address config_address; + virPCIDeviceAddress config_address; config_address.domain = hostdev->source.subsys.u.pci.domain; config_address.bus = hostdev->source.subsys.u.pci.bus; config_address.slot = hostdev->source.subsys.u.pci.slot; config_address.function = hostdev->source.subsys.u.pci.function; - return pciConfigAddressToSysfsFile(&config_address, sysfs_path); + return virPCIDeviceAddressGetSysfsFile(&config_address, sysfs_path); } int @@ -222,7 +222,7 @@ qemuDomainHostdevIsVirtualFunction(virDomainHostdevDefPtr hostdev) if (qemuDomainHostdevPciSysfsPath(hostdev, &sysfs_path) < 0) return ret; - ret = pciDeviceIsVirtualFunction(sysfs_path); + ret = virPCIIsVirtualFunction(sysfs_path); VIR_FREE(sysfs_path); @@ -239,12 +239,12 @@ qemuDomainHostdevNetDevice(virDomainHostdevDefPtr hostdev, char **linkdev, if (qemuDomainHostdevPciSysfsPath(hostdev, &sysfs_path) < 0) return ret; - if (pciDeviceIsVirtualFunction(sysfs_path) == 1) { - if (pciDeviceGetVirtualFunctionInfo(sysfs_path, linkdev, - vf) < 0) + if (virPCIIsVirtualFunction(sysfs_path) == 1) { + if (virPCIGetVirtualFunctionInfo(sysfs_path, linkdev, + vf) < 0) goto cleanup; } else { - if (pciDeviceNetName(sysfs_path, linkdev) < 0) + if (virPCIGetNetName(sysfs_path, linkdev) < 0) goto cleanup; *vf = -1; } @@ -406,7 +406,7 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { - pciDeviceList *pcidevs; + virPCIDeviceListPtr pcidevs; int last_processed_hostdev_vf = -1; int i; int ret = -1; @@ -427,48 +427,48 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, * to pci-stub.ko */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - pciDevice *other; + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + virPCIDevicePtr other; - if (!pciDeviceIsAssignable(dev, !cfg->relaxedACS)) { + if (!virPCIDeviceIsAssignable(dev, !cfg->relaxedACS)) { virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is not assignable"), - pciDeviceGetName(dev)); + virPCIDeviceGetName(dev)); goto cleanup; } /* The device is in use by other active domain if * the dev is in list driver->activePciHostdevs. */ - if ((other = pciDeviceListFind(driver->activePciHostdevs, dev))) { - const char *other_name = pciDeviceGetUsedBy(other); + if ((other = virPCIDeviceListFind(driver->activePciHostdevs, dev))) { + const char *other_name = virPCIDeviceGetUsedBy(other); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is in use by domain %s"), - pciDeviceGetName(dev), other_name); + virPCIDeviceGetName(dev), other_name); else virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is already in use"), - pciDeviceGetName(dev)); + virPCIDeviceGetName(dev)); goto cleanup; } } /* Loop 2: detach managed devices */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - if (pciDeviceGetManaged(dev) && - pciDettachDevice(dev, driver->activePciHostdevs, NULL, "pci-stub") < 0) + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + if (virPCIDeviceGetManaged(dev) && + virPCIDeviceDettach(dev, driver->activePciHostdevs, NULL, "pci-stub") < 0) goto reattachdevs; } /* Loop 3: Now that all the PCI hostdevs have been detached, we * can safely reset them */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - if (pciResetDevice(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + if (virPCIDeviceReset(dev, driver->activePciHostdevs, + driver->inactivePciHostdevs) < 0) goto reattachdevs; } @@ -491,35 +491,35 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, } /* Loop 5: Now mark all the devices as active */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - if (pciDeviceListAdd(driver->activePciHostdevs, dev) < 0) + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) goto inactivedevs; } /* Loop 6: Now remove the devices from inactive list. */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - pciDeviceListDel(driver->inactivePciHostdevs, dev); + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + virPCIDeviceListDel(driver->inactivePciHostdevs, dev); } /* Loop 7: Now set the used_by_domain of the device in * driver->activePciHostdevs as domain name. */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev, *activeDev; + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev, activeDev; - dev = pciDeviceListGet(pcidevs, i); - activeDev = pciDeviceListFind(driver->activePciHostdevs, dev); + dev = virPCIDeviceListGet(pcidevs, i); + activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev); if (activeDev) - pciDeviceSetUsedBy(activeDev, name); + virPCIDeviceSetUsedBy(activeDev, name); } /* Loop 8: Now set the original states for hostdev def */ for (i = 0; i < nhostdevs; i++) { - pciDevice *dev; - pciDevice *pcidev; + virPCIDevicePtr dev; + virPCIDevicePtr pcidev; virDomainHostdevDefPtr hostdev = hostdevs[i]; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -527,41 +527,41 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) continue; - dev = pciGetDevice(hostdev->source.subsys.u.pci.domain, - hostdev->source.subsys.u.pci.bus, - hostdev->source.subsys.u.pci.slot, - hostdev->source.subsys.u.pci.function); + dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.domain, + hostdev->source.subsys.u.pci.bus, + hostdev->source.subsys.u.pci.slot, + hostdev->source.subsys.u.pci.function); /* original states "unbind_from_stub", "remove_slot", * "reprobe" were already set by pciDettachDevice in * loop 2. */ - if ((pcidev = pciDeviceListFind(pcidevs, dev))) { + if ((pcidev = virPCIDeviceListFind(pcidevs, dev))) { hostdev->origstates.states.pci.unbind_from_stub = - pciDeviceGetUnbindFromStub(pcidev); + virPCIDeviceGetUnbindFromStub(pcidev); hostdev->origstates.states.pci.remove_slot = - pciDeviceGetRemoveSlot(pcidev); + virPCIDeviceGetRemoveSlot(pcidev); hostdev->origstates.states.pci.reprobe = - pciDeviceGetReprobe(pcidev); + virPCIDeviceGetReprobe(pcidev); } - pciFreeDevice(dev); + virPCIDeviceFree(dev); } /* Loop 9: Now steal all the devices from pcidevs */ - while (pciDeviceListCount(pcidevs) > 0) - pciDeviceListStealIndex(pcidevs, 0); + while (virPCIDeviceListCount(pcidevs) > 0) + virPCIDeviceListStealIndex(pcidevs, 0); ret = 0; goto cleanup; inactivedevs: /* Only steal all the devices from driver->activePciHostdevs. We will - * free them in pciDeviceListFree(). + * free them in virPCIDeviceListFree(). */ - while (pciDeviceListCount(pcidevs) > 0) { - pciDevice *dev = pciDeviceListGet(pcidevs, 0); - pciDeviceListSteal(driver->activePciHostdevs, dev); + while (virPCIDeviceListCount(pcidevs) > 0) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, 0); + virPCIDeviceListSteal(driver->activePciHostdevs, dev); } resetvfnetconfig: @@ -574,13 +574,13 @@ resetvfnetconfig: } reattachdevs: - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - pciReAttachDevice(dev, driver->activePciHostdevs, NULL, "pci-stub"); + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + virPCIDeviceReAttach(dev, driver->activePciHostdevs, NULL, "pci-stub"); } cleanup: - pciDeviceListFree(pcidevs); + virPCIDeviceListFree(pcidevs); virObjectUnref(cfg); return ret; } @@ -813,33 +813,33 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, } -void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr driver) +void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) { int retries = 100; /* If the device is not managed and was attached to guest * successfully, it must have been inactive. */ - if (!pciDeviceGetManaged(dev)) { - if (pciDeviceListAdd(driver->inactivePciHostdevs, dev) < 0) - pciFreeDevice(dev); + if (!virPCIDeviceGetManaged(dev)) { + if (virPCIDeviceListAdd(driver->inactivePciHostdevs, dev) < 0) + virPCIDeviceFree(dev); return; } - while (pciWaitForDeviceCleanup(dev, "kvm_assigned_device") + while (virPCIDeviceWaitForCleanup(dev, "kvm_assigned_device") && retries) { usleep(100*1000); retries--; } - if (pciReAttachDevice(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs, "pci-stub") < 0) { + if (virPCIDeviceReAttach(dev, driver->activePciHostdevs, + driver->inactivePciHostdevs, "pci-stub") < 0) { virErrorPtr err = virGetLastError(); VIR_ERROR(_("Failed to re-attach PCI device: %s"), err ? err->message : _("unknown error")); virResetError(err); } - pciFreeDevice(dev); + virPCIDeviceFree(dev); } @@ -848,7 +848,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, virDomainHostdevDefPtr *hostdevs, int nhostdevs) { - pciDeviceList *pcidevs; + virPCIDeviceListPtr pcidevs; int i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); @@ -856,7 +856,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, hostdevs, nhostdevs))) { virErrorPtr err = virGetLastError(); - VIR_ERROR(_("Failed to allocate pciDeviceList: %s"), + VIR_ERROR(_("Failed to allocate virPCIDeviceList: %s"), err ? err->message : _("unknown error")); virResetError(err); goto cleanup; @@ -866,22 +866,22 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, * them and reset all the devices before re-attach. * Attach mac and port profile parameters to devices */ - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - pciDevice *activeDev = NULL; + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + virPCIDevicePtr activeDev = NULL; /* Never delete the dev from list driver->activePciHostdevs * if it's used by other domain. */ - activeDev = pciDeviceListFind(driver->activePciHostdevs, dev); + activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev); if (activeDev && - STRNEQ_NULLABLE(name, pciDeviceGetUsedBy(activeDev))) { - pciDeviceListSteal(pcidevs, dev); + STRNEQ_NULLABLE(name, virPCIDeviceGetUsedBy(activeDev))) { + virPCIDeviceListSteal(pcidevs, dev); continue; } - /* pciDeviceListFree() will take care of freeing the dev. */ - pciDeviceListSteal(driver->activePciHostdevs, dev); + /* virPCIDeviceListFree() will take care of freeing the dev. */ + virPCIDeviceListSteal(driver->activePciHostdevs, dev); } /* @@ -900,10 +900,10 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, } } - for (i = 0; i < pciDeviceListCount(pcidevs); i++) { - pciDevice *dev = pciDeviceListGet(pcidevs, i); - if (pciResetDevice(dev, driver->activePciHostdevs, - driver->inactivePciHostdevs) < 0) { + for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { + virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); + if (virPCIDeviceReset(dev, driver->activePciHostdevs, + driver->inactivePciHostdevs) < 0) { virErrorPtr err = virGetLastError(); VIR_ERROR(_("Failed to reset PCI device: %s"), err ? err->message : _("unknown error")); @@ -911,12 +911,12 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, } } - while (pciDeviceListCount(pcidevs) > 0) { - pciDevice *dev = pciDeviceListStealIndex(pcidevs, 0); + while (virPCIDeviceListCount(pcidevs) > 0) { + virPCIDevicePtr dev = virPCIDeviceListStealIndex(pcidevs, 0); qemuReattachPciDevice(dev, driver); } - pciDeviceListFree(pcidevs); + virPCIDeviceListFree(pcidevs); cleanup: virObjectUnref(cfg); } diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 9ef2385..8bfd36f 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -45,7 +45,7 @@ int qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, bool coldBoot); -void qemuReattachPciDevice(pciDevice *dev, virQEMUDriverPtr driver); +void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver); void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, const char *name, virDomainHostdevDefPtr *hostdevs, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 77e9745..2fc8b00 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2307,8 +2307,8 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv = vm->privateData; virDomainHostdevSubsysPtr subsys = &detach->source.subsys; int ret = -1, rv; - pciDevice *pci; - pciDevice *activePci; + virPCIDevicePtr pci; + virPCIDevicePtr activePci; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); if (qemuIsMultiFunctionDevice(vm->def, detach->info)) { @@ -2344,20 +2344,20 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, if (detach->parent.data.net) qemuDomainHostdevNetConfigRestore(detach, cfg->stateDir); - pci = pciGetDevice(subsys->u.pci.domain, subsys->u.pci.bus, - subsys->u.pci.slot, subsys->u.pci.function); + pci = virPCIDeviceNew(subsys->u.pci.domain, subsys->u.pci.bus, + subsys->u.pci.slot, subsys->u.pci.function); if (pci) { - activePci = pciDeviceListSteal(driver->activePciHostdevs, pci); + activePci = virPCIDeviceListSteal(driver->activePciHostdevs, pci); if (activePci && - pciResetDevice(activePci, driver->activePciHostdevs, - driver->inactivePciHostdevs) == 0) { + virPCIDeviceReset(activePci, driver->activePciHostdevs, + driver->inactivePciHostdevs) == 0) { qemuReattachPciDevice(activePci, driver); ret = 0; } else { /* reset of the device failed, treat it as if it was returned */ - pciFreeDevice(activePci); + virPCIDeviceFree(activePci); } - pciFreeDevice(pci); + virPCIDeviceFree(pci); } if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) && diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index 7331c91..a635a1b 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -327,8 +327,8 @@ AppArmorSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, } static int -AppArmorSetSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, - const char *file, void *opaque) +AppArmorSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, + const char *file, void *opaque) { struct SDPDOP *ptr = opaque; virDomainDefPtr def = ptr->def; @@ -782,16 +782,17 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice(dev->source.subsys.u.pci.domain, - dev->source.subsys.u.pci.bus, - dev->source.subsys.u.pci.slot, - dev->source.subsys.u.pci.function); + virPCIDevicePtr pci = + virPCIDeviceNew(dev->source.subsys.u.pci.domain, + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function); if (!pci) goto done; - ret = pciDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, AppArmorSetSecurityPCILabel, ptr); + virPCIDeviceFree(pci); break; } diff --git a/src/security/security_dac.c b/src/security/security_dac.c index deff024..e42d049 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -434,7 +434,7 @@ virSecurityDACRestoreSecurityImageLabel(virSecurityManagerPtr mgr, static int -virSecurityDACSetSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecurityDACSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { @@ -507,17 +507,18 @@ virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice(dev->source.subsys.u.pci.domain, - dev->source.subsys.u.pci.bus, - dev->source.subsys.u.pci.slot, - dev->source.subsys.u.pci.function); + virPCIDevicePtr pci = + virPCIDeviceNew(dev->source.subsys.u.pci.domain, + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function); if (!pci) goto done; - ret = pciDeviceFileIterate(pci, virSecurityDACSetSecurityPCILabel, - params); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, virSecurityDACSetSecurityPCILabel, + params); + virPCIDeviceFree(pci); break; } @@ -533,7 +534,7 @@ done: static int -virSecurityDACRestoreSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecurityDACRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque ATTRIBUTE_UNUSED) { @@ -586,16 +587,17 @@ virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice(dev->source.subsys.u.pci.domain, - dev->source.subsys.u.pci.bus, - dev->source.subsys.u.pci.slot, - dev->source.subsys.u.pci.function); + virPCIDevicePtr pci = + virPCIDeviceNew(dev->source.subsys.u.pci.domain, + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function); if (!pci) goto done; - ret = pciDeviceFileIterate(pci, virSecurityDACRestoreSecurityPCILabel, mgr); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, virSecurityDACRestoreSecurityPCILabel, mgr); + virPCIDeviceFree(pci); break; } diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index b5e1a9a..8b1692c 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1132,7 +1132,7 @@ virSecuritySELinuxSetSecurityImageLabel(virSecurityManagerPtr mgr, static int -virSecuritySELinuxSetSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { virSecurityLabelDefPtr secdef; @@ -1186,16 +1186,17 @@ virSecuritySELinuxSetSecurityHostdevSubsysLabel(virDomainDefPtr def, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice(dev->source.subsys.u.pci.domain, - dev->source.subsys.u.pci.bus, - dev->source.subsys.u.pci.slot, - dev->source.subsys.u.pci.function); + virPCIDevicePtr pci = + virPCIDeviceNew(dev->source.subsys.u.pci.domain, + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function); if (!pci) goto done; - ret = pciDeviceFileIterate(pci, virSecuritySELinuxSetSecurityPCILabel, def); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, virSecuritySELinuxSetSecurityPCILabel, def); + virPCIDeviceFree(pci); break; } @@ -1299,7 +1300,7 @@ virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN static int -virSecuritySELinuxRestoreSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque ATTRIBUTE_UNUSED) { @@ -1342,16 +1343,17 @@ virSecuritySELinuxRestoreSecurityHostdevSubsysLabel(virDomainHostdevDefPtr dev, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice(dev->source.subsys.u.pci.domain, - dev->source.subsys.u.pci.bus, - dev->source.subsys.u.pci.slot, - dev->source.subsys.u.pci.function); + virPCIDevicePtr pci = + virPCIDeviceNew(dev->source.subsys.u.pci.domain, + dev->source.subsys.u.pci.bus, + dev->source.subsys.u.pci.slot, + dev->source.subsys.u.pci.function); if (!pci) goto done; - ret = pciDeviceFileIterate(pci, virSecuritySELinuxRestoreSecurityPCILabel, NULL); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, virSecuritySELinuxRestoreSecurityPCILabel, NULL); + virPCIDeviceFree(pci); break; } diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 0aa978e..227d0f1 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -853,8 +853,8 @@ file_iterate_hostdev_cb(usbDevice *dev ATTRIBUTE_UNUSED, } static int -file_iterate_pci_cb(pciDevice *dev ATTRIBUTE_UNUSED, - const char *file, void *opaque) +file_iterate_pci_cb(virPCIDevicePtr dev ATTRIBUTE_UNUSED, + const char *file, void *opaque) { virBufferPtr buf = opaque; return vah_add_file(buf, file, "rw"); @@ -1022,7 +1022,7 @@ get_files(vahControl * ctl) } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: { - pciDevice *pci = pciGetDevice( + virPCIDevicePtr pci = virPCIDeviceNew( dev->source.subsys.u.pci.domain, dev->source.subsys.u.pci.bus, dev->source.subsys.u.pci.slot, @@ -1031,8 +1031,8 @@ get_files(vahControl * ctl) if (pci == NULL) continue; - rc = pciDeviceFileIterate(pci, file_iterate_pci_cb, &buf); - pciFreeDevice(pci); + rc = virPCIDeviceFileIterate(pci, file_iterate_pci_cb, &buf); + virPCIDeviceFree(pci); break; } diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 7ffd3c2..72fe257 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -980,7 +980,7 @@ virNetDevSysfsDeviceFile(char **pf_sysfs_device_link, const char *ifname, int virNetDevGetVirtualFunctions(const char *pfname, char ***vfname, - struct pci_config_address ***virt_fns, + virPCIDeviceAddressPtr **virt_fns, unsigned int *n_vfname) { int ret = -1, i; @@ -991,8 +991,8 @@ virNetDevGetVirtualFunctions(const char *pfname, if (virNetDevSysfsFile(&pf_sysfs_device_link, pfname, "device") < 0) return ret; - if (pciGetVirtualFunctions(pf_sysfs_device_link, virt_fns, - n_vfname) < 0) + if (virPCIGetVirtualFunctions(pf_sysfs_device_link, virt_fns, + n_vfname) < 0) goto cleanup; if (VIR_ALLOC_N(*vfname, *n_vfname) < 0) { @@ -1002,22 +1002,22 @@ virNetDevGetVirtualFunctions(const char *pfname, for (i = 0; i < *n_vfname; i++) { - if (pciGetDeviceAddrString((*virt_fns)[i]->domain, - (*virt_fns)[i]->bus, - (*virt_fns)[i]->slot, - (*virt_fns)[i]->function, - &pciConfigAddr) < 0) { + if (virPCIGetAddrString((*virt_fns)[i]->domain, + (*virt_fns)[i]->bus, + (*virt_fns)[i]->slot, + (*virt_fns)[i]->function, + &pciConfigAddr) < 0) { virReportSystemError(ENOSYS, "%s", _("Failed to get PCI Config Address String")); goto cleanup; } - if (pciSysfsFile(pciConfigAddr, &pci_sysfs_device_link) < 0) { + if (virPCIGetSysfsFile(pciConfigAddr, &pci_sysfs_device_link) < 0) { virReportSystemError(ENOSYS, "%s", _("Failed to get PCI SYSFS file")); goto cleanup; } - if (pciDeviceNetName(pci_sysfs_device_link, &((*vfname)[i])) < 0) { + if (virPCIGetNetName(pci_sysfs_device_link, &((*vfname)[i])) < 0) { VIR_INFO("VF does not have an interface name"); } } @@ -1053,7 +1053,7 @@ virNetDevIsVirtualFunction(const char *ifname) if (virNetDevSysfsFile(&if_sysfs_device_link, ifname, "device") < 0) return ret; - ret = pciDeviceIsVirtualFunction(if_sysfs_device_link); + ret = virPCIIsVirtualFunction(if_sysfs_device_link); VIR_FREE(if_sysfs_device_link); @@ -1086,9 +1086,9 @@ virNetDevGetVirtualFunctionIndex(const char *pfname, const char *vfname, return ret; } - ret = pciGetVirtualFunctionIndex(pf_sysfs_device_link, - vf_sysfs_device_link, - vf_index); + ret = virPCIGetVirtualFunctionIndex(pf_sysfs_device_link, + vf_sysfs_device_link, + vf_index); VIR_FREE(pf_sysfs_device_link); VIR_FREE(vf_sysfs_device_link); @@ -1115,7 +1115,7 @@ virNetDevGetPhysicalFunction(const char *ifname, char **pfname) if (virNetDevSysfsDeviceFile(&physfn_sysfs_path, ifname, "physfn") < 0) return ret; - ret = pciDeviceNetName(physfn_sysfs_path, pfname); + ret = virPCIGetNetName(physfn_sysfs_path, pfname); VIR_FREE(physfn_sysfs_path); @@ -1149,7 +1149,7 @@ virNetDevGetVirtualFunctionInfo(const char *vfname, char **pfname, if (virNetDevSysfsFile(&vf_sysfs_path, vfname, "device") < 0) goto cleanup; - ret = pciGetVirtualFunctionIndex(pf_sysfs_path, vf_sysfs_path, vf); + ret = virPCIGetVirtualFunctionIndex(pf_sysfs_path, vf_sysfs_path, vf); cleanup: if (ret < 0) @@ -1165,7 +1165,7 @@ cleanup: int virNetDevGetVirtualFunctions(const char *pfname ATTRIBUTE_UNUSED, char ***vfname ATTRIBUTE_UNUSED, - struct pci_config_address ***virt_fns ATTRIBUTE_UNUSED, + virPCIDeviceAddressPtr **virt_fns ATTRIBUTE_UNUSED, unsigned int *n_vfname ATTRIBUTE_UNUSED) { virReportSystemError(ENOSYS, "%s", diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h index d588e89..06d0650 100644 --- a/src/util/virnetdev.h +++ b/src/util/virnetdev.h @@ -104,7 +104,7 @@ int virNetDevGetPhysicalFunction(const char *ifname, char **pfname) int virNetDevGetVirtualFunctions(const char *pfname, char ***vfname, - struct pci_config_address ***virt_fns, + virPCIDeviceAddressPtr **virt_fns, unsigned int *n_vfname) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4) ATTRIBUTE_RETURN_CHECK; diff --git a/src/util/virpci.c b/src/util/virpci.c index 0fb9923..695f372 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -50,7 +50,7 @@ #define SRIOV_NOT_FOUND 1 #define SRIOV_ERROR -1 -struct _pciDevice { +struct _virPCIDevice { unsigned domain; unsigned bus; unsigned slot; @@ -73,9 +73,9 @@ struct _pciDevice { unsigned reprobe : 1; }; -struct _pciDeviceList { +struct _virPCIDeviceList { unsigned count; - pciDevice **devs; + virPCIDevicePtr *devs; }; @@ -160,13 +160,13 @@ struct _pciDeviceList { #define PCI_EXT_CAP_ACS_RR 0x04 #define PCI_EXT_CAP_ACS_CR 0x08 #define PCI_EXT_CAP_ACS_UF 0x10 -#define PCI_EXT_CAP_ACS_ENABLED (PCI_EXT_CAP_ACS_SV | \ - PCI_EXT_CAP_ACS_RR | \ - PCI_EXT_CAP_ACS_CR | \ +#define PCI_EXT_CAP_ACS_ENABLED (PCI_EXT_CAP_ACS_SV | \ + PCI_EXT_CAP_ACS_RR | \ + PCI_EXT_CAP_ACS_CR | \ PCI_EXT_CAP_ACS_UF) static int -pciConfigOpen(pciDevice *dev, bool fatal) +virPCIDeviceConfigOpen(virPCIDevicePtr dev, bool fatal) { int fd; @@ -190,7 +190,7 @@ pciConfigOpen(pciDevice *dev, bool fatal) } static void -pciConfigClose(pciDevice *dev, int cfgfd) +virPCIDeviceConfigClose(virPCIDevicePtr dev, int cfgfd) { if (VIR_CLOSE(cfgfd) < 0) { char ebuf[1024]; @@ -201,11 +201,11 @@ pciConfigClose(pciDevice *dev, int cfgfd) static int -pciRead(pciDevice *dev, - int cfgfd, - unsigned pos, - uint8_t *buf, - unsigned buflen) +virPCIDeviceRead(virPCIDevicePtr dev, + int cfgfd, + unsigned pos, + uint8_t *buf, + unsigned buflen) { memset(buf, 0, buflen); @@ -220,35 +220,35 @@ pciRead(pciDevice *dev, } static uint8_t -pciRead8(pciDevice *dev, int cfgfd, unsigned pos) +virPCIDeviceRead8(virPCIDevicePtr dev, int cfgfd, unsigned pos) { uint8_t buf; - pciRead(dev, cfgfd, pos, &buf, sizeof(buf)); + virPCIDeviceRead(dev, cfgfd, pos, &buf, sizeof(buf)); return buf; } static uint16_t -pciRead16(pciDevice *dev, int cfgfd, unsigned pos) +virPCIDeviceRead16(virPCIDevicePtr dev, int cfgfd, unsigned pos) { uint8_t buf[2]; - pciRead(dev, cfgfd, pos, &buf[0], sizeof(buf)); + virPCIDeviceRead(dev, cfgfd, pos, &buf[0], sizeof(buf)); return (buf[0] << 0) | (buf[1] << 8); } static uint32_t -pciRead32(pciDevice *dev, int cfgfd, unsigned pos) +virPCIDeviceRead32(virPCIDevicePtr dev, int cfgfd, unsigned pos) { uint8_t buf[4]; - pciRead(dev, cfgfd, pos, &buf[0], sizeof(buf)); + virPCIDeviceRead(dev, cfgfd, pos, &buf[0], sizeof(buf)); return (buf[0] << 0) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); } static int -pciWrite(pciDevice *dev, - int cfgfd, - unsigned pos, - uint8_t *buf, - unsigned buflen) +virPCIDeviceWrite(virPCIDevicePtr dev, + int cfgfd, + unsigned pos, + uint8_t *buf, + unsigned buflen) { if (lseek(cfgfd, pos, SEEK_SET) != pos || safewrite(cfgfd, buf, buflen) != buflen) { @@ -261,20 +261,20 @@ pciWrite(pciDevice *dev, } static void -pciWrite16(pciDevice *dev, int cfgfd, unsigned pos, uint16_t val) +virPCIDeviceWrite16(virPCIDevicePtr dev, int cfgfd, unsigned pos, uint16_t val) { uint8_t buf[2] = { (val >> 0), (val >> 8) }; - pciWrite(dev, cfgfd, pos, &buf[0], sizeof(buf)); + virPCIDeviceWrite(dev, cfgfd, pos, &buf[0], sizeof(buf)); } static void -pciWrite32(pciDevice *dev, int cfgfd, unsigned pos, uint32_t val) +virPCIDeviceWrite32(virPCIDevicePtr dev, int cfgfd, unsigned pos, uint32_t val) { uint8_t buf[4] = { (val >> 0), (val >> 8), (val >> 16), (val >> 24) }; - pciWrite(dev, cfgfd, pos, &buf[0], sizeof(buf)); + virPCIDeviceWrite(dev, cfgfd, pos, &buf[0], sizeof(buf)); } -typedef int (*pciIterPredicate)(pciDevice *, pciDevice *, void *); +typedef int (*virPCIDeviceIterPredicate)(virPCIDevicePtr , virPCIDevicePtr , void *); /* Iterate over available PCI devices calling @predicate * to compare each one to @dev. @@ -282,10 +282,10 @@ typedef int (*pciIterPredicate)(pciDevice *, pciDevice *, void *); * safe to reset if there is an error. */ static int -pciIterDevices(pciIterPredicate predicate, - pciDevice *dev, - pciDevice **matched, - void *data) +virPCIDeviceIterDevices(virPCIDeviceIterPredicate predicate, + virPCIDevicePtr dev, + virPCIDevicePtr *matched, + void *data) { DIR *dir; struct dirent *entry; @@ -304,7 +304,7 @@ pciIterDevices(pciIterPredicate predicate, while ((entry = readdir(dir))) { unsigned int domain, bus, slot, function; - pciDevice *check; + virPCIDevicePtr check; char *tmp; /* Ignore '.' and '..' */ @@ -324,7 +324,7 @@ pciIterDevices(pciIterPredicate predicate, continue; } - check = pciGetDevice(domain, bus, slot, function); + check = virPCIDeviceNew(domain, bus, slot, function); if (!check) { ret = -1; break; @@ -333,7 +333,7 @@ pciIterDevices(pciIterPredicate predicate, rc = predicate(dev, check, data); if (rc < 0) { /* the predicate returned an error, bail */ - pciFreeDevice(check); + virPCIDeviceFree(check); ret = -1; break; } @@ -344,23 +344,23 @@ pciIterDevices(pciIterPredicate predicate, break; } - pciFreeDevice(check); + virPCIDeviceFree(check); } closedir(dir); return ret; } static uint8_t -pciFindCapabilityOffset(pciDevice *dev, int cfgfd, unsigned capability) +virPCIDeviceFindCapabilityOffset(virPCIDevicePtr dev, int cfgfd, unsigned capability) { uint16_t status; uint8_t pos; - status = pciRead16(dev, cfgfd, PCI_STATUS); + status = virPCIDeviceRead16(dev, cfgfd, PCI_STATUS); if (!(status & PCI_STATUS_CAP_LIST)) return 0; - pos = pciRead8(dev, cfgfd, PCI_CAPABILITY_LIST); + pos = virPCIDeviceRead8(dev, cfgfd, PCI_CAPABILITY_LIST); /* Zero indicates last capability, capabilities can't * be in the config space header and 0xff is returned @@ -370,14 +370,14 @@ pciFindCapabilityOffset(pciDevice *dev, int cfgfd, unsigned capability) * capabilities here. */ while (pos >= PCI_CONF_HEADER_LEN && pos != 0xff) { - uint8_t capid = pciRead8(dev, cfgfd, pos); + uint8_t capid = virPCIDeviceRead8(dev, cfgfd, pos); if (capid == capability) { VIR_DEBUG("%s %s: found cap 0x%.2x at 0x%.2x", dev->id, dev->name, capability, pos); return pos; } - pos = pciRead8(dev, cfgfd, pos + 1); + pos = virPCIDeviceRead8(dev, cfgfd, pos + 1); } VIR_DEBUG("%s %s: failed to find cap 0x%.2x", dev->id, dev->name, capability); @@ -386,9 +386,9 @@ pciFindCapabilityOffset(pciDevice *dev, int cfgfd, unsigned capability) } static unsigned int -pciFindExtendedCapabilityOffset(pciDevice *dev, - int cfgfd, - unsigned capability) +virPCIDeviceFindExtendedCapabilityOffset(virPCIDevicePtr dev, + int cfgfd, + unsigned capability) { int ttl; unsigned int pos; @@ -399,7 +399,7 @@ pciFindExtendedCapabilityOffset(pciDevice *dev, pos = PCI_EXT_CAP_BASE; while (ttl > 0 && pos >= PCI_EXT_CAP_BASE) { - header = pciRead32(dev, cfgfd, pos); + header = virPCIDeviceRead32(dev, cfgfd, pos); if ((header & PCI_EXT_CAP_ID_MASK) == capability) return pos; @@ -415,7 +415,7 @@ pciFindExtendedCapabilityOffset(pciDevice *dev, * not have FLR, 1 if it does, and -1 on error */ static int -pciDetectFunctionLevelReset(pciDevice *dev, int cfgfd) +virPCIDeviceDetectFunctionLevelReset(virPCIDevicePtr dev, int cfgfd) { uint32_t caps; uint8_t pos; @@ -429,7 +429,7 @@ pciDetectFunctionLevelReset(pciDevice *dev, int cfgfd) * on SR-IOV NICs at the moment. */ if (dev->pcie_cap_pos) { - caps = pciRead32(dev, cfgfd, dev->pcie_cap_pos + PCI_EXP_DEVCAP); + caps = virPCIDeviceRead32(dev, cfgfd, dev->pcie_cap_pos + PCI_EXP_DEVCAP); if (caps & PCI_EXP_DEVCAP_FLR) { VIR_DEBUG("%s %s: detected PCIe FLR capability", dev->id, dev->name); return 1; @@ -440,9 +440,9 @@ pciDetectFunctionLevelReset(pciDevice *dev, int cfgfd) * the same thing, except for conventional PCI * devices. This is not common yet. */ - pos = pciFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_AF); + pos = virPCIDeviceFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_AF); if (pos) { - caps = pciRead16(dev, cfgfd, pos + PCI_AF_CAP); + caps = virPCIDeviceRead16(dev, cfgfd, pos + PCI_AF_CAP); if (caps & PCI_AF_CAP_FLR) { VIR_DEBUG("%s %s: detected PCI FLR capability", dev->id, dev->name); return 1; @@ -478,13 +478,13 @@ pciDetectFunctionLevelReset(pciDevice *dev, int cfgfd) * internal reset, not just a soft reset. */ static unsigned -pciDetectPowerManagementReset(pciDevice *dev, int cfgfd) +virPCIDeviceDetectPowerManagementReset(virPCIDevicePtr dev, int cfgfd) { if (dev->pci_pm_cap_pos) { uint32_t ctl; /* require the NO_SOFT_RESET bit is clear */ - ctl = pciRead32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL); + ctl = virPCIDeviceRead32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL); if (!(ctl & PCI_PM_CTRL_NO_SOFT_RESET)) { VIR_DEBUG("%s %s: detected PM reset capability", dev->id, dev->name); return 1; @@ -498,9 +498,9 @@ pciDetectPowerManagementReset(pciDevice *dev, int cfgfd) /* Any active devices on the same domain/bus ? */ static int -pciSharesBusWithActive(pciDevice *dev, pciDevice *check, void *data) +virPCIDeviceSharesBusWithActive(virPCIDevicePtr dev, virPCIDevicePtr check, void *data) { - pciDeviceList *inactiveDevs = data; + virPCIDeviceList *inactiveDevs = data; /* Different domain, different bus, or simply identical device */ if (dev->domain != check->domain || @@ -510,51 +510,51 @@ pciSharesBusWithActive(pciDevice *dev, pciDevice *check, void *data) return 0; /* same bus, but inactive, i.e. about to be assigned to guest */ - if (inactiveDevs && pciDeviceListFind(inactiveDevs, check)) + if (inactiveDevs && virPCIDeviceListFind(inactiveDevs, check)) return 0; return 1; } -static pciDevice * -pciBusContainsActiveDevices(pciDevice *dev, - pciDeviceList *inactiveDevs) +static virPCIDevicePtr +virPCIDeviceBusContainsActiveDevices(virPCIDevicePtr dev, + virPCIDeviceList *inactiveDevs) { - pciDevice *active = NULL; - if (pciIterDevices(pciSharesBusWithActive, - dev, &active, inactiveDevs) < 0) + virPCIDevicePtr active = NULL; + if (virPCIDeviceIterDevices(virPCIDeviceSharesBusWithActive, + dev, &active, inactiveDevs) < 0) return NULL; return active; } /* Is @check the parent of @dev ? */ static int -pciIsParent(pciDevice *dev, pciDevice *check, void *data) +virPCIDeviceIsParent(virPCIDevicePtr dev, virPCIDevicePtr check, void *data) { uint16_t device_class; uint8_t header_type, secondary, subordinate; - pciDevice **best = data; + virPCIDevicePtr *best = data; int ret = 0; int fd; if (dev->domain != check->domain) return 0; - if ((fd = pciConfigOpen(check, false)) < 0) + if ((fd = virPCIDeviceConfigOpen(check, false)) < 0) return 0; /* Is it a bridge? */ - device_class = pciRead16(check, fd, PCI_CLASS_DEVICE); + device_class = virPCIDeviceRead16(check, fd, PCI_CLASS_DEVICE); if (device_class != PCI_CLASS_BRIDGE_PCI) goto cleanup; /* Is it a plane? */ - header_type = pciRead8(check, fd, PCI_HEADER_TYPE); + header_type = virPCIDeviceRead8(check, fd, PCI_HEADER_TYPE); if ((header_type & PCI_HEADER_TYPE_MASK) != PCI_HEADER_TYPE_BRIDGE) goto cleanup; - secondary = pciRead8(check, fd, PCI_SECONDARY_BUS); - subordinate = pciRead8(check, fd, PCI_SUBORDINATE_BUS); + secondary = virPCIDeviceRead8(check, fd, PCI_SECONDARY_BUS); + subordinate = virPCIDeviceRead8(check, fd, PCI_SUBORDINATE_BUS); VIR_DEBUG("%s %s: found parent device %s", dev->id, dev->name, check->name); @@ -572,8 +572,8 @@ pciIsParent(pciDevice *dev, pciDevice *check, void *data) */ if (dev->bus > secondary && dev->bus <= subordinate) { if (*best == NULL) { - *best = pciGetDevice(check->domain, check->bus, check->slot, - check->function); + *best = virPCIDeviceNew(check->domain, check->bus, check->slot, + check->function); if (*best == NULL) { ret = -1; goto cleanup; @@ -586,15 +586,15 @@ pciIsParent(pciDevice *dev, pciDevice *check, void *data) int bestfd; uint8_t best_secondary; - if ((bestfd = pciConfigOpen(*best, false)) < 0) + if ((bestfd = virPCIDeviceConfigOpen(*best, false)) < 0) goto cleanup; - best_secondary = pciRead8(*best, bestfd, PCI_SECONDARY_BUS); - pciConfigClose(*best, bestfd); + best_secondary = virPCIDeviceRead8(*best, bestfd, PCI_SECONDARY_BUS); + virPCIDeviceConfigClose(*best, bestfd); if (secondary > best_secondary) { - pciFreeDevice(*best); - *best = pciGetDevice(check->domain, check->bus, check->slot, - check->function); + virPCIDeviceFree(*best); + *best = virPCIDeviceNew(check->domain, check->bus, check->slot, + check->function); if (*best == NULL) { ret = -1; goto cleanup; @@ -604,20 +604,20 @@ pciIsParent(pciDevice *dev, pciDevice *check, void *data) } cleanup: - pciConfigClose(check, fd); + virPCIDeviceConfigClose(check, fd); return ret; } static int -pciGetParentDevice(pciDevice *dev, pciDevice **parent) +virPCIDeviceGetParentDevice(virPCIDevicePtr dev, virPCIDevicePtr *parent) { - pciDevice *best = NULL; + virPCIDevicePtr best = NULL; int ret; *parent = NULL; - ret = pciIterDevices(pciIsParent, dev, parent, &best); + ret = virPCIDeviceIterDevices(virPCIDeviceIsParent, dev, parent, &best); if (ret == 1) - pciFreeDevice(best); + virPCIDeviceFree(best); else if (ret == 0) *parent = best; return ret; @@ -627,11 +627,11 @@ pciGetParentDevice(pciDevice *dev, pciDevice **parent) * devices behind a bus. */ static int -pciTrySecondaryBusReset(pciDevice *dev, - int cfgfd, - pciDeviceList *inactiveDevs) +virPCIDeviceTrySecondaryBusReset(virPCIDevicePtr dev, + int cfgfd, + virPCIDeviceList *inactiveDevs) { - pciDevice *parent, *conflict; + virPCIDevicePtr parent, conflict; uint8_t config_space[PCI_CONF_LEN]; uint16_t ctl; int ret = -1; @@ -641,7 +641,7 @@ pciTrySecondaryBusReset(pciDevice *dev, * devices/functions behind the bus are used by the host * or other guests. */ - if ((conflict = pciBusContainsActiveDevices(dev, inactiveDevs))) { + if ((conflict = virPCIDeviceBusContainsActiveDevices(dev, inactiveDevs))) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Active %s devices on bus with %s, not doing bus reset"), conflict->name, dev->name); @@ -649,7 +649,7 @@ pciTrySecondaryBusReset(pciDevice *dev, } /* Find the parent bus */ - if (pciGetParentDevice(dev, &parent) < 0) + if (virPCIDeviceGetParentDevice(dev, &parent) < 0) return -1; if (!parent) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -657,7 +657,7 @@ pciTrySecondaryBusReset(pciDevice *dev, dev->name); return -1; } - if ((parentfd = pciConfigOpen(parent, true)) < 0) + if ((parentfd = virPCIDeviceConfigOpen(parent, true)) < 0) goto out; VIR_DEBUG("%s %s: doing a secondary bus reset", dev->id, dev->name); @@ -666,7 +666,7 @@ pciTrySecondaryBusReset(pciDevice *dev, * for the supplied device since we refuse to do a reset if there * are multiple devices/functions */ - if (pciRead(dev, cfgfd, 0, config_space, PCI_CONF_LEN) < 0) { + if (virPCIDeviceRead(dev, cfgfd, 0, config_space, PCI_CONF_LEN) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to read PCI config space for %s"), dev->name); @@ -676,18 +676,18 @@ pciTrySecondaryBusReset(pciDevice *dev, /* Read the control register, set the reset flag, wait 200ms, * unset the reset flag and wait 200ms. */ - ctl = pciRead16(dev, cfgfd, PCI_BRIDGE_CONTROL); + ctl = virPCIDeviceRead16(dev, cfgfd, PCI_BRIDGE_CONTROL); - pciWrite16(parent, parentfd, PCI_BRIDGE_CONTROL, - ctl | PCI_BRIDGE_CTL_RESET); + virPCIDeviceWrite16(parent, parentfd, PCI_BRIDGE_CONTROL, + ctl | PCI_BRIDGE_CTL_RESET); usleep(200 * 1000); /* sleep 200ms */ - pciWrite16(parent, parentfd, PCI_BRIDGE_CONTROL, ctl); + virPCIDeviceWrite16(parent, parentfd, PCI_BRIDGE_CONTROL, ctl); usleep(200 * 1000); /* sleep 200ms */ - if (pciWrite(dev, cfgfd, 0, config_space, PCI_CONF_LEN) < 0) { + if (virPCIDeviceWrite(dev, cfgfd, 0, config_space, PCI_CONF_LEN) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to restore PCI config space for %s"), dev->name); @@ -696,8 +696,8 @@ pciTrySecondaryBusReset(pciDevice *dev, ret = 0; out: - pciConfigClose(parent, parentfd); - pciFreeDevice(parent); + virPCIDeviceConfigClose(parent, parentfd); + virPCIDeviceFree(parent); return ret; } @@ -706,7 +706,7 @@ out: * above we require the device supports a full internal reset. */ static int -pciTryPowerManagementReset(pciDevice *dev, int cfgfd) +virPCIDeviceTryPowerManagementReset(virPCIDevicePtr dev, int cfgfd) { uint8_t config_space[PCI_CONF_LEN]; uint32_t ctl; @@ -715,7 +715,7 @@ pciTryPowerManagementReset(pciDevice *dev, int cfgfd) return -1; /* Save and restore the device's config space. */ - if (pciRead(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) { + if (virPCIDeviceRead(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to read PCI config space for %s"), dev->name); @@ -724,20 +724,20 @@ pciTryPowerManagementReset(pciDevice *dev, int cfgfd) VIR_DEBUG("%s %s: doing a power management reset", dev->id, dev->name); - ctl = pciRead32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL); + ctl = virPCIDeviceRead32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL); ctl &= ~PCI_PM_CTRL_STATE_MASK; - pciWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL, - ctl | PCI_PM_CTRL_STATE_D3hot); + virPCIDeviceWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL, + ctl | PCI_PM_CTRL_STATE_D3hot); usleep(10 * 1000); /* sleep 10ms */ - pciWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL, - ctl | PCI_PM_CTRL_STATE_D0); + virPCIDeviceWrite32(dev, cfgfd, dev->pci_pm_cap_pos + PCI_PM_CTRL, + ctl | PCI_PM_CTRL_STATE_D0); usleep(10 * 1000); /* sleep 10ms */ - if (pciWrite(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) { + if (virPCIDeviceWrite(dev, cfgfd, 0, &config_space[0], PCI_CONF_LEN) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to restore PCI config space for %s"), dev->name); @@ -748,39 +748,39 @@ pciTryPowerManagementReset(pciDevice *dev, int cfgfd) } static int -pciInitDevice(pciDevice *dev, int cfgfd) +virPCIDeviceInitDevice(virPCIDevicePtr dev, int cfgfd) { int flr; - dev->pcie_cap_pos = pciFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_EXP); - dev->pci_pm_cap_pos = pciFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_PM); - flr = pciDetectFunctionLevelReset(dev, cfgfd); + dev->pcie_cap_pos = virPCIDeviceFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_EXP); + dev->pci_pm_cap_pos = virPCIDeviceFindCapabilityOffset(dev, cfgfd, PCI_CAP_ID_PM); + flr = virPCIDeviceDetectFunctionLevelReset(dev, cfgfd); if (flr < 0) return flr; dev->has_flr = flr; - dev->has_pm_reset = pciDetectPowerManagementReset(dev, cfgfd); + dev->has_pm_reset = virPCIDeviceDetectPowerManagementReset(dev, cfgfd); return 0; } int -pciResetDevice(pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs) +virPCIDeviceReset(virPCIDevicePtr dev, + virPCIDeviceList *activeDevs, + virPCIDeviceList *inactiveDevs) { int ret = -1; int fd; - if (activeDevs && pciDeviceListFind(activeDevs, dev)) { + if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Not resetting active device %s"), dev->name); return -1; } - if ((fd = pciConfigOpen(dev, true)) < 0) + if ((fd = virPCIDeviceConfigOpen(dev, true)) < 0) return -1; - if (pciInitDevice(dev, fd) < 0) + if (virPCIDeviceInitDevice(dev, fd) < 0) goto cleanup; /* KVM will perform FLR when starting and stopping @@ -796,11 +796,11 @@ pciResetDevice(pciDevice *dev, * the function, not the whole device. */ if (dev->has_pm_reset) - ret = pciTryPowerManagementReset(dev, fd); + ret = virPCIDeviceTryPowerManagementReset(dev, fd); /* Bus reset is not an option with the root bus */ if (ret < 0 && dev->bus != 0) - ret = pciTrySecondaryBusReset(dev, fd, inactiveDevs); + ret = virPCIDeviceTrySecondaryBusReset(dev, fd, inactiveDevs); if (ret < 0) { virErrorPtr err = virGetLastError(); @@ -811,13 +811,13 @@ pciResetDevice(pciDevice *dev, } cleanup: - pciConfigClose(dev, fd); + virPCIDeviceConfigClose(dev, fd); return ret; } static int -pciDriverDir(char **buffer, const char *driver) +virPCIDriverDir(char **buffer, const char *driver) { VIR_FREE(*buffer); @@ -830,7 +830,7 @@ pciDriverDir(char **buffer, const char *driver) } static int -pciDriverFile(char **buffer, const char *driver, const char *file) +virPCIDriverFile(char **buffer, const char *driver, const char *file) { VIR_FREE(*buffer); @@ -843,7 +843,7 @@ pciDriverFile(char **buffer, const char *driver, const char *file) } static int -pciDeviceFile(char **buffer, const char *device, const char *file) +virPCIFile(char **buffer, const char *device, const char *file) { VIR_FREE(*buffer); @@ -856,13 +856,13 @@ pciDeviceFile(char **buffer, const char *device, const char *file) } static int -pciProbeStubDriver(const char *driver) +virPCIProbeStubDriver(const char *driver) { char *drvpath = NULL; int probed = 0; recheck: - if (pciDriverDir(&drvpath, driver) == 0 && virFileExists(drvpath)) { + if (virPCIDriverDir(&drvpath, driver) == 0 && virFileExists(drvpath)) { /* driver already loaded, return */ VIR_FREE(drvpath); return 0; @@ -887,13 +887,13 @@ recheck: } static int -pciUnbindDeviceFromStub(pciDevice *dev, const char *driver) +virPCIDeviceUnbindDeviceFromStub(virPCIDevicePtr dev, const char *driver) { int result = -1; char *drvdir = NULL; char *path = NULL; - if (pciDriverDir(&drvdir, driver) < 0) + if (virPCIDriverDir(&drvdir, driver) < 0) goto cleanup; if (!dev->unbind_from_stub) @@ -901,11 +901,11 @@ pciUnbindDeviceFromStub(pciDevice *dev, const char *driver) /* If the device is bound to stub, unbind it. */ - if (pciDeviceFile(&path, dev->name, "driver") < 0) + if (virPCIFile(&path, dev->name, "driver") < 0) goto cleanup; if (virFileExists(drvdir) && virFileLinkPointsTo(path, drvdir)) { - if (pciDriverFile(&path, driver, "unbind") < 0) { + if (virPCIDriverFile(&path, driver, "unbind") < 0) { goto cleanup; } @@ -923,7 +923,7 @@ remove_slot: goto reprobe; /* Xen's pciback.ko wants you to use remove_slot on the specific device */ - if (pciDriverFile(&path, driver, "remove_slot") < 0) { + if (virPCIDriverFile(&path, driver, "remove_slot") < 0) { goto cleanup; } @@ -946,7 +946,7 @@ reprobe: * available, then re-probing would just cause the device to be * re-bound to the stub. */ - if (pciDriverFile(&path, driver, "remove_id") < 0) { + if (virPCIDriverFile(&path, driver, "remove_id") < 0) { goto cleanup; } @@ -975,7 +975,7 @@ cleanup: static int -pciBindDeviceToStub(pciDevice *dev, const char *driver) +virPCIDeviceBindDeviceToStub(virPCIDevicePtr dev, const char *driver) { int result = -1; char *drvdir = NULL; @@ -983,8 +983,8 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) int reprobe = 0; /* check whether the device is already bound to a driver */ - if (pciDriverDir(&drvdir, driver) < 0 || - pciDeviceFile(&path, dev->name, "driver") < 0) { + if (virPCIDriverDir(&drvdir, driver) < 0 || + virPCIFile(&path, dev->name, "driver") < 0) { goto cleanup; } @@ -1005,7 +1005,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) * is triggered for such a device, it will also be immediately * bound by the stub. */ - if (pciDriverFile(&path, driver, "new_id") < 0) { + if (virPCIDriverFile(&path, driver, "new_id") < 0) { goto cleanup; } @@ -1019,8 +1019,8 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) /* check whether the device is bound to pci-stub when we write dev->id to * new_id. */ - if (pciDriverDir(&drvdir, driver) < 0 || - pciDeviceFile(&path, dev->name, "driver") < 0) { + if (virPCIDriverDir(&drvdir, driver) < 0 || + virPCIFile(&path, dev->name, "driver") < 0) { goto remove_id; } @@ -1035,7 +1035,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) * PCI device happens to be IDE controller for the disk hosting * your root filesystem. */ - if (pciDeviceFile(&path, dev->name, "driver/unbind") < 0) { + if (virPCIFile(&path, dev->name, "driver/unbind") < 0) { goto cleanup; } @@ -1051,14 +1051,14 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) /* If the device isn't already bound to pci-stub, try binding it now. */ - if (pciDriverDir(&drvdir, driver) < 0 || - pciDeviceFile(&path, dev->name, "driver") < 0) { + if (virPCIDriverDir(&drvdir, driver) < 0 || + virPCIFile(&path, dev->name, "driver") < 0) { goto remove_id; } if (!virFileLinkPointsTo(path, drvdir)) { /* Xen's pciback.ko wants you to use new_slot first */ - if (pciDriverFile(&path, driver, "new_slot") < 0) { + if (virPCIDriverFile(&path, driver, "new_slot") < 0) { goto remove_id; } @@ -1070,7 +1070,7 @@ pciBindDeviceToStub(pciDevice *dev, const char *driver) } dev->remove_slot = 1; - if (pciDriverFile(&path, driver, "bind") < 0) { + if (virPCIDriverFile(&path, driver, "bind") < 0) { goto remove_id; } @@ -1087,7 +1087,7 @@ remove_id: /* If 'remove_id' exists, remove the device id from pci-stub's dynamic * ID table so that 'drivers_probe' works below. */ - if (pciDriverFile(&path, driver, "remove_id") < 0) { + if (virPCIDriverFile(&path, driver, "remove_id") < 0) { /* We do not remove PCI ID from pci-stub, and we cannot reprobe it */ if (dev->reprobe) { VIR_WARN("Could not remove PCI ID '%s' from %s, and the device " @@ -1118,36 +1118,36 @@ cleanup: VIR_FREE(path); if (result < 0) { - pciUnbindDeviceFromStub(dev, driver); + virPCIDeviceUnbindDeviceFromStub(dev, driver); } return result; } int -pciDettachDevice(pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs, - const char *driver) +virPCIDeviceDettach(virPCIDevicePtr dev, + virPCIDeviceList *activeDevs, + virPCIDeviceList *inactiveDevs, + const char *driver) { - if (pciProbeStubDriver(driver) < 0) { + if (virPCIProbeStubDriver(driver) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to load PCI stub module %s"), driver); return -1; } - if (activeDevs && pciDeviceListFind(activeDevs, dev)) { + if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Not detaching active device %s"), dev->name); return -1; } - if (pciBindDeviceToStub(dev, driver) < 0) + if (virPCIDeviceBindDeviceToStub(dev, driver) < 0) return -1; /* Add the dev into list inactiveDevs */ - if (inactiveDevs && !pciDeviceListFind(inactiveDevs, dev)) { - if (pciDeviceListAdd(inactiveDevs, dev) < 0) + if (inactiveDevs && !virPCIDeviceListFind(inactiveDevs, dev)) { + if (virPCIDeviceListAdd(inactiveDevs, dev) < 0) return -1; } @@ -1155,29 +1155,29 @@ pciDettachDevice(pciDevice *dev, } int -pciReAttachDevice(pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs, - const char *driver) +virPCIDeviceReAttach(virPCIDevicePtr dev, + virPCIDeviceListPtr activeDevs, + virPCIDeviceListPtr inactiveDevs, + const char *driver) { - if (pciProbeStubDriver(driver) < 0) { + if (virPCIProbeStubDriver(driver) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to load PCI stub module %s"), driver); return -1; } - if (activeDevs && pciDeviceListFind(activeDevs, dev)) { + if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Not reattaching active device %s"), dev->name); return -1; } - if (pciUnbindDeviceFromStub(dev, driver) < 0) + if (virPCIDeviceUnbindDeviceFromStub(dev, driver) < 0) return -1; /* Steal the dev from list inactiveDevs */ if (inactiveDevs) - pciDeviceListSteal(inactiveDevs, dev); + virPCIDeviceListSteal(inactiveDevs, dev); return 0; } @@ -1212,7 +1212,7 @@ pciReAttachDevice(pciDevice *dev, * holding onto the resource. */ int -pciWaitForDeviceCleanup(pciDevice *dev, const char *matcher) +virPCIDeviceWaitForCleanup(virPCIDevicePtr dev, const char *matcher) { FILE *fp; char line[160]; @@ -1292,12 +1292,12 @@ pciWaitForDeviceCleanup(pciDevice *dev, const char *matcher) } static char * -pciReadDeviceID(pciDevice *dev, const char *id_name) +virPCIDeviceReadDeviceID(virPCIDevicePtr dev, const char *id_name) { char *path = NULL; char *id_str; - if (pciDeviceFile(&path, dev->name, id_name) < 0) { + if (virPCIFile(&path, dev->name, id_name) < 0) { return NULL; } @@ -1322,16 +1322,16 @@ pciReadDeviceID(pciDevice *dev, const char *id_name) } int -pciGetDeviceAddrString(unsigned domain, - unsigned bus, - unsigned slot, - unsigned function, - char **pciConfigAddr) +virPCIGetAddrString(unsigned domain, + unsigned bus, + unsigned slot, + unsigned function, + char **pciConfigAddr) { - pciDevice *dev = NULL; + virPCIDevicePtr dev = NULL; int ret = -1; - dev = pciGetDevice(domain, bus, slot, function); + dev = virPCIDeviceNew(domain, bus, slot, function); if (dev != NULL) { if ((*pciConfigAddr = strdup(dev->name)) == NULL) { virReportOOMError(); @@ -1341,17 +1341,17 @@ pciGetDeviceAddrString(unsigned domain, } cleanup: - pciFreeDevice(dev); + virPCIDeviceFree(dev); return ret; } -pciDevice * -pciGetDevice(unsigned domain, - unsigned bus, - unsigned slot, - unsigned function) +virPCIDevicePtr +virPCIDeviceNew(unsigned domain, + unsigned bus, + unsigned slot, + unsigned function) { - pciDevice *dev; + virPCIDevicePtr dev; char *vendor = NULL; char *product = NULL; @@ -1386,8 +1386,8 @@ pciGetDevice(unsigned domain, goto error; } - vendor = pciReadDeviceID(dev, "vendor"); - product = pciReadDeviceID(dev, "device"); + vendor = virPCIDeviceReadDeviceID(dev, "vendor"); + product = virPCIDeviceReadDeviceID(dev, "device"); if (!vendor || !product) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1413,13 +1413,13 @@ cleanup: return dev; error: - pciFreeDevice(dev); + virPCIDeviceFree(dev); dev = NULL; goto cleanup; } void -pciFreeDevice(pciDevice *dev) +virPCIDeviceFree(virPCIDevicePtr dev) { if (!dev) return; @@ -1429,70 +1429,70 @@ pciFreeDevice(pciDevice *dev) } const char * -pciDeviceGetName(pciDevice *dev) +virPCIDeviceGetName(virPCIDevicePtr dev) { return dev->name; } -void pciDeviceSetManaged(pciDevice *dev, unsigned managed) +void virPCIDeviceSetManaged(virPCIDevicePtr dev, unsigned managed) { dev->managed = !!managed; } -unsigned pciDeviceGetManaged(pciDevice *dev) +unsigned virPCIDeviceGetManaged(virPCIDevicePtr dev) { return dev->managed; } unsigned -pciDeviceGetUnbindFromStub(pciDevice *dev) +virPCIDeviceGetUnbindFromStub(virPCIDevicePtr dev) { return dev->unbind_from_stub; } void -pciDeviceSetUnbindFromStub(pciDevice *dev, unsigned unbind) +virPCIDeviceSetUnbindFromStub(virPCIDevicePtr dev, unsigned unbind) { dev->unbind_from_stub = !!unbind; } unsigned -pciDeviceGetRemoveSlot(pciDevice *dev) +virPCIDeviceGetRemoveSlot(virPCIDevicePtr dev) { return dev->remove_slot; } void -pciDeviceSetRemoveSlot(pciDevice *dev, unsigned remove_slot) +virPCIDeviceSetRemoveSlot(virPCIDevicePtr dev, unsigned remove_slot) { dev->remove_slot = !!remove_slot; } unsigned -pciDeviceGetReprobe(pciDevice *dev) +virPCIDeviceGetReprobe(virPCIDevicePtr dev) { return dev->reprobe; } void -pciDeviceSetReprobe(pciDevice *dev, unsigned reprobe) +virPCIDeviceSetReprobe(virPCIDevicePtr dev, unsigned reprobe) { dev->reprobe = !!reprobe; } void -pciDeviceSetUsedBy(pciDevice *dev, const char *name) +virPCIDeviceSetUsedBy(virPCIDevicePtr dev, const char *name) { dev->used_by = name; } const char * -pciDeviceGetUsedBy(pciDevice *dev) +virPCIDeviceGetUsedBy(virPCIDevicePtr dev) { return dev->used_by; } -void pciDeviceReAttachInit(pciDevice *pci) +void virPCIDeviceReAttachInit(virPCIDevicePtr pci) { pci->unbind_from_stub = 1; pci->remove_slot = 1; @@ -1500,10 +1500,10 @@ void pciDeviceReAttachInit(pciDevice *pci) } -pciDeviceList * -pciDeviceListNew(void) +virPCIDeviceListPtr +virPCIDeviceListNew(void) { - pciDeviceList *list; + virPCIDeviceListPtr list; if (VIR_ALLOC(list) < 0) { virReportOOMError(); @@ -1514,7 +1514,7 @@ pciDeviceListNew(void) } void -pciDeviceListFree(pciDeviceList *list) +virPCIDeviceListFree(virPCIDeviceListPtr list) { int i; @@ -1522,7 +1522,7 @@ pciDeviceListFree(pciDeviceList *list) return; for (i = 0; i < list->count; i++) { - pciFreeDevice(list->devs[i]); + virPCIDeviceFree(list->devs[i]); list->devs[i] = NULL; } @@ -1532,10 +1532,10 @@ pciDeviceListFree(pciDeviceList *list) } int -pciDeviceListAdd(pciDeviceList *list, - pciDevice *dev) +virPCIDeviceListAdd(virPCIDeviceListPtr list, + virPCIDevicePtr dev) { - if (pciDeviceListFind(list, dev)) { + if (virPCIDeviceListFind(list, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Device %s is already in use"), dev->name); return -1; @@ -1551,9 +1551,9 @@ pciDeviceListAdd(pciDeviceList *list, return 0; } -pciDevice * -pciDeviceListGet(pciDeviceList *list, - int idx) +virPCIDevicePtr +virPCIDeviceListGet(virPCIDeviceListPtr list, + int idx) { if (idx >= list->count) return NULL; @@ -1564,16 +1564,16 @@ pciDeviceListGet(pciDeviceList *list, } int -pciDeviceListCount(pciDeviceList *list) +virPCIDeviceListCount(virPCIDeviceListPtr list) { return list->count; } -pciDevice * -pciDeviceListStealIndex(pciDeviceList *list, - int idx) +virPCIDevicePtr +virPCIDeviceListStealIndex(virPCIDeviceListPtr list, + int idx) { - pciDevice *ret; + virPCIDevicePtr ret; if (idx < 0 || idx >= list->count) return NULL; @@ -1593,24 +1593,24 @@ pciDeviceListStealIndex(pciDeviceList *list, return ret; } -pciDevice * -pciDeviceListSteal(pciDeviceList *list, - pciDevice *dev) +virPCIDevicePtr +virPCIDeviceListSteal(virPCIDeviceListPtr list, + virPCIDevicePtr dev) { - return pciDeviceListStealIndex(list, pciDeviceListFindIndex(list, dev)); + return virPCIDeviceListStealIndex(list, virPCIDeviceListFindIndex(list, dev)); } void -pciDeviceListDel(pciDeviceList *list, - pciDevice *dev) +virPCIDeviceListDel(virPCIDeviceListPtr list, + virPCIDevicePtr dev) { - pciDevice *ret = pciDeviceListSteal(list, dev); + virPCIDevicePtr ret = virPCIDeviceListSteal(list, dev); if (ret) - pciFreeDevice(ret); + virPCIDeviceFree(ret); } int -pciDeviceListFindIndex(pciDeviceList *list, pciDevice *dev) +virPCIDeviceListFindIndex(virPCIDeviceListPtr list, virPCIDevicePtr dev) { int i; @@ -1623,21 +1623,21 @@ pciDeviceListFindIndex(pciDeviceList *list, pciDevice *dev) return -1; } -pciDevice * -pciDeviceListFind(pciDeviceList *list, pciDevice *dev) +virPCIDevicePtr +virPCIDeviceListFind(virPCIDeviceListPtr list, virPCIDevicePtr dev) { int i; - if ((i = pciDeviceListFindIndex(list, dev)) >= 0) + if ((i = virPCIDeviceListFindIndex(list, dev)) >= 0) return list->devs[i]; else return NULL; } -int pciDeviceFileIterate(pciDevice *dev, - pciDeviceFileActor actor, - void *opaque) +int virPCIDeviceFileIterate(virPCIDevicePtr dev, + virPCIDeviceFileActor actor, + void *opaque) { char *pcidir = NULL; char *file = NULL; @@ -1688,7 +1688,7 @@ cleanup: } static int -pciDeviceDownstreamLacksACS(pciDevice *dev) +virPCIDeviceDownstreamLacksACS(virPCIDevicePtr dev) { uint16_t flags; uint16_t ctrl; @@ -1696,30 +1696,30 @@ pciDeviceDownstreamLacksACS(pciDevice *dev) int fd; int ret = 0; - if ((fd = pciConfigOpen(dev, true)) < 0) + if ((fd = virPCIDeviceConfigOpen(dev, true)) < 0) return -1; - if (pciInitDevice(dev, fd) < 0) { + if (virPCIDeviceInitDevice(dev, fd) < 0) { ret = -1; goto cleanup; } pos = dev->pcie_cap_pos; - if (!pos || pciRead16(dev, fd, PCI_CLASS_DEVICE) != PCI_CLASS_BRIDGE_PCI) + if (!pos || virPCIDeviceRead16(dev, fd, PCI_CLASS_DEVICE) != PCI_CLASS_BRIDGE_PCI) goto cleanup; - flags = pciRead16(dev, fd, pos + PCI_EXP_FLAGS); + flags = virPCIDeviceRead16(dev, fd, pos + PCI_EXP_FLAGS); if (((flags & PCI_EXP_FLAGS_TYPE) >> 4) != PCI_EXP_TYPE_DOWNSTREAM) goto cleanup; - pos = pciFindExtendedCapabilityOffset(dev, fd, PCI_EXT_CAP_ID_ACS); + pos = virPCIDeviceFindExtendedCapabilityOffset(dev, fd, PCI_EXT_CAP_ID_ACS); if (!pos) { VIR_DEBUG("%s %s: downstream port lacks ACS", dev->id, dev->name); ret = 1; goto cleanup; } - ctrl = pciRead16(dev, fd, pos + PCI_EXT_ACS_CTRL); + ctrl = virPCIDeviceRead16(dev, fd, pos + PCI_EXT_ACS_CTRL); if ((ctrl & PCI_EXT_CAP_ACS_ENABLED) != PCI_EXT_CAP_ACS_ENABLED) { VIR_DEBUG("%s %s: downstream port has ACS disabled", dev->id, dev->name); @@ -1728,16 +1728,16 @@ pciDeviceDownstreamLacksACS(pciDevice *dev) } cleanup: - pciConfigClose(dev, fd); + virPCIDeviceConfigClose(dev, fd); return ret; } static int -pciDeviceIsBehindSwitchLackingACS(pciDevice *dev) +virPCIDeviceIsBehindSwitchLackingACS(virPCIDevicePtr dev) { - pciDevice *parent; + virPCIDevicePtr parent; - if (pciGetParentDevice(dev, &parent) < 0) + if (virPCIDeviceGetParentDevice(dev, &parent) < 0) return -1; if (!parent) { /* if we have no parent, and this is the root bus, ACS doesn't come @@ -1759,14 +1759,14 @@ pciDeviceIsBehindSwitchLackingACS(pciDevice *dev) * parent can be found */ do { - pciDevice *tmp; + virPCIDevicePtr tmp; int acs; int ret; - acs = pciDeviceDownstreamLacksACS(parent); + acs = virPCIDeviceDownstreamLacksACS(parent); if (acs) { - pciFreeDevice(parent); + virPCIDeviceFree(parent); if (acs < 0) return -1; else @@ -1774,8 +1774,8 @@ pciDeviceIsBehindSwitchLackingACS(pciDevice *dev) } tmp = parent; - ret = pciGetParentDevice(parent, &parent); - pciFreeDevice(tmp); + ret = virPCIDeviceGetParentDevice(parent, &parent); + virPCIDeviceFree(tmp); if (ret < 0) return -1; } while (parent); @@ -1783,8 +1783,8 @@ pciDeviceIsBehindSwitchLackingACS(pciDevice *dev) return 0; } -int pciDeviceIsAssignable(pciDevice *dev, - int strict_acs_check) +int virPCIDeviceIsAssignable(virPCIDevicePtr dev, + int strict_acs_check) { int ret; @@ -1793,7 +1793,7 @@ int pciDeviceIsAssignable(pciDevice *dev, * or bound to a stub driver. */ - ret = pciDeviceIsBehindSwitchLackingACS(dev); + ret = virPCIDeviceIsBehindSwitchLackingACS(dev); if (ret < 0) return 0; @@ -1819,8 +1819,8 @@ int pciDeviceIsAssignable(pciDevice *dev, * returns true if equal */ static bool -pciConfigAddressEqual(struct pci_config_address *bdf1, - struct pci_config_address *bdf2) +virPCIDeviceAddressIsEqual(virPCIDeviceAddressPtr bdf1, + virPCIDeviceAddressPtr bdf2) { return ((bdf1->domain == bdf2->domain) && (bdf1->bus == bdf2->bus) && @@ -1847,8 +1847,8 @@ logStrToLong_ui(char const *s, } static int -pciParsePciConfigAddress(char *address, - struct pci_config_address *bdf) +virPCIParseDeviceAddress(char *address, + virPCIDeviceAddressPtr bdf) { char *p = NULL; int ret = -1; @@ -1880,8 +1880,8 @@ out: } static int -pciGetPciConfigAddressFromSysfsDeviceLink(const char *device_link, - struct pci_config_address **bdf) +virPCIGetDeviceAddressFromSysfsDeviceLink(const char *device_link, + virPCIDeviceAddressPtr *bdf) { char *config_address = NULL; char *device_path = NULL; @@ -1911,7 +1911,7 @@ pciGetPciConfigAddressFromSysfsDeviceLink(const char *device_link, goto out; } - if (pciParsePciConfigAddress(config_address, *bdf) != 0) { + if (virPCIParseDeviceAddress(config_address, *bdf) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to parse PCI config address '%s'"), config_address); @@ -1919,7 +1919,7 @@ pciGetPciConfigAddressFromSysfsDeviceLink(const char *device_link, goto out; } - VIR_DEBUG("pci_config_address %.4x:%.2x:%.2x.%.1x", + VIR_DEBUG("virPCIDeviceAddress %.4x:%.2x:%.2x.%.1x", (*bdf)->domain, (*bdf)->bus, (*bdf)->slot, @@ -1937,8 +1937,8 @@ out: * Returns Physical function given a virtual function */ int -pciGetPhysicalFunction(const char *vf_sysfs_path, - struct pci_config_address **physical_function) +virPCIGetPhysicalFunction(const char *vf_sysfs_path, + virPCIDeviceAddressPtr *physical_function) { int ret = -1; char *device_link = NULL; @@ -1950,7 +1950,7 @@ pciGetPhysicalFunction(const char *vf_sysfs_path, virReportOOMError(); return ret; } else { - ret = pciGetPciConfigAddressFromSysfsDeviceLink(device_link, + ret = virPCIGetDeviceAddressFromSysfsDeviceLink(device_link, physical_function); } @@ -1963,9 +1963,9 @@ pciGetPhysicalFunction(const char *vf_sysfs_path, * Returns virtual functions of a physical function */ int -pciGetVirtualFunctions(const char *sysfs_path, - struct pci_config_address ***virtual_functions, - unsigned int *num_virtual_functions) +virPCIGetVirtualFunctions(const char *sysfs_path, + virPCIDeviceAddressPtr **virtual_functions, + unsigned int *num_virtual_functions) { int ret = -1; DIR *dir = NULL; @@ -1998,20 +1998,20 @@ pciGetVirtualFunctions(const char *sysfs_path, VIR_DEBUG("Number of virtual functions: %d", *num_virtual_functions); if (VIR_REALLOC_N(*virtual_functions, - (*num_virtual_functions) + 1) != 0) { + (*num_virtual_functions) + 1) != 0) { virReportOOMError(); VIR_FREE(device_link); goto out; } - if (pciGetPciConfigAddressFromSysfsDeviceLink(device_link, - &((*virtual_functions)[*num_virtual_functions])) != + if (virPCIGetDeviceAddressFromSysfsDeviceLink(device_link, + &((*virtual_functions)[*num_virtual_functions])) != SRIOV_FOUND) { /* We should not get back SRIOV_NOT_FOUND in this * case, so if we do, it's an error. */ virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to get SR IOV function from device " - "link '%s'"), device_link); + "link '%s'"), device_link); VIR_FREE(device_link); goto out; } else { @@ -2034,13 +2034,13 @@ out: * Returns 1 if vf device is a virtual function, 0 if not, -1 on error */ int -pciDeviceIsVirtualFunction(const char *vf_sysfs_device_link) +virPCIIsVirtualFunction(const char *vf_sysfs_device_link) { char *vf_sysfs_physfn_link = NULL; int ret = -1; if (virAsprintf(&vf_sysfs_physfn_link, "%s/physfn", - vf_sysfs_device_link) < 0) { + vf_sysfs_device_link) < 0) { virReportOOMError(); return ret; } @@ -2056,40 +2056,40 @@ pciDeviceIsVirtualFunction(const char *vf_sysfs_device_link) * Returns the sriov virtual function index of vf given its pf */ int -pciGetVirtualFunctionIndex(const char *pf_sysfs_device_link, - const char *vf_sysfs_device_link, - int *vf_index) +virPCIGetVirtualFunctionIndex(const char *pf_sysfs_device_link, + const char *vf_sysfs_device_link, + int *vf_index) { int ret = -1, i; unsigned int num_virt_fns = 0; - struct pci_config_address *vf_bdf = NULL; - struct pci_config_address **virt_fns = NULL; + virPCIDeviceAddressPtr vf_bdf = NULL; + virPCIDeviceAddressPtr *virt_fns = NULL; - if (pciGetPciConfigAddressFromSysfsDeviceLink(vf_sysfs_device_link, - &vf_bdf) < 0) + if (virPCIGetDeviceAddressFromSysfsDeviceLink(vf_sysfs_device_link, + &vf_bdf) < 0) return ret; - if (pciGetVirtualFunctions(pf_sysfs_device_link, &virt_fns, - &num_virt_fns) < 0) { + if (virPCIGetVirtualFunctions(pf_sysfs_device_link, &virt_fns, + &num_virt_fns) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Error getting physical function's '%s' " - "virtual_functions"), pf_sysfs_device_link); + "virtual_functions"), pf_sysfs_device_link); goto out; } for (i = 0; i < num_virt_fns; i++) { - if (pciConfigAddressEqual(vf_bdf, virt_fns[i])) { - *vf_index = i; - ret = 0; - break; - } + if (virPCIDeviceAddressIsEqual(vf_bdf, virt_fns[i])) { + *vf_index = i; + ret = 0; + break; + } } out: /* free virtual functions */ for (i = 0; i < num_virt_fns; i++) - VIR_FREE(virt_fns[i]); + VIR_FREE(virt_fns[i]); VIR_FREE(virt_fns); VIR_FREE(vf_bdf); @@ -2102,10 +2102,10 @@ out: */ int -pciSysfsFile(char *pciDeviceName, char **pci_sysfs_device_link) +virPCIGetSysfsFile(char *virPCIDeviceName, char **pci_sysfs_device_link) { if (virAsprintf(pci_sysfs_device_link, PCI_SYSFS "devices/%s", - pciDeviceName) < 0) { + virPCIDeviceName) < 0) { virReportOOMError(); return -1; } @@ -2114,8 +2114,8 @@ pciSysfsFile(char *pciDeviceName, char **pci_sysfs_device_link) } int -pciConfigAddressToSysfsFile(struct pci_config_address *dev, - char **pci_sysfs_device_link) +virPCIDeviceAddressGetSysfsFile(virPCIDeviceAddressPtr dev, + char **pci_sysfs_device_link) { if (virAsprintf(pci_sysfs_device_link, PCI_SYSFS "devices/%04x:%02x:%02x.%x", dev->domain, @@ -2131,68 +2131,68 @@ pciConfigAddressToSysfsFile(struct pci_config_address *dev, * Returns the network device name of a pci device */ int -pciDeviceNetName(char *device_link_sysfs_path, char **netname) -{ - char *pcidev_sysfs_net_path = NULL; - int ret = -1; - DIR *dir = NULL; - struct dirent *entry = NULL; - - if (virBuildPath(&pcidev_sysfs_net_path, device_link_sysfs_path, - "net") == -1) { - virReportOOMError(); - return -1; - } - - dir = opendir(pcidev_sysfs_net_path); - if (dir == NULL) - goto out; - - while ((entry = readdir(dir))) { - if (STREQ(entry->d_name, ".") || - STREQ(entry->d_name, "..")) - continue; +virPCIGetNetName(char *device_link_sysfs_path, char **netname) +{ + char *pcidev_sysfs_net_path = NULL; + int ret = -1; + DIR *dir = NULL; + struct dirent *entry = NULL; - /* Assume a single directory entry */ - *netname = strdup(entry->d_name); - if (!*netname) - virReportOOMError(); - else - ret = 0; - break; - } + if (virBuildPath(&pcidev_sysfs_net_path, device_link_sysfs_path, + "net") == -1) { + virReportOOMError(); + return -1; + } + + dir = opendir(pcidev_sysfs_net_path); + if (dir == NULL) + goto out; - closedir(dir); + while ((entry = readdir(dir))) { + if (STREQ(entry->d_name, ".") || + STREQ(entry->d_name, "..")) + continue; + + /* Assume a single directory entry */ + *netname = strdup(entry->d_name); + if (!*netname) + virReportOOMError(); + else + ret = 0; + break; + } + + closedir(dir); out: - VIR_FREE(pcidev_sysfs_net_path); + VIR_FREE(pcidev_sysfs_net_path); - return ret; + return ret; } int -pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path, - char **pfname, int *vf_index) +virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path, + char **pfname, int *vf_index) { - struct pci_config_address *pf_config_address = NULL; + virPCIDeviceAddressPtr pf_config_address = NULL; char *pf_sysfs_device_path = NULL; int ret = -1; - if (pciGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0) + if (virPCIGetPhysicalFunction(vf_sysfs_device_path, &pf_config_address) < 0) return ret; - if (pciConfigAddressToSysfsFile(pf_config_address, - &pf_sysfs_device_path) < 0) { + if (virPCIDeviceAddressGetSysfsFile(pf_config_address, + &pf_sysfs_device_path) < 0) { VIR_FREE(pf_config_address); return ret; } - if (pciGetVirtualFunctionIndex(pf_sysfs_device_path, vf_sysfs_device_path, - vf_index) < 0) + if (virPCIGetVirtualFunctionIndex(pf_sysfs_device_path, vf_sysfs_device_path, + vf_index) < 0) goto cleanup; - ret = pciDeviceNetName(pf_sysfs_device_path, pfname); + ret = virPCIGetNetName(pf_sysfs_device_path, pfname); cleanup: VIR_FREE(pf_config_address); @@ -2205,33 +2205,33 @@ cleanup: static const char *unsupported = N_("not supported on non-linux platforms"); int -pciGetPhysicalFunction(const char *vf_sysfs_path ATTRIBUTE_UNUSED, - struct pci_config_address **physical_function ATTRIBUTE_UNUSED) +virPCIGetPhysicalFunction(const char *vf_sysfs_path ATTRIBUTE_UNUSED, + virPCIDeviceAddressPtr *physical_function ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; } int -pciGetVirtualFunctions(const char *sysfs_path ATTRIBUTE_UNUSED, - struct pci_config_address ***virtual_functions ATTRIBUTE_UNUSED, - unsigned int *num_virtual_functions ATTRIBUTE_UNUSED) +virPCIGetVirtualFunctions(const char *sysfs_path ATTRIBUTE_UNUSED, + virPCIDeviceAddressPtr **virtual_functions ATTRIBUTE_UNUSED, + unsigned int *num_virtual_functions ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; } int -pciDeviceIsVirtualFunction(const char *vf_sysfs_device_link ATTRIBUTE_UNUSED) +virPCIDeviceIsVirtualFunction(const char *vf_sysfs_device_link ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; } int -pciGetVirtualFunctionIndex(const char *pf_sysfs_device_link ATTRIBUTE_UNUSED, - const char *vf_sysfs_device_link ATTRIBUTE_UNUSED, - int *vf_index ATTRIBUTE_UNUSED) +virPCIGetVirtualFunctionIndex(const char *pf_sysfs_device_link ATTRIBUTE_UNUSED, + const char *vf_sysfs_device_link ATTRIBUTE_UNUSED, + int *vf_index ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; @@ -2239,15 +2239,15 @@ pciGetVirtualFunctionIndex(const char *pf_sysfs_device_link ATTRIBUTE_UNUSED, } int -pciConfigAddressToSysfsFile(struct pci_config_address *dev ATTRIBUTE_UNUSED, - char **pci_sysfs_device_link ATTRIBUTE_UNUSED) +virPCIDeviceAddressGetSysfsFile(virPCIDeviceAddressPtr dev ATTRIBUTE_UNUSED, + char **pci_sysfs_device_link ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; } int -pciDeviceNetName(char *device_link_sysfs_path ATTRIBUTE_UNUSED, +virPCIGetNetName(char *device_link_sysfs_path ATTRIBUTE_UNUSED, char **netname ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); @@ -2255,9 +2255,9 @@ pciDeviceNetName(char *device_link_sysfs_path ATTRIBUTE_UNUSED, } int -pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path ATTRIBUTE_UNUSED, - char **pfname ATTRIBUTE_UNUSED, - int *vf_index ATTRIBUTE_UNUSED) +virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path ATTRIBUTE_UNUSED, + char **pfname ATTRIBUTE_UNUSED, + int *vf_index ATTRIBUTE_UNUSED) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); return -1; diff --git a/src/util/virpci.h b/src/util/virpci.h index bf7da01..3ca7545 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -26,67 +26,74 @@ # include "internal.h" -typedef struct _pciDevice pciDevice; -typedef struct _pciDeviceList pciDeviceList; - -struct pci_config_address { +typedef struct _virPCIDevice virPCIDevice; +typedef virPCIDevice *virPCIDevicePtr; +typedef struct _virPCIDeviceAddress virPCIDeviceAddress; +typedef virPCIDeviceAddress *virPCIDeviceAddressPtr; +typedef struct _virPCIDeviceList virPCIDeviceList; +typedef virPCIDeviceList *virPCIDeviceListPtr; + +struct _virPCIDeviceAddress { unsigned int domain; unsigned int bus; unsigned int slot; unsigned int function; }; -pciDevice *pciGetDevice (unsigned domain, - unsigned bus, - unsigned slot, - unsigned function); -void pciFreeDevice (pciDevice *dev); -const char *pciDeviceGetName (pciDevice *dev); -int pciDettachDevice (pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs, - const char *driver); -int pciReAttachDevice (pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs, - const char *driver); -int pciResetDevice (pciDevice *dev, - pciDeviceList *activeDevs, - pciDeviceList *inactiveDevs); -void pciDeviceSetManaged(pciDevice *dev, - unsigned managed); -unsigned pciDeviceGetManaged(pciDevice *dev); -void pciDeviceSetUsedBy(pciDevice *dev, - const char *used_by); -const char *pciDeviceGetUsedBy(pciDevice *dev); -unsigned pciDeviceGetUnbindFromStub(pciDevice *dev); -void pciDeviceSetUnbindFromStub(pciDevice *dev, - unsigned unbind); -unsigned pciDeviceGetRemoveSlot(pciDevice *dev); -void pciDeviceSetRemoveSlot(pciDevice *dev, - unsigned remove_slot); -unsigned pciDeviceGetReprobe(pciDevice *dev); -void pciDeviceSetReprobe(pciDevice *dev, - unsigned reprobe); -void pciDeviceReAttachInit(pciDevice *dev); - -pciDeviceList *pciDeviceListNew (void); -void pciDeviceListFree (pciDeviceList *list); -int pciDeviceListAdd (pciDeviceList *list, - pciDevice *dev); -pciDevice * pciDeviceListGet (pciDeviceList *list, - int idx); -int pciDeviceListCount (pciDeviceList *list); -pciDevice * pciDeviceListSteal (pciDeviceList *list, - pciDevice *dev); -pciDevice * pciDeviceListStealIndex(pciDeviceList *list, - int idx); -void pciDeviceListDel (pciDeviceList *list, - pciDevice *dev); -pciDevice * pciDeviceListFind (pciDeviceList *list, - pciDevice *dev); -int pciDeviceListFindIndex(pciDeviceList *list, - pciDevice *dev); +virPCIDevicePtr virPCIDeviceNew(unsigned domain, + unsigned bus, + unsigned slot, + unsigned function); +void virPCIDeviceFree(virPCIDevicePtr dev); +const char *virPCIDeviceGetName(virPCIDevicePtr dev); + +int virPCIDeviceDettach(virPCIDevicePtr dev, + virPCIDeviceListPtr activeDevs, + virPCIDeviceListPtr inactiveDevs, + const char *driver); +int virPCIDeviceReAttach(virPCIDevicePtr dev, + virPCIDeviceListPtr activeDevs, + virPCIDeviceListPtr inactiveDevs, + const char *driver); +int virPCIDeviceReset(virPCIDevicePtr dev, + virPCIDeviceListPtr activeDevs, + virPCIDeviceListPtr inactiveDevs); + +void virPCIDeviceSetManaged(virPCIDevice *dev, + unsigned managed); +unsigned virPCIDeviceGetManaged(virPCIDevice *dev); +void virPCIDeviceSetUsedBy(virPCIDevice *dev, + const char *used_by); +const char *virPCIDeviceGetUsedBy(virPCIDevice *dev); +unsigned virPCIDeviceGetUnbindFromStub(virPCIDevicePtr dev); +void virPCIDeviceSetUnbindFromStub(virPCIDevice *dev, + unsigned unbind); +unsigned virPCIDeviceGetRemoveSlot(virPCIDevicePtr dev); +void virPCIDeviceSetRemoveSlot(virPCIDevice *dev, + unsigned remove_slot); +unsigned virPCIDeviceGetReprobe(virPCIDevicePtr dev); +void virPCIDeviceSetReprobe(virPCIDevice *dev, + unsigned reprobe); +void virPCIDeviceReAttachInit(virPCIDevice *dev); + + +virPCIDeviceListPtr virPCIDeviceListNew(void); +void virPCIDeviceListFree(virPCIDeviceListPtr list); +int virPCIDeviceListAdd(virPCIDeviceListPtr list, + virPCIDevicePtr dev); +virPCIDevicePtr virPCIDeviceListGet(virPCIDeviceListPtr list, + int idx); +int virPCIDeviceListCount(virPCIDeviceListPtr list); +virPCIDevicePtr virPCIDeviceListSteal(virPCIDeviceListPtr list, + virPCIDevicePtr dev); +virPCIDevicePtr virPCIDeviceListStealIndex(virPCIDeviceListPtr list, + int idx); +void virPCIDeviceListDel(virPCIDeviceListPtr list, + virPCIDevicePtr dev); +virPCIDevicePtr virPCIDeviceListFind(virPCIDeviceListPtr list, + virPCIDevicePtr dev); +int virPCIDeviceListFindIndex(virPCIDeviceListPtr list, + virPCIDevicePtr dev); /* * Callback that will be invoked once for each file @@ -95,46 +102,47 @@ int pciDeviceListFindIndex(pciDeviceList *list, * Should return 0 if successfully processed, or * -1 to indicate error and abort iteration */ -typedef int (*pciDeviceFileActor)(pciDevice *dev, - const char *path, void *opaque); +typedef int (*virPCIDeviceFileActor)(virPCIDevicePtr dev, + const char *path, void *opaque); -int pciDeviceFileIterate(pciDevice *dev, - pciDeviceFileActor actor, - void *opaque); +int virPCIDeviceFileIterate(virPCIDevicePtr dev, + virPCIDeviceFileActor actor, + void *opaque); -int pciDeviceIsAssignable(pciDevice *dev, - int strict_acs_check); -int pciWaitForDeviceCleanup(pciDevice *dev, const char *matcher); +int virPCIDeviceIsAssignable(virPCIDevicePtr dev, + int strict_acs_check); +int virPCIDeviceWaitForCleanup(virPCIDevicePtr dev, const char *matcher); -int pciGetPhysicalFunction(const char *sysfs_path, - struct pci_config_address **phys_fn); +int virPCIGetPhysicalFunction(const char *sysfs_path, + virPCIDeviceAddressPtr *phys_fn); -int pciGetVirtualFunctions(const char *sysfs_path, - struct pci_config_address ***virtual_functions, - unsigned int *num_virtual_functions); +int virPCIGetVirtualFunctions(const char *sysfs_path, + virPCIDeviceAddressPtr **virtual_functions, + unsigned int *num_virtual_functions); -int pciDeviceIsVirtualFunction(const char *vf_sysfs_device_link); +int virPCIIsVirtualFunction(const char *vf_sysfs_device_link); -int pciGetVirtualFunctionIndex(const char *pf_sysfs_device_link, - const char *vf_sysfs_device_link, - int *vf_index); +int virPCIGetVirtualFunctionIndex(const char *pf_sysfs_device_link, + const char *vf_sysfs_device_link, + int *vf_index); -int pciConfigAddressToSysfsFile(struct pci_config_address *dev, - char **pci_sysfs_device_link); +int virPCIDeviceAddressGetSysfsFile(virPCIDeviceAddressPtr dev, + char **pci_sysfs_device_link); -int pciDeviceNetName(char *device_link_sysfs_path, char **netname); +int virPCIGetNetName(char *device_link_sysfs_path, char **netname); -int pciSysfsFile(char *pciDeviceName, char **pci_sysfs_device_link) +int virPCIGetSysfsFile(char *virPCIDeviceName, + char **pci_sysfs_device_link) ATTRIBUTE_RETURN_CHECK; -int pciGetDeviceAddrString(unsigned domain, - unsigned bus, - unsigned slot, - unsigned function, - char **pciConfigAddr) +int virPCIGetAddrString(unsigned domain, + unsigned bus, + unsigned slot, + unsigned function, + char **pciConfigAddr) ATTRIBUTE_NONNULL(5) ATTRIBUTE_RETURN_CHECK; -int pciDeviceGetVirtualFunctionInfo(const char *vf_sysfs_device_path, - char **pfname, int *vf_index); +int virPCIGetVirtualFunctionInfo(const char *vf_sysfs_device_path, + char **pfname, int *vf_index); #endif /* __VIR_PCI_H__ */ diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 2795ebc..2c8b73e 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -2102,23 +2102,23 @@ out: static int xenUnifiedNodeDeviceDettach(virNodeDevicePtr dev) { - pciDevice *pci; + virPCIDevicePtr pci; unsigned domain, bus, slot, function; int ret = -1; if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; - if (pciDettachDevice(pci, NULL, NULL, "pciback") < 0) + if (virPCIDeviceDettach(pci, NULL, NULL, "pciback") < 0) goto out; ret = 0; out: - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } @@ -2183,7 +2183,7 @@ out: static int xenUnifiedNodeDeviceReAttach(virNodeDevicePtr dev) { - pciDevice *pci; + virPCIDevicePtr pci; unsigned domain, bus, slot, function; int ret = -1; int domid; @@ -2191,7 +2191,7 @@ xenUnifiedNodeDeviceReAttach(virNodeDevicePtr dev) if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; @@ -2203,35 +2203,35 @@ xenUnifiedNodeDeviceReAttach(virNodeDevicePtr dev) goto out; } - if (pciReAttachDevice(pci, NULL, NULL, "pciback") < 0) + if (virPCIDeviceReAttach(pci, NULL, NULL, "pciback") < 0) goto out; ret = 0; out: - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } static int xenUnifiedNodeDeviceReset(virNodeDevicePtr dev) { - pciDevice *pci; + virPCIDevicePtr pci; unsigned domain, bus, slot, function; int ret = -1; if (xenUnifiedNodeDeviceGetPciInfo(dev, &domain, &bus, &slot, &function) < 0) return -1; - pci = pciGetDevice(domain, bus, slot, function); + pci = virPCIDeviceNew(domain, bus, slot, function); if (!pci) return -1; - if (pciResetDevice(pci, NULL, NULL) < 0) + if (virPCIDeviceReset(pci, NULL, NULL) < 0) goto out; ret = 0; out: - pciFreeDevice(pci); + virPCIDeviceFree(pci); return ret; } -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Rename all the usbDeviceXXX and usbXXXDevice APIs to have a fixed virUSBDevice name prefix --- src/libvirt_private.syms | 38 +++---- src/lxc/lxc_cgroup.c | 17 ++-- src/lxc/lxc_cgroup.h | 4 +- src/lxc/lxc_conf.h | 2 +- src/lxc/lxc_driver.c | 22 ++-- src/lxc/lxc_hostdev.c | 112 ++++++++++----------- src/lxc/lxc_hostdev.h | 4 +- src/qemu/qemu_cgroup.c | 14 +-- src/qemu/qemu_cgroup.h | 2 +- src/qemu/qemu_conf.h | 2 +- src/qemu/qemu_driver.c | 4 +- src/qemu/qemu_hostdev.c | 104 +++++++++---------- src/qemu/qemu_hostdev.h | 4 +- src/qemu/qemu_hotplug.c | 32 +++--- src/security/security_apparmor.c | 13 +-- src/security/security_dac.c | 34 +++---- src/security/security_selinux.c | 28 +++--- src/security/virt-aa-helper.c | 13 +-- src/util/virusb.c | 210 +++++++++++++++++++-------------------- src/util/virusb.h | 92 ++++++++--------- 20 files changed, 378 insertions(+), 373 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index dc9de46..e4d3605 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1218,25 +1218,25 @@ virThreadSelfID; # usb.h -usbDeviceFileIterate; -usbDeviceGetBus; -usbDeviceGetDevno; -usbDeviceGetName; -usbDeviceGetUsedBy; -usbDeviceListAdd; -usbDeviceListCount; -usbDeviceListDel; -usbDeviceListFind; -usbDeviceListFree; -usbDeviceListGet; -usbDeviceListNew; -usbDeviceListSteal; -usbDeviceSetUsedBy; -usbFindDevice; -usbFindDeviceByBus; -usbFindDeviceByVendor; -usbFreeDevice; -usbGetDevice; +virUSBDeviceFileIterate; +virUSBDeviceFind; +virUSBDeviceFindByBus; +virUSBDeviceFindByVendor; +virUSBDeviceFree; +virUSBDeviceGetBus; +virUSBDeviceGetDevno; +virUSBDeviceGetName; +virUSBDeviceGetUsedBy; +virUSBDeviceNew; +virUSBDeviceListAdd; +virUSBDeviceListCount; +virUSBDeviceListDel; +virUSBDeviceListFind; +virUSBDeviceListFree; +virUSBDeviceListGet; +virUSBDeviceListNew; +virUSBDeviceListSteal; +virUSBDeviceSetUsedBy; # util.h diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index 1984c5f..c382635 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -292,7 +292,7 @@ struct _virLXCCgroupDevicePolicy { int -virLXCSetupHostUsbDeviceCgroup(usbDevice *dev ATTRIBUTE_UNUSED, +virLXCSetupHostUsbDeviceCgroup(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *path, void *opaque) { @@ -314,7 +314,7 @@ virLXCSetupHostUsbDeviceCgroup(usbDevice *dev ATTRIBUTE_UNUSED, int -virLXCTeardownHostUsbDeviceCgroup(usbDevice *dev ATTRIBUTE_UNUSED, +virLXCTeardownHostUsbDeviceCgroup(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *path, void *opaque) { @@ -412,7 +412,7 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def, for (i = 0; i < def->nhostdevs; i++) { virDomainHostdevDefPtr hostdev = def->hostdevs[i]; - usbDevice *usb; + virUSBDevicePtr usb; switch (hostdev->mode) { case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: @@ -421,14 +421,15 @@ static int virLXCCgroupSetupDeviceACL(virDomainDefPtr def, if (hostdev->missing) continue; - if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL)) == NULL) + if ((usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL)) == NULL) goto cleanup; - if (usbDeviceFileIterate(usb, virLXCSetupHostUsbDeviceCgroup, - cgroup) < 0) + if (virUSBDeviceFileIterate(usb, virLXCSetupHostUsbDeviceCgroup, + cgroup) < 0) goto cleanup; + virUSBDeviceFree(usb); break; case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: switch (hostdev->source.caps.type) { diff --git a/src/lxc/lxc_cgroup.h b/src/lxc/lxc_cgroup.h index 97b94e5..fff554b 100644 --- a/src/lxc/lxc_cgroup.h +++ b/src/lxc/lxc_cgroup.h @@ -30,12 +30,12 @@ int virLXCCgroupSetup(virDomainDefPtr def); int virLXCCgroupGetMeminfo(virLXCMeminfoPtr meminfo); int -virLXCSetupHostUsbDeviceCgroup(usbDevice *dev, +virLXCSetupHostUsbDeviceCgroup(virUSBDevicePtr dev, const char *path, void *opaque); int -virLXCTeardownHostUsbDeviceCgroup(usbDevice *dev, +virLXCTeardownHostUsbDeviceCgroup(virUSBDevicePtr dev, const char *path, void *opaque); diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h index a6c111e..2649cd6 100644 --- a/src/lxc/lxc_conf.h +++ b/src/lxc/lxc_conf.h @@ -66,7 +66,7 @@ struct _virLXCDriver { int log_libvirtd; int have_netns; - usbDeviceList *activeUsbHostdevs; + virUSBDeviceListPtr activeUsbHostdevs; virDomainEventStatePtr domainEventState; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index f7ca70d..5084bc9 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3370,7 +3370,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, struct stat sb; mode_t mode; bool created = false; - usbDevice *usb = NULL; + virUSBDevicePtr usb = NULL; virCgroupPtr group = NULL; if (virDomainHostdevFind(vm->def, def, NULL) >= 0) { @@ -3418,8 +3418,8 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, goto cleanup; } - if (!(usb = usbGetDevice(def->source.subsys.u.usb.bus, - def->source.subsys.u.usb.device, vroot))) + if (!(usb = virUSBDeviceNew(def->source.subsys.u.usb.bus, + def->source.subsys.u.usb.device, vroot))) goto cleanup; if (stat(src, &sb) < 0) { @@ -3457,7 +3457,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, vm->def, def, vroot) < 0) goto cleanup; - if (usbDeviceFileIterate(usb, + if (virUSBDeviceFileIterate(usb, virLXCSetupHostUsbDeviceCgroup, &group) < 0) goto cleanup; @@ -3469,7 +3469,7 @@ cleanup: if (ret < 0 && created) unlink(dstfile); - usbFreeDevice(usb); + virUSBDeviceFree(usb); virCgroupFree(&group); VIR_FREE(src); VIR_FREE(dstfile); @@ -3960,7 +3960,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, int idx, ret = -1; char *dst; char *vroot; - usbDevice *usb = NULL; + virUSBDevicePtr usb = NULL; if ((idx = virDomainHostdevFind(vm->def, dev->data.hostdev, @@ -3996,8 +3996,8 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, goto cleanup; } - if (!(usb = usbGetDevice(def->source.subsys.u.usb.bus, - def->source.subsys.u.usb.device, vroot))) + if (!(usb = virUSBDeviceNew(def->source.subsys.u.usb.bus, + def->source.subsys.u.usb.device, vroot))) goto cleanup; VIR_DEBUG("Unlinking %s", dst); @@ -4009,13 +4009,13 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, } virDomainAuditHostdev(vm, def, "detach", true); - if (usbDeviceFileIterate(usb, + if (virUSBDeviceFileIterate(usb, virLXCTeardownHostUsbDeviceCgroup, &group) < 0) VIR_WARN("cannot deny device %s for domain %s", dst, vm->def->name); - usbDeviceListDel(driver->activeUsbHostdevs, usb); + virUSBDeviceListDel(driver->activeUsbHostdevs, usb); virDomainHostdevRemove(vm->def, idx); virDomainHostdevDefFree(def); @@ -4023,7 +4023,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, ret = 0; cleanup: - usbFreeDevice(usb); + virUSBDeviceFree(usb); VIR_FREE(dst); virCgroupFree(&group); return ret; diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index 4fa0508..a627714 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -41,7 +41,7 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, return 0; for (i = 0; i < def->nhostdevs; i++) { - usbDevice *usb = NULL; + virUSBDevicePtr usb = NULL; hostdev = def->hostdevs[i]; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -49,9 +49,9 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) continue; - usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); + usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL); if (!usb) { VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", hostdev->source.subsys.u.usb.bus, @@ -60,10 +60,10 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, continue; } - usbDeviceSetUsedBy(usb, def->name); + virUSBDeviceSetUsedBy(usb, def->name); - if (usbDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { - usbFreeDevice(usb); + if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { + virUSBDeviceFree(usb); return -1; } } @@ -75,47 +75,47 @@ virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, int virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, const char *name, - usbDeviceList *list) + virUSBDeviceList *list) { size_t i, j; unsigned int count; - usbDevice *tmp; + virUSBDevicePtr tmp; - count = usbDeviceListCount(list); + count = virUSBDeviceListCount(list); for (i = 0; i < count; i++) { - usbDevice *usb = usbDeviceListGet(list, i); - if ((tmp = usbDeviceListFind(driver->activeUsbHostdevs, usb))) { - const char *other_name = usbDeviceGetUsedBy(tmp); + virUSBDevicePtr usb = virUSBDeviceListGet(list, i); + if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) { + const char *other_name = virUSBDeviceGetUsedBy(tmp); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, _("USB device %s is in use by domain %s"), - usbDeviceGetName(tmp), other_name); + virUSBDeviceGetName(tmp), other_name); else virReportError(VIR_ERR_OPERATION_INVALID, _("USB device %s is already in use"), - usbDeviceGetName(tmp)); + virUSBDeviceGetName(tmp)); goto error; } - usbDeviceSetUsedBy(usb, name); + virUSBDeviceSetUsedBy(usb, name); VIR_DEBUG("Adding %03d.%03d dom=%s to activeUsbHostdevs", - usbDeviceGetBus(usb), usbDeviceGetDevno(usb), name); + virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); /* * The caller is responsible to steal these usb devices - * from the usbDeviceList that passed in on success, + * from the virUSBDeviceList that passed in on success, * perform rollback on failure. */ - if (usbDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) + if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) goto error; } return 0; error: for (j = 0; j < i; j++) { - tmp = usbDeviceListGet(list, i); - usbDeviceListSteal(driver->activeUsbHostdevs, tmp); + tmp = virUSBDeviceListGet(list, i); + virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp); } return -1; } @@ -123,7 +123,7 @@ error: int virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bool mandatory, - usbDevice **usb) + virUSBDevicePtr *usb) { unsigned vendor = hostdev->source.subsys.u.usb.vendor; unsigned product = hostdev->source.subsys.u.usb.product; @@ -135,10 +135,10 @@ virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, *usb = NULL; if (vendor && bus) { - rc = usbFindDevice(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); + rc = virUSBDeviceFind(vendor, product, bus, device, + NULL, + autoAddress ? false : mandatory, + usb); if (rc < 0) { return -1; } else if (!autoAddress) { @@ -155,19 +155,19 @@ virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, * automatically found before. */ if (vendor) { - usbDeviceList *devs; + virUSBDeviceList *devs; - rc = usbFindDeviceByVendor(vendor, product, - NULL, - mandatory, &devs); + rc = virUSBDeviceFindByVendor(vendor, product, + NULL, + mandatory, &devs); if (rc < 0) return -1; if (rc == 1) { - *usb = usbDeviceListGet(devs, 0); - usbDeviceListSteal(devs, *usb); + *usb = virUSBDeviceListGet(devs, 0); + virUSBDeviceListSteal(devs, *usb); } - usbDeviceListFree(devs); + virUSBDeviceListFree(devs); if (rc == 0) { goto out; @@ -186,8 +186,8 @@ virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, return -1; } - hostdev->source.subsys.u.usb.bus = usbDeviceGetBus(*usb); - hostdev->source.subsys.u.usb.device = usbDeviceGetDevno(*usb); + hostdev->source.subsys.u.usb.bus = virUSBDeviceGetBus(*usb); + hostdev->source.subsys.u.usb.device = virUSBDeviceGetDevno(*usb); hostdev->source.subsys.u.usb.autoAddress = true; if (autoAddress) { @@ -199,9 +199,9 @@ virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bus, device); } } else if (!vendor && bus) { - if (usbFindDeviceByBus(bus, device, - NULL, - mandatory, usb) < 0) + if (virUSBDeviceFindByBus(bus, device, + NULL, + mandatory, usb) < 0) return -1; } @@ -217,8 +217,8 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, { size_t i; int ret = -1; - usbDeviceList *list; - usbDevice *tmp; + virUSBDeviceList *list; + virUSBDevicePtr tmp; virDomainHostdevDefPtr *hostdevs = def->hostdevs; int nhostdevs = def->nhostdevs; @@ -227,7 +227,7 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, * This is done in several loops which cannot be joined into one big * loop. See virLXCPrepareHostdevPCIDevices() */ - if (!(list = usbDeviceListNew())) + if (!(list = virUSBDeviceListNew())) goto cleanup; /* Loop 1: build temporary list @@ -235,7 +235,7 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, for (i = 0 ; i < nhostdevs ; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; bool required = true; - usbDevice *usb; + virUSBDevicePtr usb; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -248,8 +248,8 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, if (virLXCFindHostdevUSBDevice(hostdev, required, &usb) < 0) goto cleanup; - if (usb && usbDeviceListAdd(list, usb) < 0) { - usbFreeDevice(usb); + if (usb && virUSBDeviceListAdd(list, usb) < 0) { + virUSBDeviceFree(usb); goto cleanup; } } @@ -265,15 +265,15 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, * driver list, so steal all items to avoid freeing them * in cleanup label. */ - while (usbDeviceListCount(list) > 0) { - tmp = usbDeviceListGet(list, 0); - usbDeviceListSteal(list, tmp); + while (virUSBDeviceListCount(list) > 0) { + tmp = virUSBDeviceListGet(list, 0); + virUSBDeviceListSteal(list, tmp); } ret = 0; cleanup: - usbDeviceListFree(list); + virUSBDeviceListFree(list); return ret; } @@ -342,7 +342,7 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, for (i = 0; i < nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; - usbDevice *usb, *tmp; + virUSBDevicePtr usb, tmp; const char *used_by = NULL; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -352,9 +352,9 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, if (hostdev->missing) continue; - usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); + usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL); if (!usb) { VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", @@ -370,8 +370,8 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, * Therefore we want to steal only those devices from * the list which were taken by @name */ - tmp = usbDeviceListFind(driver->activeUsbHostdevs, usb); - usbFreeDevice(usb); + tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb); + virUSBDeviceFree(usb); if (!tmp) { VIR_WARN("Unable to find device %03d.%03d " @@ -381,14 +381,14 @@ virLXCDomainReAttachHostUsbDevices(virLXCDriverPtr driver, continue; } - used_by = usbDeviceGetUsedBy(tmp); + used_by = virUSBDeviceGetUsedBy(tmp); if (STREQ_NULLABLE(used_by, name)) { VIR_DEBUG("Removing %03d.%03d dom=%s from activeUsbHostdevs", hostdev->source.subsys.u.usb.bus, hostdev->source.subsys.u.usb.device, name); - usbDeviceListDel(driver->activeUsbHostdevs, tmp); + virUSBDeviceListDel(driver->activeUsbHostdevs, tmp); } } } diff --git a/src/lxc/lxc_hostdev.h b/src/lxc/lxc_hostdev.h index dd98112..41bb178 100644 --- a/src/lxc/lxc_hostdev.h +++ b/src/lxc/lxc_hostdev.h @@ -31,10 +31,10 @@ int virLXCUpdateActiveUsbHostdevs(virLXCDriverPtr driver, virDomainDefPtr def); int virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bool mandatory, - usbDevice **usb); + virUSBDevicePtr *usb); int virLXCPrepareHostdevUSBDevices(virLXCDriverPtr driver, const char *name, - usbDeviceList *list); + virUSBDeviceListPtr list); int virLXCPrepareHostDevices(virLXCDriverPtr driver, virDomainDefPtr def); void virLXCDomainReAttachHostDevices(virLXCDriverPtr driver, diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 482989f..4eeb4e5 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -172,7 +172,7 @@ qemuSetupChardevCgroup(virDomainDefPtr def, } -int qemuSetupHostUsbDeviceCgroup(usbDevice *dev ATTRIBUTE_UNUSED, +int qemuSetupHostUsbDeviceCgroup(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *path, void *opaque) { @@ -286,7 +286,7 @@ int qemuSetupCgroup(virQEMUDriverPtr driver, for (i = 0; i < vm->def->nhostdevs; i++) { virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i]; - usbDevice *usb; + virUSBDevicePtr usb; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -295,13 +295,13 @@ int qemuSetupCgroup(virQEMUDriverPtr driver, if (hostdev->missing) continue; - if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL)) == NULL) + if ((usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL)) == NULL) goto cleanup; - if (usbDeviceFileIterate(usb, qemuSetupHostUsbDeviceCgroup, - &data) < 0) + if (virUSBDeviceFileIterate(usb, qemuSetupHostUsbDeviceCgroup, + &data) < 0) goto cleanup; } } diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h index 75ef514..a677d07 100644 --- a/src/qemu/qemu_cgroup.h +++ b/src/qemu/qemu_cgroup.h @@ -42,7 +42,7 @@ int qemuSetupDiskCgroup(virDomainObjPtr vm, int qemuTeardownDiskCgroup(virDomainObjPtr vm, virCgroupPtr cgroup, virDomainDiskDefPtr disk); -int qemuSetupHostUsbDeviceCgroup(usbDevice *dev, +int qemuSetupHostUsbDeviceCgroup(virUSBDevicePtr dev, const char *path, void *opaque); int qemuSetupCgroup(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index be45cf0..4bf1be0 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -183,7 +183,7 @@ struct _virQEMUDriver { virPCIDeviceListPtr activePciHostdevs; virPCIDeviceListPtr inactivePciHostdevs; - usbDeviceList *activeUsbHostdevs; + virUSBDeviceListPtr activeUsbHostdevs; virHashTablePtr sharedDisks; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d36f2c0..cba926d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -784,7 +784,7 @@ qemuStartup(bool privileged, if ((qemu_driver->activePciHostdevs = virPCIDeviceListNew()) == NULL) goto error; - if ((qemu_driver->activeUsbHostdevs = usbDeviceListNew()) == NULL) + if ((qemu_driver->activeUsbHostdevs = virUSBDeviceListNew()) == NULL) goto error; if ((qemu_driver->inactivePciHostdevs = virPCIDeviceListNew()) == NULL) @@ -1050,7 +1050,7 @@ qemuShutdown(void) { virNWFilterUnRegisterCallbackDriver(&qemuCallbackDriver); virPCIDeviceListFree(qemu_driver->activePciHostdevs); virPCIDeviceListFree(qemu_driver->inactivePciHostdevs); - usbDeviceListFree(qemu_driver->activeUsbHostdevs); + virUSBDeviceListFree(qemu_driver->activeUsbHostdevs); virHashFree(qemu_driver->sharedDisks); virCapabilitiesFree(qemu_driver->caps); qemuCapsCacheFree(qemu_driver->capsCache); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index b5d7c5e..46a17a7 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -170,7 +170,7 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, return 0; for (i = 0; i < def->nhostdevs; i++) { - usbDevice *usb = NULL; + virUSBDevicePtr usb = NULL; hostdev = def->hostdevs[i]; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -178,9 +178,9 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) continue; - usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); + usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL); if (!usb) { VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", hostdev->source.subsys.u.usb.bus, @@ -189,10 +189,10 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, continue; } - usbDeviceSetUsedBy(usb, def->name); + virUSBDeviceSetUsedBy(usb, def->name); - if (usbDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { - usbFreeDevice(usb); + if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { + virUSBDeviceFree(usb); return -1; } } @@ -596,47 +596,47 @@ qemuPrepareHostPCIDevices(virQEMUDriverPtr driver, int qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, const char *name, - usbDeviceList *list) + virUSBDeviceListPtr list) { int i, j; unsigned int count; - usbDevice *tmp; + virUSBDevicePtr tmp; - count = usbDeviceListCount(list); + count = virUSBDeviceListCount(list); for (i = 0; i < count; i++) { - usbDevice *usb = usbDeviceListGet(list, i); - if ((tmp = usbDeviceListFind(driver->activeUsbHostdevs, usb))) { - const char *other_name = usbDeviceGetUsedBy(tmp); + virUSBDevicePtr usb = virUSBDeviceListGet(list, i); + if ((tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb))) { + const char *other_name = virUSBDeviceGetUsedBy(tmp); if (other_name) virReportError(VIR_ERR_OPERATION_INVALID, _("USB device %s is in use by domain %s"), - usbDeviceGetName(tmp), other_name); + virUSBDeviceGetName(tmp), other_name); else virReportError(VIR_ERR_OPERATION_INVALID, _("USB device %s is already in use"), - usbDeviceGetName(tmp)); + virUSBDeviceGetName(tmp)); goto error; } - usbDeviceSetUsedBy(usb, name); + virUSBDeviceSetUsedBy(usb, name); VIR_DEBUG("Adding %03d.%03d dom=%s to activeUsbHostdevs", - usbDeviceGetBus(usb), usbDeviceGetDevno(usb), name); + virUSBDeviceGetBus(usb), virUSBDeviceGetDevno(usb), name); /* * The caller is responsible to steal these usb devices - * from the usbDeviceList that passed in on success, + * from the virUSBDeviceList that passed in on success, * perform rollback on failure. */ - if (usbDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) + if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) goto error; } return 0; error: for (j = 0; j < i; j++) { - tmp = usbDeviceListGet(list, i); - usbDeviceListSteal(driver->activeUsbHostdevs, tmp); + tmp = virUSBDeviceListGet(list, i); + virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp); } return -1; } @@ -644,7 +644,7 @@ error: int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bool mandatory, - usbDevice **usb) + virUSBDevicePtr *usb) { unsigned vendor = hostdev->source.subsys.u.usb.vendor; unsigned product = hostdev->source.subsys.u.usb.product; @@ -656,10 +656,10 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, *usb = NULL; if (vendor && bus) { - rc = usbFindDevice(vendor, product, bus, device, - NULL, - autoAddress ? false : mandatory, - usb); + rc = virUSBDeviceFind(vendor, product, bus, device, + NULL, + autoAddress ? false : mandatory, + usb); if (rc < 0) { return -1; } else if (!autoAddress) { @@ -676,17 +676,17 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, * automatically found before. */ if (vendor) { - usbDeviceList *devs; + virUSBDeviceListPtr devs; - rc = usbFindDeviceByVendor(vendor, product, NULL, mandatory, &devs); + rc = virUSBDeviceFindByVendor(vendor, product, NULL, mandatory, &devs); if (rc < 0) return -1; if (rc == 1) { - *usb = usbDeviceListGet(devs, 0); - usbDeviceListSteal(devs, *usb); + *usb = virUSBDeviceListGet(devs, 0); + virUSBDeviceListSteal(devs, *usb); } - usbDeviceListFree(devs); + virUSBDeviceListFree(devs); if (rc == 0) { goto out; @@ -705,8 +705,8 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, return -1; } - hostdev->source.subsys.u.usb.bus = usbDeviceGetBus(*usb); - hostdev->source.subsys.u.usb.device = usbDeviceGetDevno(*usb); + hostdev->source.subsys.u.usb.bus = virUSBDeviceGetBus(*usb); + hostdev->source.subsys.u.usb.device = virUSBDeviceGetDevno(*usb); hostdev->source.subsys.u.usb.autoAddress = true; if (autoAddress) { @@ -718,7 +718,7 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bus, device); } } else if (!vendor && bus) { - if (usbFindDeviceByBus(bus, device, NULL, mandatory, usb) < 0) + if (virUSBDeviceFindByBus(bus, device, NULL, mandatory, usb) < 0) return -1; } @@ -734,8 +734,8 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, bool coldBoot) { int i, ret = -1; - usbDeviceList *list; - usbDevice *tmp; + virUSBDeviceListPtr list; + virUSBDevicePtr tmp; virDomainHostdevDefPtr *hostdevs = def->hostdevs; int nhostdevs = def->nhostdevs; @@ -744,7 +744,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, * This is done in several loops which cannot be joined into one big * loop. See qemuPrepareHostdevPCIDevices() */ - if (!(list = usbDeviceListNew())) + if (!(list = virUSBDeviceListNew())) goto cleanup; /* Loop 1: build temporary list @@ -752,7 +752,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, for (i = 0 ; i < nhostdevs ; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; bool required = true; - usbDevice *usb; + virUSBDevicePtr usb; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) continue; @@ -767,8 +767,8 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, if (qemuFindHostdevUSBDevice(hostdev, required, &usb) < 0) goto cleanup; - if (usb && usbDeviceListAdd(list, usb) < 0) { - usbFreeDevice(usb); + if (usb && virUSBDeviceListAdd(list, usb) < 0) { + virUSBDeviceFree(usb); goto cleanup; } } @@ -784,15 +784,15 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, * driver list, so steal all items to avoid freeing them * in cleanup label. */ - while (usbDeviceListCount(list) > 0) { - tmp = usbDeviceListGet(list, 0); - usbDeviceListSteal(list, tmp); + while (virUSBDeviceListCount(list) > 0) { + tmp = virUSBDeviceListGet(list, 0); + virUSBDeviceListSteal(list, tmp); } ret = 0; cleanup: - usbDeviceListFree(list); + virUSBDeviceListFree(list); return ret; } @@ -931,7 +931,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, for (i = 0; i < nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; - usbDevice *usb, *tmp; + virUSBDevicePtr usb, tmp; const char *used_by = NULL; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) @@ -941,9 +941,9 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, if (hostdev->missing) continue; - usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, - hostdev->source.subsys.u.usb.device, - NULL); + usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, + hostdev->source.subsys.u.usb.device, + NULL); if (!usb) { VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s", @@ -959,8 +959,8 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, * Therefore we want to steal only those devices from * the list which were taken by @name */ - tmp = usbDeviceListFind(driver->activeUsbHostdevs, usb); - usbFreeDevice(usb); + tmp = virUSBDeviceListFind(driver->activeUsbHostdevs, usb); + virUSBDeviceFree(usb); if (!tmp) { VIR_WARN("Unable to find device %03d.%03d " @@ -970,14 +970,14 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, continue; } - used_by = usbDeviceGetUsedBy(tmp); + used_by = virUSBDeviceGetUsedBy(tmp); if (STREQ_NULLABLE(used_by, name)) { VIR_DEBUG("Removing %03d.%03d dom=%s from activeUsbHostdevs", hostdev->source.subsys.u.usb.bus, hostdev->source.subsys.u.usb.device, name); - usbDeviceListDel(driver->activeUsbHostdevs, tmp); + virUSBDeviceListDel(driver->activeUsbHostdevs, tmp); } } } diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h index 8bfd36f..a1b8b9e 100644 --- a/src/qemu/qemu_hostdev.h +++ b/src/qemu/qemu_hostdev.h @@ -38,10 +38,10 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int nhostdevs); int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, bool mandatory, - usbDevice **usb); + virUSBDevicePtr *usb); int qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, const char *name, - usbDeviceList *list); + virUSBDeviceListPtr list); int qemuPrepareHostDevices(virQEMUDriverPtr driver, virDomainDefPtr def, bool coldBoot); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 2fc8b00..c1305f4 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1094,7 +1094,7 @@ int qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver, if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_DEVICES)) { virCgroupPtr cgroup = NULL; - usbDevice *usb; + virUSBDevicePtr usb; qemuCgroupData data; if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup, 0) != 0) { @@ -1104,14 +1104,14 @@ int qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver, goto error; } - if ((usb = usbGetDevice(hostdev->source.subsys.u.usb.bus, + if ((usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus, hostdev->source.subsys.u.usb.device, NULL)) == NULL) goto error; data.vm = vm; data.cgroup = cgroup; - if (usbDeviceFileIterate(usb, qemuSetupHostUsbDeviceCgroup, &data) < 0) + if (virUSBDeviceFileIterate(usb, qemuSetupHostUsbDeviceCgroup, &data) < 0) goto error; } @@ -1142,8 +1142,8 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - usbDeviceList *list; - usbDevice *usb = NULL; + virUSBDeviceList *list; + virUSBDevicePtr usb = NULL; if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -1152,15 +1152,15 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, return -1; } - if (!(list = usbDeviceListNew())) + if (!(list = virUSBDeviceListNew())) goto cleanup; if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0) goto cleanup; - if (usbDeviceListAdd(list, usb) < 0) { - usbFreeDevice(usb); + if (virUSBDeviceListAdd(list, usb) < 0) { + virUSBDeviceFree(usb); usb = NULL; goto cleanup; } @@ -1170,7 +1170,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto cleanup; } - usbDeviceListSteal(list, usb); + virUSBDeviceListSteal(list, usb); } if (virSecurityManagerSetHostdevLabel(driver->securityManager, @@ -1197,7 +1197,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto error; } - usbDeviceListFree(list); + virUSBDeviceListFree(list); return 0; error: @@ -1206,9 +1206,9 @@ error: VIR_WARN("Unable to restore host device labelling on hotplug fail"); cleanup: - usbDeviceListFree(list); + virUSBDeviceListFree(list); if (usb) - usbDeviceListSteal(driver->activeUsbHostdevs, usb); + virUSBDeviceListSteal(driver->activeUsbHostdevs, usb); return -1; } @@ -2377,7 +2377,7 @@ qemuDomainDetachHostUsbDevice(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv = vm->privateData; virDomainHostdevSubsysPtr subsys = &detach->source.subsys; - usbDevice *usb; + virUSBDevicePtr usb; int ret; if (!detach->info->alias) { @@ -2399,10 +2399,10 @@ qemuDomainDetachHostUsbDevice(virQEMUDriverPtr driver, if (ret < 0) return -1; - usb = usbGetDevice(subsys->u.usb.bus, subsys->u.usb.device, NULL); + usb = virUSBDeviceNew(subsys->u.usb.bus, subsys->u.usb.device, NULL); if (usb) { - usbDeviceListDel(driver->activeUsbHostdevs, usb); - usbFreeDevice(usb); + virUSBDeviceListDel(driver->activeUsbHostdevs, usb); + virUSBDeviceFree(usb); } else { VIR_WARN("Unable to find device %03d.%03d in list of used USB devices", subsys->u.usb.bus, subsys->u.usb.device); diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index a635a1b..8764758 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -305,7 +305,7 @@ reload_profile(virSecurityManagerPtr mgr, } static int -AppArmorSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, +AppArmorSetSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { struct SDPDOP *ptr = opaque; @@ -769,15 +769,16 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr, switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - vroot); + virUSBDevicePtr usb = + virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + vroot); if (!usb) goto done; - ret = usbDeviceFileIterate(usb, AppArmorSetSecurityUSBLabel, ptr); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, AppArmorSetSecurityUSBLabel, ptr); + virUSBDeviceFree(usb); break; } diff --git a/src/security/security_dac.c b/src/security/security_dac.c index e42d049..bfe292c 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -453,7 +453,7 @@ virSecurityDACSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, static int -virSecurityDACSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, +virSecurityDACSetSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { @@ -489,20 +489,20 @@ virSecurityDACSetSecurityHostdevLabel(virSecurityManagerPtr mgr, switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb; + virUSBDevicePtr usb; if (dev->missing) return 0; - usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - vroot); + usb = virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + vroot); if (!usb) goto done; - ret = usbDeviceFileIterate(usb, virSecurityDACSetSecurityUSBLabel, - params); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, virSecurityDACSetSecurityUSBLabel, + params); + virUSBDeviceFree(usb); break; } @@ -543,9 +543,9 @@ virSecurityDACRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, static int -virSecurityDACRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, - const char *file, - void *opaque ATTRIBUTE_UNUSED) +virSecurityDACRestoreSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, + const char *file, + void *opaque ATTRIBUTE_UNUSED) { return virSecurityDACRestoreSecurityFileLabel(file); } @@ -569,19 +569,19 @@ virSecurityDACRestoreSecurityHostdevLabel(virSecurityManagerPtr mgr, switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb; + virUSBDevicePtr usb; if (dev->missing) return 0; - usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - vroot); + usb = virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + vroot); if (!usb) goto done; - ret = usbDeviceFileIterate(usb, virSecurityDACRestoreSecurityUSBLabel, mgr); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, virSecurityDACRestoreSecurityUSBLabel, mgr); + virUSBDeviceFree(usb); break; } diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 8b1692c..b6b727e 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1145,7 +1145,7 @@ virSecuritySELinuxSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, } static int -virSecuritySELinuxSetSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxSetSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { virSecurityLabelDefPtr secdef; @@ -1169,19 +1169,19 @@ virSecuritySELinuxSetSecurityHostdevSubsysLabel(virDomainDefPtr def, switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb; + virUSBDevicePtr usb; if (dev->missing) return 0; - usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - vroot); + usb = virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + vroot); if (!usb) goto done; - ret = usbDeviceFileIterate(usb, virSecuritySELinuxSetSecurityUSBLabel, def); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, virSecuritySELinuxSetSecurityUSBLabel, def); + virUSBDeviceFree(usb); break; } @@ -1308,7 +1308,7 @@ virSecuritySELinuxRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, } static int -virSecuritySELinuxRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxRestoreSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque ATTRIBUTE_UNUSED) { @@ -1325,19 +1325,19 @@ virSecuritySELinuxRestoreSecurityHostdevSubsysLabel(virDomainHostdevDefPtr dev, switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb; + virUSBDevicePtr usb; if (dev->missing) return 0; - usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - vroot); + usb = virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + vroot); if (!usb) goto done; - ret = usbDeviceFileIterate(usb, virSecuritySELinuxRestoreSecurityUSBLabel, NULL); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, virSecuritySELinuxRestoreSecurityUSBLabel, NULL); + virUSBDeviceFree(usb); break; } diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 227d0f1..7b12a7d 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -845,7 +845,7 @@ vah_add_file_chardev(virBufferPtr buf, } static int -file_iterate_hostdev_cb(usbDevice *dev ATTRIBUTE_UNUSED, +file_iterate_hostdev_cb(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { virBufferPtr buf = opaque; @@ -1007,15 +1007,16 @@ get_files(vahControl * ctl) virDomainHostdevDefPtr dev = ctl->def->hostdevs[i]; switch (dev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: { - usbDevice *usb = usbGetDevice(dev->source.subsys.u.usb.bus, - dev->source.subsys.u.usb.device, - NULL); + virUSBDevicePtr usb = + virUSBDeviceNew(dev->source.subsys.u.usb.bus, + dev->source.subsys.u.usb.device, + NULL); if (usb == NULL) continue; - rc = usbDeviceFileIterate(usb, file_iterate_hostdev_cb, &buf); - usbFreeDevice(usb); + rc = virUSBDeviceFileIterate(usb, file_iterate_hostdev_cb, &buf); + virUSBDeviceFree(usb); if (rc != 0) goto clean; break; diff --git a/src/util/virusb.c b/src/util/virusb.c index 1ec5f45..88119e4 100644 --- a/src/util/virusb.c +++ b/src/util/virusb.c @@ -46,7 +46,7 @@ /* For virReportOOMError() and virReportSystemError() */ #define VIR_FROM_THIS VIR_FROM_NONE -struct _usbDevice { +struct _virUSBDevice { unsigned int bus; unsigned int dev; @@ -56,19 +56,19 @@ struct _usbDevice { const char *used_by; /* name of the domain using this dev */ }; -struct _usbDeviceList { +struct _virUSBDeviceList { unsigned int count; - usbDevice **devs; + virUSBDevicePtr *devs; }; typedef enum { USB_DEVICE_ALL = 0, USB_DEVICE_FIND_BY_VENDOR = 1 << 0, USB_DEVICE_FIND_BY_BUS = 1 << 1, -} usbDeviceFindFlags; +} virUSBDeviceFindFlags; -static int usbSysReadFile(const char *f_name, const char *d_name, - int base, unsigned int *value) +static int virUSBSysReadFile(const char *f_name, const char *d_name, + int base, unsigned int *value) { int ret = -1, tmp; char *buf = NULL; @@ -97,22 +97,22 @@ cleanup: return ret; } -static usbDeviceList * -usbDeviceSearch(unsigned int vendor, - unsigned int product, - unsigned int bus, - unsigned int devno, - const char *vroot, - unsigned int flags) +static virUSBDeviceListPtr +virUSBDeviceSearch(unsigned int vendor, + unsigned int product, + unsigned int bus, + unsigned int devno, + const char *vroot, + unsigned int flags) { DIR *dir = NULL; bool found = false; char *ignore = NULL; struct dirent *de; - usbDeviceList *list = NULL, *ret = NULL; - usbDevice *usb; + virUSBDeviceListPtr list = NULL, ret = NULL; + virUSBDevicePtr usb; - if (!(list = usbDeviceListNew())) + if (!(list = virUSBDeviceListNew())) goto cleanup; dir = opendir(USB_SYSFS "/devices"); @@ -130,12 +130,12 @@ usbDeviceSearch(unsigned int vendor, if (de->d_name[0] == '.' || strchr(de->d_name, ':')) continue; - if (usbSysReadFile("idVendor", de->d_name, - 16, &found_vend) < 0) + if (virUSBSysReadFile("idVendor", de->d_name, + 16, &found_vend) < 0) goto cleanup; - if (usbSysReadFile("idProduct", de->d_name, - 16, &found_prod) < 0) + if (virUSBSysReadFile("idProduct", de->d_name, + 16, &found_prod) < 0) goto cleanup; if (STRPREFIX(de->d_name, "usb")) @@ -148,8 +148,8 @@ usbDeviceSearch(unsigned int vendor, goto cleanup; } - if (usbSysReadFile("devnum", de->d_name, - 10, &found_devno) < 0) + if (virUSBSysReadFile("devnum", de->d_name, + 10, &found_devno) < 0) goto cleanup; if ((flags & USB_DEVICE_FIND_BY_VENDOR) && @@ -162,12 +162,12 @@ usbDeviceSearch(unsigned int vendor, found = true; } - usb = usbGetDevice(found_bus, found_devno, vroot); + usb = virUSBDeviceNew(found_bus, found_devno, vroot); if (!usb) goto cleanup; - if (usbDeviceListAdd(list, usb) < 0) { - usbFreeDevice(usb); + if (virUSBDeviceListAdd(list, usb) < 0) { + virUSBDeviceFree(usb); goto cleanup; } @@ -184,27 +184,27 @@ cleanup: } if (!ret) - usbDeviceListFree(list); + virUSBDeviceListFree(list); return ret; } int -usbFindDeviceByVendor(unsigned int vendor, - unsigned product, - const char *vroot, - bool mandatory, - usbDeviceList **devices) +virUSBDeviceFindByVendor(unsigned int vendor, + unsigned product, + const char *vroot, + bool mandatory, + virUSBDeviceListPtr *devices) { - usbDeviceList *list; + virUSBDeviceListPtr list; int count; - if (!(list = usbDeviceSearch(vendor, product, 0 , 0, - vroot, - USB_DEVICE_FIND_BY_VENDOR))) + if (!(list = virUSBDeviceSearch(vendor, product, 0 , 0, + vroot, + USB_DEVICE_FIND_BY_VENDOR))) return -1; if (list->count == 0) { - usbDeviceListFree(list); + virUSBDeviceListFree(list); if (!mandatory) { VIR_DEBUG("Did not find USB device %x:%x", vendor, product); @@ -222,27 +222,27 @@ usbFindDeviceByVendor(unsigned int vendor, if (devices) *devices = list; else - usbDeviceListFree(list); + virUSBDeviceListFree(list); return count; } int -usbFindDeviceByBus(unsigned int bus, - unsigned devno, - const char *vroot, - bool mandatory, - usbDevice **usb) +virUSBDeviceFindByBus(unsigned int bus, + unsigned devno, + const char *vroot, + bool mandatory, + virUSBDevicePtr *usb) { - usbDeviceList *list; + virUSBDeviceListPtr list; - if (!(list = usbDeviceSearch(0, 0, bus, devno, - vroot, - USB_DEVICE_FIND_BY_BUS))) + if (!(list = virUSBDeviceSearch(0, 0, bus, devno, + vroot, + USB_DEVICE_FIND_BY_BUS))) return -1; if (list->count == 0) { - usbDeviceListFree(list); + virUSBDeviceListFree(list); if (!mandatory) { VIR_DEBUG("Did not find USB device bus:%u device:%u", bus, devno); @@ -258,32 +258,32 @@ usbFindDeviceByBus(unsigned int bus, } if (usb) { - *usb = usbDeviceListGet(list, 0); - usbDeviceListSteal(list, *usb); + *usb = virUSBDeviceListGet(list, 0); + virUSBDeviceListSteal(list, *usb); } - usbDeviceListFree(list); + virUSBDeviceListFree(list); return 0; } int -usbFindDevice(unsigned int vendor, - unsigned int product, - unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - usbDevice **usb) +virUSBDeviceFind(unsigned int vendor, + unsigned int product, + unsigned int bus, + unsigned int devno, + const char *vroot, + bool mandatory, + virUSBDevicePtr *usb) { - usbDeviceList *list; + virUSBDeviceListPtr list; unsigned int flags = USB_DEVICE_FIND_BY_VENDOR|USB_DEVICE_FIND_BY_BUS; - if (!(list = usbDeviceSearch(vendor, product, bus, devno, - vroot, flags))) + if (!(list = virUSBDeviceSearch(vendor, product, bus, devno, + vroot, flags))) return -1; if (list->count == 0) { - usbDeviceListFree(list); + virUSBDeviceListFree(list); if (!mandatory) { VIR_DEBUG("Did not find USB device %x:%x bus:%u device:%u", vendor, product, bus, devno); @@ -299,20 +299,20 @@ usbFindDevice(unsigned int vendor, } if (usb) { - *usb = usbDeviceListGet(list, 0); - usbDeviceListSteal(list, *usb); + *usb = virUSBDeviceListGet(list, 0); + virUSBDeviceListSteal(list, *usb); } - usbDeviceListFree(list); + virUSBDeviceListFree(list); return 0; } -usbDevice * -usbGetDevice(unsigned int bus, - unsigned int devno, - const char *vroot) +virUSBDevicePtr +virUSBDeviceNew(unsigned int bus, + unsigned int devno, + const char *vroot) { - usbDevice *dev; + virUSBDevicePtr dev; if (VIR_ALLOC(dev) < 0) { virReportOOMError(); @@ -327,14 +327,14 @@ usbGetDevice(unsigned int bus, virReportError(VIR_ERR_INTERNAL_ERROR, _("dev->name buffer overflow: %.3o:%.3o"), dev->bus, dev->dev); - usbFreeDevice(dev); + virUSBDeviceFree(dev); return NULL; } if (virAsprintf(&dev->path, "%s" USB_DEVFS "%03d/%03d", vroot ? vroot : "", dev->bus, dev->dev) < 0) { virReportOOMError(); - usbFreeDevice(dev); + virUSBDeviceFree(dev); return NULL; } @@ -344,7 +344,7 @@ usbGetDevice(unsigned int bus, virReportError(VIR_ERR_INTERNAL_ERROR, _("dev->id buffer overflow: %d %d"), dev->bus, dev->dev); - usbFreeDevice(dev); + virUSBDeviceFree(dev); return NULL; } @@ -354,7 +354,7 @@ usbGetDevice(unsigned int bus, } void -usbFreeDevice(usbDevice *dev) +virUSBDeviceFree(virUSBDevicePtr dev) { if (!dev) return; @@ -364,45 +364,45 @@ usbFreeDevice(usbDevice *dev) } -void usbDeviceSetUsedBy(usbDevice *dev, - const char *name) +void virUSBDeviceSetUsedBy(virUSBDevicePtr dev, + const char *name) { dev->used_by = name; } -const char * usbDeviceGetUsedBy(usbDevice *dev) +const char * virUSBDeviceGetUsedBy(virUSBDevicePtr dev) { return dev->used_by; } -const char *usbDeviceGetName(usbDevice *dev) +const char *virUSBDeviceGetName(virUSBDevicePtr dev) { return dev->name; } -unsigned int usbDeviceGetBus(usbDevice *dev) +unsigned int virUSBDeviceGetBus(virUSBDevicePtr dev) { return dev->bus; } -unsigned int usbDeviceGetDevno(usbDevice *dev) +unsigned int virUSBDeviceGetDevno(virUSBDevicePtr dev) { return dev->dev; } -int usbDeviceFileIterate(usbDevice *dev, - usbDeviceFileActor actor, - void *opaque) +int virUSBDeviceFileIterate(virUSBDevicePtr dev, + virUSBDeviceFileActor actor, + void *opaque) { return (actor)(dev, dev->path, opaque); } -usbDeviceList * -usbDeviceListNew(void) +virUSBDeviceListPtr +virUSBDeviceListNew(void) { - usbDeviceList *list; + virUSBDeviceListPtr list; if (VIR_ALLOC(list) < 0) { virReportOOMError(); @@ -413,7 +413,7 @@ usbDeviceListNew(void) } void -usbDeviceListFree(usbDeviceList *list) +virUSBDeviceListFree(virUSBDeviceListPtr list) { int i; @@ -421,17 +421,17 @@ usbDeviceListFree(usbDeviceList *list) return; for (i = 0; i < list->count; i++) - usbFreeDevice(list->devs[i]); + virUSBDeviceFree(list->devs[i]); VIR_FREE(list->devs); VIR_FREE(list); } int -usbDeviceListAdd(usbDeviceList *list, - usbDevice *dev) +virUSBDeviceListAdd(virUSBDeviceListPtr list, + virUSBDevicePtr dev) { - if (usbDeviceListFind(list, dev)) { + if (virUSBDeviceListFind(list, dev)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Device %s is already in use"), dev->name); @@ -448,9 +448,9 @@ usbDeviceListAdd(usbDeviceList *list, return 0; } -usbDevice * -usbDeviceListGet(usbDeviceList *list, - int idx) +virUSBDevicePtr +virUSBDeviceListGet(virUSBDeviceListPtr list, + int idx) { if (idx >= list->count || idx < 0) @@ -460,16 +460,16 @@ usbDeviceListGet(usbDeviceList *list, } int -usbDeviceListCount(usbDeviceList *list) +virUSBDeviceListCount(virUSBDeviceListPtr list) { return list->count; } -usbDevice * -usbDeviceListSteal(usbDeviceList *list, - usbDevice *dev) +virUSBDevicePtr +virUSBDeviceListSteal(virUSBDeviceListPtr list, + virUSBDevicePtr dev) { - usbDevice *ret = NULL; + virUSBDevicePtr ret = NULL; int i; for (i = 0; i < list->count; i++) { @@ -494,16 +494,16 @@ usbDeviceListSteal(usbDeviceList *list, } void -usbDeviceListDel(usbDeviceList *list, - usbDevice *dev) +virUSBDeviceListDel(virUSBDeviceListPtr list, + virUSBDevicePtr dev) { - usbDevice *ret = usbDeviceListSteal(list, dev); - usbFreeDevice(ret); + virUSBDevicePtr ret = virUSBDeviceListSteal(list, dev); + virUSBDeviceFree(ret); } -usbDevice * -usbDeviceListFind(usbDeviceList *list, - usbDevice *dev) +virUSBDevicePtr +virUSBDeviceListFind(virUSBDeviceListPtr list, + virUSBDevicePtr dev) { int i; diff --git a/src/util/virusb.h b/src/util/virusb.h index 917dd15..f231a41 100644 --- a/src/util/virusb.h +++ b/src/util/virusb.h @@ -29,40 +29,42 @@ # define USB_DEVFS "/dev/bus/usb/" -typedef struct _usbDevice usbDevice; -typedef struct _usbDeviceList usbDeviceList; +typedef struct _virUSBDevice virUSBDevice; +typedef virUSBDevice *virUSBDevicePtr; +typedef struct _virUSBDeviceList virUSBDeviceList; +typedef virUSBDeviceList *virUSBDeviceListPtr; -usbDevice *usbGetDevice(unsigned int bus, - unsigned int devno, - const char *vroot); +virUSBDevicePtr virUSBDeviceNew(unsigned int bus, + unsigned int devno, + const char *vroot); -int usbFindDeviceByBus(unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - usbDevice **usb); - -int usbFindDeviceByVendor(unsigned int vendor, - unsigned int product, +int virUSBDeviceFindByBus(unsigned int bus, + unsigned int devno, const char *vroot, bool mandatory, - usbDeviceList **devices); + virUSBDevicePtr *usb); + +int virUSBDeviceFindByVendor(unsigned int vendor, + unsigned int product, + const char *vroot, + bool mandatory, + virUSBDeviceListPtr *devices); -int usbFindDevice(unsigned int vendor, - unsigned int product, - unsigned int bus, - unsigned int devno, - const char *vroot, - bool mandatory, - usbDevice **usb); +int virUSBDeviceFind(unsigned int vendor, + unsigned int product, + unsigned int bus, + unsigned int devno, + const char *vroot, + bool mandatory, + virUSBDevicePtr *usb); -void usbFreeDevice (usbDevice *dev); -void usbDeviceSetUsedBy(usbDevice *dev, const char *name); -const char *usbDeviceGetUsedBy(usbDevice *dev); -const char *usbDeviceGetName(usbDevice *dev); +void virUSBDeviceFree(virUSBDevicePtr dev); +void virUSBDeviceSetUsedBy(virUSBDevicePtr dev, const char *name); +const char *virUSBDeviceGetUsedBy(virUSBDevicePtr dev); +const char *virUSBDeviceGetName(virUSBDevicePtr dev); -unsigned int usbDeviceGetBus(usbDevice *dev); -unsigned int usbDeviceGetDevno(usbDevice *dev); +unsigned int virUSBDeviceGetBus(virUSBDevicePtr dev); +unsigned int virUSBDeviceGetDevno(virUSBDevicePtr dev); /* * Callback that will be invoked once for each file @@ -71,25 +73,25 @@ unsigned int usbDeviceGetDevno(usbDevice *dev); * Should return 0 if successfully processed, or * -1 to indicate error and abort iteration */ -typedef int (*usbDeviceFileActor)(usbDevice *dev, - const char *path, void *opaque); +typedef int (*virUSBDeviceFileActor)(virUSBDevicePtr dev, + const char *path, void *opaque); -int usbDeviceFileIterate(usbDevice *dev, - usbDeviceFileActor actor, - void *opaque); +int virUSBDeviceFileIterate(virUSBDevicePtr dev, + virUSBDeviceFileActor actor, + void *opaque); -usbDeviceList *usbDeviceListNew(void); -void usbDeviceListFree(usbDeviceList *list); -int usbDeviceListAdd(usbDeviceList *list, - usbDevice *dev); -usbDevice * usbDeviceListGet(usbDeviceList *list, - int idx); -int usbDeviceListCount(usbDeviceList *list); -usbDevice * usbDeviceListSteal(usbDeviceList *list, - usbDevice *dev); -void usbDeviceListDel(usbDeviceList *list, - usbDevice *dev); -usbDevice * usbDeviceListFind(usbDeviceList *list, - usbDevice *dev); +virUSBDeviceListPtr virUSBDeviceListNew(void); +void virUSBDeviceListFree(virUSBDeviceListPtr list); +int virUSBDeviceListAdd(virUSBDeviceListPtr list, + virUSBDevicePtr dev); +virUSBDevicePtr virUSBDeviceListGet(virUSBDeviceListPtr list, + int idx); +int virUSBDeviceListCount(virUSBDeviceListPtr list); +virUSBDevicePtr virUSBDeviceListSteal(virUSBDeviceListPtr list, + virUSBDevicePtr dev); +void virUSBDeviceListDel(virUSBDeviceListPtr list, + virUSBDevicePtr dev); +virUSBDevicePtr virUSBDeviceListFind(virUSBDeviceListPtr list, + virUSBDevicePtr dev); #endif /* __VIR_USB_H__ */ -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> To allow modifications to the lists to be synchronized, convert virPCIDeviceList and virUSBDeviceList into virObjectLockable classes. The locking, however, will not be self-contained. The users of these classes will have to call virObjectLock/Unlock in the critical regions. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/lxc/lxc_hostdev.c | 4 ++-- src/qemu/qemu_driver.c | 6 +++--- src/qemu/qemu_hostdev.c | 20 ++++++++++---------- src/qemu/qemu_hotplug.c | 4 ++-- src/util/virpci.c | 35 ++++++++++++++++++++++++++--------- src/util/virpci.h | 2 +- src/util/virusb.c | 48 ++++++++++++++++++++++++++++++++---------------- src/util/virusb.h | 2 +- 8 files changed, 77 insertions(+), 44 deletions(-) diff --git a/src/lxc/lxc_hostdev.c b/src/lxc/lxc_hostdev.c index a627714..33b0b60 100644 --- a/src/lxc/lxc_hostdev.c +++ b/src/lxc/lxc_hostdev.c @@ -167,7 +167,7 @@ virLXCFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, *usb = virUSBDeviceListGet(devs, 0); virUSBDeviceListSteal(devs, *usb); } - virUSBDeviceListFree(devs); + virObjectUnref(devs); if (rc == 0) { goto out; @@ -273,7 +273,7 @@ virLXCPrepareHostUSBDevices(virLXCDriverPtr driver, ret = 0; cleanup: - virUSBDeviceListFree(list); + virObjectUnref(list); return ret; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index cba926d..eb4a132 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1048,9 +1048,9 @@ qemuShutdown(void) { qemuDriverLock(qemu_driver); virNWFilterUnRegisterCallbackDriver(&qemuCallbackDriver); - virPCIDeviceListFree(qemu_driver->activePciHostdevs); - virPCIDeviceListFree(qemu_driver->inactivePciHostdevs); - virUSBDeviceListFree(qemu_driver->activeUsbHostdevs); + virObjectUnref(qemu_driver->activePciHostdevs); + virObjectUnref(qemu_driver->inactivePciHostdevs); + virObjectUnref(qemu_driver->activeUsbHostdevs); virHashFree(qemu_driver->sharedDisks); virCapabilitiesFree(qemu_driver->caps); qemuCapsCacheFree(qemu_driver->capsCache); diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 46a17a7..3dfcf63 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -56,13 +56,13 @@ qemuGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) hostdev->source.subsys.u.pci.slot, hostdev->source.subsys.u.pci.function); if (!dev) { - virPCIDeviceListFree(list); + virObjectUnref(list); return NULL; } if (virPCIDeviceListAdd(list, dev) < 0) { virPCIDeviceFree(dev); - virPCIDeviceListFree(list); + virObjectUnref(list); return NULL; } @@ -98,14 +98,14 @@ qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver, hostdev->source.subsys.u.pci.slot, hostdev->source.subsys.u.pci.function); if (!dev) { - virPCIDeviceListFree(list); + virObjectUnref(list); return NULL; } if ((activeDev = virPCIDeviceListFind(driver->activePciHostdevs, dev))) { if (virPCIDeviceListAdd(list, activeDev) < 0) { virPCIDeviceFree(dev); - virPCIDeviceListFree(list); + virObjectUnref(list); return NULL; } } @@ -557,7 +557,7 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, inactivedevs: /* Only steal all the devices from driver->activePciHostdevs. We will - * free them in virPCIDeviceListFree(). + * free them in virObjectUnref(). */ while (virPCIDeviceListCount(pcidevs) > 0) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, 0); @@ -580,7 +580,7 @@ reattachdevs: } cleanup: - virPCIDeviceListFree(pcidevs); + virObjectUnref(pcidevs); virObjectUnref(cfg); return ret; } @@ -686,7 +686,7 @@ qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev, *usb = virUSBDeviceListGet(devs, 0); virUSBDeviceListSteal(devs, *usb); } - virUSBDeviceListFree(devs); + virObjectUnref(devs); if (rc == 0) { goto out; @@ -792,7 +792,7 @@ qemuPrepareHostUSBDevices(virQEMUDriverPtr driver, ret = 0; cleanup: - virUSBDeviceListFree(list); + virObjectUnref(list); return ret; } @@ -880,7 +880,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, continue; } - /* virPCIDeviceListFree() will take care of freeing the dev. */ + /* virObjectUnref() will take care of freeing the dev. */ virPCIDeviceListSteal(driver->activePciHostdevs, dev); } @@ -916,7 +916,7 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, qemuReattachPciDevice(dev, driver); } - virPCIDeviceListFree(pcidevs); + virObjectUnref(pcidevs); cleanup: virObjectUnref(cfg); } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c1305f4..bf71eba 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1197,7 +1197,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto error; } - virUSBDeviceListFree(list); + virObjectUnref(list); return 0; error: @@ -1206,7 +1206,7 @@ error: VIR_WARN("Unable to restore host device labelling on hotplug fail"); cleanup: - virUSBDeviceListFree(list); + virObjectUnref(list); if (usb) virUSBDeviceListSteal(driver->activeUsbHostdevs, usb); return -1; diff --git a/src/util/virpci.c b/src/util/virpci.c index 695f372..5044f40 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -74,6 +74,8 @@ struct _virPCIDevice { }; struct _virPCIDeviceList { + virObjectLockable parent; + unsigned count; virPCIDevicePtr *devs; }; @@ -165,6 +167,23 @@ struct _virPCIDeviceList { PCI_EXT_CAP_ACS_CR | \ PCI_EXT_CAP_ACS_UF) +static virClassPtr virPCIDeviceListClass; + +static void virPCIDeviceListDispose(void *obj); + +static int virPCIOnceInit(void) +{ + if (!(virPCIDeviceListClass = virClassNew(virClassForObjectLockable(), + "virPCIDeviceList", + sizeof(virPCIDeviceList), + virPCIDeviceListDispose))) + return -1; + + return 0; +} + +VIR_ONCE_GLOBAL_INIT(virPCI) + static int virPCIDeviceConfigOpen(virPCIDevicePtr dev, bool fatal) { @@ -1505,22 +1524,21 @@ virPCIDeviceListNew(void) { virPCIDeviceListPtr list; - if (VIR_ALLOC(list) < 0) { - virReportOOMError(); + if (virPCIInitialize() < 0) + return NULL; + + if (!(list = virObjectLockableNew(virPCIDeviceListClass))) return NULL; - } return list; } -void -virPCIDeviceListFree(virPCIDeviceListPtr list) +static void +virPCIDeviceListDispose(void *obj) { + virPCIDeviceListPtr list = obj; int i; - if (!list) - return; - for (i = 0; i < list->count; i++) { virPCIDeviceFree(list->devs[i]); list->devs[i] = NULL; @@ -1528,7 +1546,6 @@ virPCIDeviceListFree(virPCIDeviceListPtr list) list->count = 0; VIR_FREE(list->devs); - VIR_FREE(list); } int diff --git a/src/util/virpci.h b/src/util/virpci.h index 3ca7545..4eaf788 100644 --- a/src/util/virpci.h +++ b/src/util/virpci.h @@ -25,6 +25,7 @@ # define __VIR_PCI_H__ # include "internal.h" +# include "virobject.h" typedef struct _virPCIDevice virPCIDevice; typedef virPCIDevice *virPCIDevicePtr; @@ -78,7 +79,6 @@ void virPCIDeviceReAttachInit(virPCIDevice *dev); virPCIDeviceListPtr virPCIDeviceListNew(void); -void virPCIDeviceListFree(virPCIDeviceListPtr list); int virPCIDeviceListAdd(virPCIDeviceListPtr list, virPCIDevicePtr dev); virPCIDevicePtr virPCIDeviceListGet(virPCIDeviceListPtr list, diff --git a/src/util/virusb.c b/src/util/virusb.c index 88119e4..5974602 100644 --- a/src/util/virusb.c +++ b/src/util/virusb.c @@ -57,6 +57,7 @@ struct _virUSBDevice { }; struct _virUSBDeviceList { + virObjectLockable parent; unsigned int count; virUSBDevicePtr *devs; }; @@ -67,6 +68,23 @@ typedef enum { USB_DEVICE_FIND_BY_BUS = 1 << 1, } virUSBDeviceFindFlags; +static virClassPtr virUSBDeviceListClass; + +static void virUSBDeviceListDispose(void *obj); + +static int virUSBOnceInit(void) +{ + if (!(virUSBDeviceListClass = virClassNew(virClassForObjectLockable(), + "virUSBDeviceList", + sizeof(virUSBDeviceList), + virUSBDeviceListDispose))) + return -1; + + return 0; +} + +VIR_ONCE_GLOBAL_INIT(virUSB) + static int virUSBSysReadFile(const char *f_name, const char *d_name, int base, unsigned int *value) { @@ -184,7 +202,7 @@ cleanup: } if (!ret) - virUSBDeviceListFree(list); + virObjectUnref(list); return ret; } @@ -204,7 +222,7 @@ virUSBDeviceFindByVendor(unsigned int vendor, return -1; if (list->count == 0) { - virUSBDeviceListFree(list); + virObjectUnref(list); if (!mandatory) { VIR_DEBUG("Did not find USB device %x:%x", vendor, product); @@ -222,7 +240,7 @@ virUSBDeviceFindByVendor(unsigned int vendor, if (devices) *devices = list; else - virUSBDeviceListFree(list); + virObjectUnref(list); return count; } @@ -242,7 +260,7 @@ virUSBDeviceFindByBus(unsigned int bus, return -1; if (list->count == 0) { - virUSBDeviceListFree(list); + virObjectUnref(list); if (!mandatory) { VIR_DEBUG("Did not find USB device bus:%u device:%u", bus, devno); @@ -261,7 +279,7 @@ virUSBDeviceFindByBus(unsigned int bus, *usb = virUSBDeviceListGet(list, 0); virUSBDeviceListSteal(list, *usb); } - virUSBDeviceListFree(list); + virObjectUnref(list); return 0; } @@ -283,7 +301,7 @@ virUSBDeviceFind(unsigned int vendor, return -1; if (list->count == 0) { - virUSBDeviceListFree(list); + virObjectUnref(list); if (!mandatory) { VIR_DEBUG("Did not find USB device %x:%x bus:%u device:%u", vendor, product, bus, devno); @@ -302,7 +320,7 @@ virUSBDeviceFind(unsigned int vendor, *usb = virUSBDeviceListGet(list, 0); virUSBDeviceListSteal(list, *usb); } - virUSBDeviceListFree(list); + virObjectUnref(list); return 0; } @@ -404,27 +422,25 @@ virUSBDeviceListNew(void) { virUSBDeviceListPtr list; - if (VIR_ALLOC(list) < 0) { - virReportOOMError(); + if (virUSBInitialize() < 0) + return NULL; + + if (!(list = virObjectLockableNew(virUSBDeviceListClass))) return NULL; - } return list; } -void -virUSBDeviceListFree(virUSBDeviceListPtr list) +static void +virUSBDeviceListDispose(void *obj) { + virUSBDeviceListPtr list = obj; int i; - if (!list) - return; - for (i = 0; i < list->count; i++) virUSBDeviceFree(list->devs[i]); VIR_FREE(list->devs); - VIR_FREE(list); } int diff --git a/src/util/virusb.h b/src/util/virusb.h index f231a41..aa59d12 100644 --- a/src/util/virusb.h +++ b/src/util/virusb.h @@ -26,6 +26,7 @@ # define __VIR_USB_H__ # include "internal.h" +# include "virobject.h" # define USB_DEVFS "/dev/bus/usb/" @@ -81,7 +82,6 @@ int virUSBDeviceFileIterate(virUSBDevicePtr dev, void *opaque); virUSBDeviceListPtr virUSBDeviceListNew(void); -void virUSBDeviceListFree(virUSBDeviceListPtr list); int virUSBDeviceListAdd(virUSBDeviceListPtr list, virUSBDevicePtr dev); virUSBDevicePtr virUSBDeviceListGet(virUSBDeviceListPtr list, -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Currently the activePciHostdevs, inactivePciHostdevsd and activeUsbHostdevs lists are all implicitly protected by the QEMU driver lock. Now that the lists all inherit from the virObjectLockable, we can make the locking explicit, removing the dependency on the QEMU driver lock for correctness. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/qemu/qemu_driver.c | 15 ++++++++++++- src/qemu/qemu_hostdev.c | 57 ++++++++++++++++++++++++++++++++++++------------- src/qemu/qemu_hotplug.c | 6 ++++++ 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index eb4a132..ab79f9a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10036,6 +10036,8 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) return -1; qemuDriverLock(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); in_inactive_list = virPCIDeviceListFind(driver->inactivePciHostdevs, pci); if (virPCIDeviceDettach(pci, driver->activePciHostdevs, @@ -10044,6 +10046,8 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) ret = 0; out: + virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(driver->activePciHostdevs); qemuDriverUnlock(driver); if (in_inactive_list) virPCIDeviceFree(pci); @@ -10066,6 +10070,9 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) if (!pci) return -1; + qemuDriverLock(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); other = virPCIDeviceListFind(driver->activePciHostdevs, pci); if (other) { const char *other_name = virPCIDeviceGetUsedBy(other); @@ -10078,17 +10085,19 @@ qemuNodeDeviceReAttach(virNodeDevicePtr dev) virReportError(VIR_ERR_OPERATION_INVALID, _("PCI device %s is still in use"), virPCIDeviceGetName(pci)); + goto out; } virPCIDeviceReAttachInit(pci); - qemuDriverLock(driver); if (virPCIDeviceReAttach(pci, driver->activePciHostdevs, driver->inactivePciHostdevs, "pci-stub") < 0) goto out; ret = 0; out: + virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(driver->activePciHostdevs); qemuDriverUnlock(driver); virPCIDeviceFree(pci); return ret; @@ -10110,6 +10119,8 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) return -1; qemuDriverLock(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); if (virPCIDeviceReset(pci, driver->activePciHostdevs, driver->inactivePciHostdevs) < 0) @@ -10117,6 +10128,8 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) ret = 0; out: + virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(driver->activePciHostdevs); qemuDriverUnlock(driver); virPCIDeviceFree(pci); return ret; diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 3dfcf63..34a339c 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -72,6 +72,9 @@ qemuGetPciHostDeviceList(virDomainHostdevDefPtr *hostdevs, int nhostdevs) return list; } +/* + * Pre-condition: driver->activePciHostdevs is locked + */ static virPCIDeviceListPtr qemuGetActivePciHostDeviceList(virQEMUDriverPtr driver, virDomainHostdevDefPtr *hostdevs, @@ -121,10 +124,14 @@ int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, { virDomainHostdevDefPtr hostdev = NULL; int i; + int ret = -1; if (!def->nhostdevs) return 0; + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); + for (i = 0; i < def->nhostdevs; i++) { virPCIDevicePtr dev = NULL; hostdev = def->hostdevs[i]; @@ -140,7 +147,7 @@ int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, hostdev->source.subsys.u.pci.function); if (!dev) - return -1; + goto cleanup; virPCIDeviceSetManaged(dev, hostdev->managed); virPCIDeviceSetUsedBy(dev, def->name); @@ -152,11 +159,14 @@ int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver, if (virPCIDeviceListAdd(driver->activePciHostdevs, dev) < 0) { virPCIDeviceFree(dev); - return -1; + goto cleanup; } } - return 0; +cleanup: + virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(driver->inactivePciHostdevs); + return ret; } int @@ -165,10 +175,12 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, { virDomainHostdevDefPtr hostdev = NULL; int i; + int ret = -1; if (!def->nhostdevs) return 0; + virObjectLock(driver->activeUsbHostdevs); for (i = 0; i < def->nhostdevs; i++) { virUSBDevicePtr usb = NULL; hostdev = def->hostdevs[i]; @@ -193,11 +205,13 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver, if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) { virUSBDeviceFree(usb); - return -1; + goto cleanup; } } - - return 0; + ret = 0; +cleanup: + virObjectLock(driver->activeUsbHostdevs); + return ret; } static int @@ -412,6 +426,9 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int ret = -1; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); + if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs))) goto cleanup; @@ -580,19 +597,13 @@ reattachdevs: } cleanup: + virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(driver->inactivePciHostdevs); virObjectUnref(pcidevs); virObjectUnref(cfg); return ret; } -static int -qemuPrepareHostPCIDevices(virQEMUDriverPtr driver, - virDomainDefPtr def) -{ - return qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid, - def->hostdevs, def->nhostdevs); -} - int qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, const char *name, @@ -602,6 +613,7 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, unsigned int count; virUSBDevicePtr tmp; + virObjectLock(driver->activeUsbHostdevs); count = virUSBDeviceListCount(list); for (i = 0; i < count; i++) { @@ -631,6 +643,8 @@ qemuPrepareHostdevUSBDevices(virQEMUDriverPtr driver, if (virUSBDeviceListAdd(driver->activeUsbHostdevs, usb) < 0) goto error; } + + virObjectUnlock(driver->activeUsbHostdevs); return 0; error: @@ -638,6 +652,7 @@ error: tmp = virUSBDeviceListGet(list, i); virUSBDeviceListSteal(driver->activeUsbHostdevs, tmp); } + virObjectUnlock(driver->activeUsbHostdevs); return -1; } @@ -803,7 +818,8 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, if (!def->nhostdevs) return 0; - if (qemuPrepareHostPCIDevices(driver, def) < 0) + if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid, + def->hostdevs, def->nhostdevs) < 0) return -1; if (qemuPrepareHostUSBDevices(driver, def, coldBoot) < 0) @@ -813,6 +829,10 @@ int qemuPrepareHostDevices(virQEMUDriverPtr driver, } +/* + * Pre-condition: driver->inactivePciHostdevs & driver->activePciHostdevs + * are locked + */ void qemuReattachPciDevice(virPCIDevicePtr dev, virQEMUDriverPtr driver) { int retries = 100; @@ -852,6 +872,9 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, int i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); + if (!(pcidevs = qemuGetActivePciHostDeviceList(driver, hostdevs, nhostdevs))) { @@ -918,6 +941,8 @@ void qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, virObjectUnref(pcidevs); cleanup: + virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(driver->inactivePciHostdevs); virObjectUnref(cfg); } @@ -929,6 +954,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, { int i; + virObjectLock(driver->activeUsbHostdevs); for (i = 0; i < nhostdevs; i++) { virDomainHostdevDefPtr hostdev = hostdevs[i]; virUSBDevicePtr usb, tmp; @@ -980,6 +1006,7 @@ qemuDomainReAttachHostUsbDevices(virQEMUDriverPtr driver, virUSBDeviceListDel(driver->activeUsbHostdevs, tmp); } } + virObjectUnlock(driver->activeUsbHostdevs); } void qemuDomainReAttachHostDevices(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index bf71eba..ad91e0d 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2344,6 +2344,8 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, if (detach->parent.data.net) qemuDomainHostdevNetConfigRestore(detach, cfg->stateDir); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); pci = virPCIDeviceNew(subsys->u.pci.domain, subsys->u.pci.bus, subsys->u.pci.slot, subsys->u.pci.function); if (pci) { @@ -2359,6 +2361,8 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, } virPCIDeviceFree(pci); } + virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(driver->inactivePciHostdevs); if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, @@ -2401,7 +2405,9 @@ qemuDomainDetachHostUsbDevice(virQEMUDriverPtr driver, usb = virUSBDeviceNew(subsys->u.usb.bus, subsys->u.usb.device, NULL); if (usb) { + virObjectLock(driver->activeUsbHostdevs); virUSBDeviceListDel(driver->activeUsbHostdevs, usb); + virObjectUnlock(driver->activeUsbHostdevs); virUSBDeviceFree(usb); } else { VIR_WARN("Unable to find device %03d.%03d in list of used USB devices", -- 1.8.0.2

From: "Daniel P. Berrange" <berrange@redhat.com> Annotate the fields in virQEMUDriverPtr to indicate the locking rules for their use Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- src/qemu/qemu_conf.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 4bf1be0..a224ab1 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -154,45 +154,67 @@ struct _virQEMUDriverConfig { struct _virQEMUDriver { virMutex lock; + /* Require lock to get reference on 'config', + * then lockless thereafter */ virQEMUDriverConfigPtr config; + /* Immutable pointer, self-locking APIs */ virThreadPoolPtr workerPool; + /* Atomic increment only */ int nextvmid; + /* Immutable pointer. Unsafe APIs XXX */ virCgroupPtr cgroup; + /* Atomic inc/dec only */ size_t nactive; + /* Immutable pointers. Caller must provide locking */ virStateInhibitCallback inhibitCallback; void *inhibitOpaque; + /* Immutable pointer, self-locking APIs */ virDomainObjListPtr domains; + /* Lazy-load on first use. Unsafe. XXX */ char *qemuImgBinary; + /* Immutable pointer, lockless APIs. Pointless abstraction */ ebtablesContext *ebtables; + /* Require lock while using. Unsafe. XXX */ virCapsPtr caps; + /* Immutable pointer, self-locking APIs */ qemuCapsCachePtr capsCache; + /* Immutable pointer, self-locking APIs */ virDomainEventStatePtr domainEventState; + /* Immutable pointer. Unsafe APIs. XXX */ virSecurityManagerPtr securityManager; + /* Immutable pointers. Requires locks to be held before + * calling APIs. activePciHostdevs must be locked before + * inactivePciHostdevs */ virPCIDeviceListPtr activePciHostdevs; virPCIDeviceListPtr inactivePciHostdevs; virUSBDeviceListPtr activeUsbHostdevs; + /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr sharedDisks; + /* Immutable pointer, self-locking APis */ virPortAllocatorPtr remotePorts; + /* Immutable pointer, lockless APIs*/ virSysinfoDefPtr hostsysinfo; + /* Immutable pointer. XXX check safety */ virLockManagerPluginPtr lockManager; + /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr closeCallbacks; }; -- 1.8.0.2
participants (1)
-
Daniel P. Berrange