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

An update of https://www.redhat.com/archives/libvir-list/2013-January/msg01407.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 v3: - Rebase, since previous series no longer applied to GIT 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 | 635 +++++++++++---------- 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(+), 755 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 f6273c1..ef04634 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -152,6 +152,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")) @@ -164,7 +165,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, @@ -176,6 +177,7 @@ qemuPhysIfaceConnect(virDomainDefPtr def, net->ifname = res_ifname; } + virObjectUnref(cfg); return rc; error: @@ -184,8 +186,9 @@ error: virDomainNetGetActualDirectDev(net), virDomainNetGetActualDirectMode(net), virDomainNetGetActualVirtPortProfile(net), - driver->stateDir)); + cfg->stateDir)); VIR_FREE(res_ifname); + virObjectUnref(cfg); return -1; } @@ -203,6 +206,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; @@ -278,7 +282,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'"), @@ -306,6 +310,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, cleanup: VIR_FREE(brname); + virObjectUnref(cfg); return tapfd; } @@ -3283,6 +3288,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, @@ -3298,7 +3304,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); @@ -3374,6 +3380,8 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, virBufferAsprintf(&buf, ",sndbuf=%lu", net->tune.sndbuf); } + virObjectUnref(cfg); + if (virBufferError(&buf)) { virBufferFreeAndReset(&buf); virReportOOMError(); @@ -4706,7 +4714,7 @@ error: } static int -qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, +qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg, virCommandPtr cmd, virDomainDefPtr def, qemuCapsPtr caps, @@ -4724,11 +4732,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; } @@ -4774,7 +4782,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, } if (!listenAddr) - listenAddr = driver->vncListen; + listenAddr = cfg->vncListen; escapeAddr = strchr(listenAddr, ':') != NULL; if (escapeAddr) @@ -4792,26 +4800,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 */ } @@ -4828,7 +4836,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"); @@ -4884,7 +4892,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")); @@ -4927,7 +4935,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverPtr driver, } if (!listenAddr) - listenAddr = driver->spiceListen; + listenAddr = cfg->spiceListen; if (listenAddr) virBufferAsprintf(&opt, ",addr=%s", listenAddr); @@ -4951,12 +4959,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: @@ -4974,7 +4982,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; @@ -5087,6 +5095,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 " @@ -5159,7 +5168,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); @@ -5208,12 +5217,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; @@ -5225,7 +5234,7 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path", - driver->hugepage_path, NULL); + cfg->hugepagePath, NULL); } virCommandAddArg(cmd, "-smp"); @@ -6108,7 +6117,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); @@ -6554,7 +6563,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; } @@ -7041,21 +7050,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 ee48333..46c1892 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 812bf95..f98a757 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,141 +693,85 @@ 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; @@ -838,35 +789,35 @@ 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; } } - qemu_driver->capsCache = qemuCapsCacheNew(qemu_driver->libDir, - qemu_driver->user, - qemu_driver->group); + qemu_driver->capsCache = qemuCapsCacheNew(cfg->libDir, + cfg->user, + cfg->group); if (!qemu_driver->capsCache) goto error; @@ -880,10 +831,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; @@ -892,20 +843,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) @@ -914,7 +865,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) @@ -929,24 +880,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); @@ -999,18 +952,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; } @@ -1024,22 +980,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, @@ -1078,6 +1028,9 @@ qemuStop(void) { virDomainFree(domains[i]); VIR_FREE(domains); VIR_FREE(flags); + if (conn) + virConnectClose(conn); + virObjectUnref(cfg); return ret; } @@ -1089,8 +1042,6 @@ qemuStop(void) { */ static int qemuShutdown(void) { - int i; - if (!qemu_driver) return -1; @@ -1110,43 +1061,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); - - for (i = 0 ; (qemu_driver->securityDriverNames != NULL && - qemu_driver->securityDriverNames[i] != NULL) ; i++) - VIR_FREE(qemu_driver->securityDriverNames[i]); - VIR_FREE(qemu_driver->securityDriverNames); + 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); @@ -1167,61 +1087,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; + } + + cfg = virQEMUDriverGetConfig(qemu_driver); - if (!(conn->uri = virURIParse(qemu_driver->privileged ? - "qemu:///system" : - "qemu:///session"))) - return VIR_DRV_OPEN_ERROR; + 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) { @@ -1737,6 +1667,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { virDomainPausedReason reason; int eventDetail; int state; + virQEMUDriverConfigPtr cfg = NULL; qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -1754,6 +1685,7 @@ static int qemuDomainSuspend(virDomainPtr dom) { goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); priv = vm->privateData; if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_SUSPEND) < 0) @@ -1792,7 +1724,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; @@ -1807,6 +1739,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -1817,6 +1750,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); @@ -1829,6 +1763,8 @@ static int qemuDomainResume(virDomainPtr dom) { goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0) goto cleanup; @@ -1856,7 +1792,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; @@ -1870,6 +1806,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -2232,6 +2169,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 | @@ -2240,6 +2178,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; @@ -2263,7 +2203,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; } @@ -2298,7 +2238,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; } } @@ -2311,6 +2251,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -2692,6 +2633,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 @@ -2701,7 +2643,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) { @@ -2709,7 +2651,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; } @@ -2729,11 +2671,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); @@ -2764,11 +2706,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'"), @@ -2788,7 +2730,7 @@ cleanup: *needUnlink = need_unlink; if (bypassSecurityDriver) *bypassSecurityDriver = bypass_security; - + virObjectUnref(cfg); return fd; } @@ -3062,6 +3004,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 | @@ -3069,10 +3012,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 " @@ -3110,7 +3054,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); - + virObjectUnref(cfg); return ret; } @@ -3124,12 +3068,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; } @@ -3347,30 +3294,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, @@ -3496,6 +3448,7 @@ qemuDomainScreenshot(virDomainPtr dom, int tmp_fd = -1; char *ret = NULL; bool unlink_tmp = false; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(0, NULL); @@ -3503,6 +3456,7 @@ qemuDomainScreenshot(virDomainPtr dom, goto cleanup; priv = vm->privateData; + cfg = virQEMUDriverGetConfig(driver); if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) goto cleanup; @@ -3522,7 +3476,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; } @@ -3567,6 +3521,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -3575,9 +3530,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: @@ -3586,7 +3543,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(); @@ -3606,7 +3563,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) @@ -3639,6 +3596,7 @@ unlock: virObjectUnref(wdEvent->vm); qemuDriverUnlock(driver); VIR_FREE(wdEvent); + virObjectUnref(cfg); } static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver, @@ -3854,6 +3812,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 | @@ -3865,6 +3824,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, return -1; } + cfg = virQEMUDriverGetConfig(driver); + if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; @@ -3923,7 +3884,7 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, persistentDef->vcpus = nvcpus; } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto endjob; } @@ -3936,6 +3897,7 @@ endjob: cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -3964,10 +3926,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; @@ -4062,7 +4027,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; } @@ -4095,7 +4060,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, } } - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto cleanup; } @@ -4109,6 +4074,7 @@ cleanup: if (vm) virObjectUnlock(vm); virBitmapFree(pcpumap); + virObjectUnref(cfg); return ret; } @@ -4219,10 +4185,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; @@ -4314,7 +4283,7 @@ qemuDomainPinEmulator(virDomainPtr dom, goto cleanup; } - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, cfg->stateDir, vm) < 0) goto cleanup; } @@ -4336,7 +4305,7 @@ qemuDomainPinEmulator(virDomainPtr dom, } } - ret = virDomainSaveConfig(driver->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, persistentDef); goto cleanup; } @@ -4351,6 +4320,7 @@ cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -4879,6 +4849,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); @@ -4957,7 +4928,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; } @@ -4978,7 +4949,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; } @@ -5336,10 +5307,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, @@ -5429,7 +5402,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) @@ -5448,6 +5421,7 @@ cleanup: virObjectUnref(caps); virCommandFree(cmd); virDomainDefFree(def); + virObjectUnref(cfg); return ret; } @@ -5615,8 +5589,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))) @@ -5666,7 +5642,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. @@ -5705,6 +5681,7 @@ cleanup: qemuDomainEventQueue(driver, event); virObjectUnref(caps); qemuDriverUnlock(driver); + virObjectUnref(cfg); return dom; } @@ -5718,11 +5695,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) { @@ -5772,7 +5751,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, @@ -5801,6 +5780,7 @@ cleanup: if (event) qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6436,12 +6416,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); @@ -6556,7 +6539,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; } @@ -6564,7 +6547,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; @@ -6584,6 +6567,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6642,10 +6626,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); @@ -6663,16 +6648,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; } @@ -6701,6 +6686,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -6911,6 +6897,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); @@ -6924,12 +6911,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) @@ -7040,7 +7027,7 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) ret = -1; } @@ -7049,6 +7036,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7254,7 +7242,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; @@ -7281,6 +7269,8 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -7395,7 +7385,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) ret = -1; } @@ -7404,6 +7394,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7579,6 +7570,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); @@ -7599,6 +7591,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, _("No such domain %s"), dom->uuid); goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) @@ -7704,7 +7697,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; } @@ -7713,6 +7706,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -7928,6 +7922,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); @@ -7955,6 +7950,8 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &vmdef) < 0) goto cleanup; @@ -8056,12 +8053,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; @@ -8077,6 +8074,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } #undef SCHED_RANGE_CHECK @@ -8740,6 +8738,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); @@ -8768,6 +8767,8 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -8884,7 +8885,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto cleanup; } @@ -8896,6 +8897,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -9140,12 +9142,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")); @@ -9161,7 +9166,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; } @@ -9211,6 +9216,7 @@ cleanup: VIR_FREE(tmp); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -9229,12 +9235,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")); @@ -9268,9 +9277,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, @@ -9356,6 +9366,7 @@ cleanup: VIR_FORCE_CLOSE(fd); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -9922,6 +9933,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, virDomainObjPtr vm; int ret = -1; enum qemuMigrationJobPhase phase; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(QEMU_MIGRATION_FLAGS, -1); @@ -9935,6 +9947,8 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); + if (!qemuMigrationJobIsActive(vm, QEMU_ASYNC_JOB_MIGRATION_OUT)) goto cleanup; @@ -9955,7 +9969,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; } @@ -9964,6 +9978,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -10398,6 +10413,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; @@ -10412,7 +10428,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, @@ -10427,6 +10443,7 @@ cleanup: disk->format = origformat; disk->backingChain = origchain; disk->readonly = origreadonly; + virObjectUnref(cfg); return ret; } @@ -10513,16 +10530,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 @@ -10552,7 +10569,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"), @@ -10600,7 +10617,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]); @@ -10610,6 +10627,7 @@ cleanup: } } virBitmapFree(created); + virObjectUnref(cfg); return ret; } @@ -11001,6 +11019,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, @@ -11095,10 +11114,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; } @@ -11302,6 +11322,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 | @@ -11336,6 +11357,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")); @@ -11581,7 +11604,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; } @@ -11631,7 +11654,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); @@ -11658,6 +11681,7 @@ cleanup: virDomainSnapshotDefFree(def); VIR_FREE(xml); qemuDriverUnlock(driver); + virObjectUnref(cfg); return snapshot; } @@ -12007,6 +12031,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 | @@ -12034,6 +12059,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")); @@ -12081,7 +12109,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 @@ -12308,7 +12336,7 @@ endjob: cleanup: if (vm && ret == 0) { if (qemuDomainSnapshotWriteMetadata(vm, snap, - driver->snapshotDir) < 0) + cfg->snapshotDir) < 0) ret = -1; else vm->current_snapshot = snap; @@ -12323,6 +12351,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -12331,7 +12360,7 @@ cleanup: typedef struct _virQEMUSnapReparent virQEMUSnapReparent; typedef virQEMUSnapReparent *virQEMUSnapReparentPtr; struct _virQEMUSnapReparent { - virQEMUDriverPtr driver; + virQEMUDriverConfigPtr cfg; virDomainSnapshotObjPtr parent; virDomainObjPtr vm; int err; @@ -12367,9 +12396,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) { @@ -12382,6 +12412,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 | @@ -12396,6 +12427,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, goto cleanup; } + cfg = virQEMUDriverGetConfig(driver); if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot))) goto cleanup; @@ -12434,7 +12466,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); @@ -12445,7 +12477,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; @@ -12478,6 +12510,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -12827,6 +12860,7 @@ qemuDomainBlockPivot(virConnectPtr conn, char *oldsrc = NULL; int oldformat; virStorageFileMetadataPtr oldchain = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); /* Probe the status, if needed. */ if (!disk->mirroring) { @@ -12903,7 +12937,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, @@ -12966,6 +13000,7 @@ cleanup: _("resuming after drive-reopen failed")); } } + virObjectUnref(cfg); return ret; } @@ -13182,6 +13217,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 | @@ -13190,7 +13226,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")); @@ -13294,8 +13330,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); @@ -13345,6 +13381,7 @@ cleanup: VIR_FREE(device); if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -13615,6 +13652,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); @@ -13645,6 +13683,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 " @@ -13747,7 +13787,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")); @@ -13764,6 +13804,7 @@ cleanup: if (vm) virObjectUnlock(vm); qemuDriverUnlock(driver); + virObjectUnref(cfg); return ret; } @@ -13991,6 +14032,7 @@ qemuDomainSetMetadata(virDomainPtr dom, virDomainObjPtr vm; virDomainDefPtr persistentDef; int ret = -1; + virQEMUDriverConfigPtr cfg = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -13998,6 +14040,8 @@ qemuDomainSetMetadata(virDomainPtr dom, if (!(vm = qemuDomObjFromDomain(dom))) goto cleanup; + cfg = virQEMUDriverGetConfig(driver); + if (virDomainLiveConfigHelperMethod(driver->caps, vm, &flags, &persistentDef) < 0) goto cleanup; @@ -14056,7 +14100,7 @@ qemuDomainSetMetadata(virDomainPtr dom, break; } - if (virDomainSaveConfig(driver->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) goto cleanup; } @@ -14065,6 +14109,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 18c4109..6c328d6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -57,10 +57,11 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, { virDomainDiskDefPtr origdisk = NULL; int i; - int ret; + int ret = -1; char *driveAlias = NULL; qemuDomainObjPrivatePtr priv = vm->privateData; int retries = CHANGE_MEDIA_RETRIES; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); for (i = 0 ; i < vm->def->ndisks ; i++) { if (vm->def->disks[i]->bus == disk->bus && @@ -75,13 +76,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 && @@ -89,18 +90,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))) @@ -162,15 +163,15 @@ exit_monitor: 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); @@ -178,7 +179,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } int @@ -229,30 +230,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)) { @@ -312,15 +314,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 && @@ -335,7 +335,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -468,24 +468,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 */ @@ -563,15 +564,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); @@ -579,7 +578,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -589,27 +588,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 */ @@ -657,15 +657,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); @@ -673,7 +671,7 @@ error: if (virDomainLockDiskDetach(driver->lockManager, vm, disk) < 0) VIR_WARN("Unable to release lock on %s", disk->src); - return -1; + goto cleanup; } @@ -697,11 +695,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 @@ -709,7 +708,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, * to the one defined in the network definition. */ if (networkAllocateActualDevice(net) < 0) - return -1; + goto cleanup; actualType = virDomainNetGetActualType(net); @@ -738,7 +737,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) @@ -918,6 +917,7 @@ cleanup: VIR_FORCE_CLOSE(tapfd); VIR_FREE(vhostfd_name); VIR_FORCE_CLOSE(vhostfd); + virObjectUnref(cfg); return ret; @@ -1820,11 +1820,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); @@ -1839,22 +1840,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 @@ -1866,11 +1867,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; @@ -1894,23 +1895,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: @@ -1926,11 +1927,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; @@ -1955,6 +1956,8 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, break; } +cleanup: + virObjectUnref(cfg); return ret; } @@ -2327,42 +2330,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); @@ -2372,14 +2376,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) && @@ -2387,6 +2389,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; } @@ -2546,6 +2550,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) { @@ -2553,7 +2558,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"), @@ -2642,11 +2647,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))) { @@ -2669,6 +2674,7 @@ cleanup: virDomainNetDefFree(detach); } VIR_FREE(hostnet_name); + virObjectUnref(cfg); return ret; } @@ -2683,10 +2689,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); @@ -2708,7 +2717,7 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver, } } if (ret != 0) - goto cleanup; + goto end_job; if (auth->expires) { time_t lifetime = auth->validTo - now; @@ -2733,9 +2742,10 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver, } } -cleanup: +end_job: qemuDomainObjExitMonitorWithDriver(driver, vm); - +cleanup: + virObjectUnref(cfg); return ret; } @@ -2743,17 +2753,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 a2ce007..d1d3d95 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; } @@ -654,6 +659,7 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, virQEMUDriverPtr driver = qemu_driver; qemuDomainObjPrivatePtr priv; virDomainEventPtr event = NULL; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); VIR_DEBUG("vm=%p", vm); @@ -680,7 +686,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); } @@ -698,6 +704,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -709,6 +716,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) { @@ -732,7 +740,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); } @@ -746,6 +754,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -757,6 +766,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) { @@ -777,7 +787,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 @@ -787,7 +797,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); } @@ -801,7 +811,7 @@ unlock: qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -813,6 +823,7 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventRTCChangeNewFromObj(vm, offset); @@ -820,7 +831,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); @@ -831,6 +842,7 @@ qemuProcessHandleRTCChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -843,6 +855,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); @@ -862,7 +875,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); } @@ -899,6 +912,7 @@ qemuProcessHandleWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -917,6 +931,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, const char *srcPath; const char *devAlias; virDomainDiskDefPtr disk; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); disk = qemuProcessFindDomainDiskByAlias(vm, diskAlias); @@ -947,7 +962,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); @@ -963,6 +978,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1117,6 +1133,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); @@ -1131,7 +1148,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); } @@ -1144,7 +1161,7 @@ qemuProcessHandleTrayChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDomainEventQueue(driver, event); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -1155,6 +1172,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); @@ -1172,7 +1190,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); } @@ -1189,6 +1207,7 @@ qemuProcessHandlePMWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1199,6 +1218,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); @@ -1215,7 +1235,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); } @@ -1234,7 +1254,7 @@ qemuProcessHandlePMSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDomainEventQueue(driver, lifecycleEvent); qemuDriverUnlock(driver); } - + virObjectUnref(cfg); return 0; } @@ -1245,6 +1265,7 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { virQEMUDriverPtr driver = qemu_driver; virDomainEventPtr event; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virObjectLock(vm); event = virDomainEventBalloonChangeNewFromObj(vm, actual); @@ -1253,7 +1274,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); @@ -1264,6 +1285,7 @@ qemuProcessHandleBalloonChange(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); return 0; } @@ -1274,6 +1296,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); @@ -1290,7 +1313,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); } @@ -1310,6 +1333,8 @@ qemuProcessHandlePMSuspendDisk(qemuMonitorPtr mon ATTRIBUTE_UNUSED, qemuDriverUnlock(driver); } + virObjectUnref(cfg); + return 0; } @@ -2179,6 +2204,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) { @@ -2187,12 +2213,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); } } @@ -2225,6 +2251,7 @@ qemuProcessInitPasswords(virConnectPtr conn, } cleanup: + virObjectUnref(cfg); return ret; } @@ -2643,28 +2670,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; } } @@ -2685,6 +2712,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(); @@ -2700,7 +2728,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, @@ -2709,7 +2737,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 @@ -2735,12 +2763,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) { @@ -2748,7 +2777,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; } @@ -2767,17 +2796,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); @@ -2795,6 +2825,8 @@ qemuProcessStartCPUs(virQEMUDriverPtr driver, virDomainObjPtr vm, VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); } +cleanup: + virObjectUnref(cfg); return ret; } @@ -3152,6 +3184,7 @@ qemuProcessReconnect(void *opaque) struct qemuDomainJobObj oldjob; int state; int reason; + virQEMUDriverConfigPtr cfg; memcpy(&oldjob, &data->oldjob, sizeof(oldjob)); @@ -3160,7 +3193,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; @@ -3242,7 +3275,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 */ @@ -3276,6 +3309,7 @@ endjob: qemuDriverUnlock(driver); virConnectClose(conn); + virObjectUnref(cfg); return; @@ -3316,6 +3350,7 @@ error: qemuDriverUnlock(driver); virConnectClose(conn); + virObjectUnref(cfg); } static void @@ -3515,6 +3550,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 */ @@ -3537,6 +3573,7 @@ int qemuProcessStart(virConnectPtr conn, if (virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("VM is already active")); + virObjectUnref(cfg); return -1; } @@ -3594,9 +3631,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; @@ -3632,7 +3669,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; @@ -3659,9 +3696,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(); @@ -3671,10 +3708,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; } @@ -3736,7 +3773,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)) @@ -3749,7 +3786,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; @@ -3821,8 +3858,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 */ @@ -3887,7 +3924,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; } @@ -4038,7 +4075,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 */ @@ -4060,6 +4097,7 @@ int qemuProcessStart(virConnectPtr conn, virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); + virObjectUnref(cfg); return 0; @@ -4072,6 +4110,7 @@ cleanup: virCommandFree(cmd); VIR_FORCE_CLOSE(logfile); qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, stop_flags); + virObjectUnref(cfg); return -1; } @@ -4133,12 +4172,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; } @@ -4183,7 +4224,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]; @@ -4277,7 +4318,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 @@ -4354,6 +4395,7 @@ retry: virSetError(orig_err); virFreeError(orig_err); } + virObjectUnref(cfg); } @@ -4376,12 +4418,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; } @@ -4399,10 +4443,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; } @@ -4535,7 +4579,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 */ @@ -4558,6 +4602,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, VIR_FORCE_CLOSE(logfile); VIR_FREE(seclabel); VIR_FREE(sec_managers); + virObjectUnref(cfg); return 0; @@ -4571,6 +4616,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 e465f3d..8062a02 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 { \ @@ -193,17 +192,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"); @@ -252,7 +242,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 88e1c36..4e90b26 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) { @@ -546,17 +551,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); @@ -868,7 +871,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.1

On Fri, Feb 01, 2013 at 11:18:23 +0000, Daniel P. Berrange wrote:
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.
...
15 files changed, 1099 insertions(+), 755 deletions(-)
Uff. I don't want to go through this patch more than once so please don't send v2, just send a diff between v1 and v2, which should be much easier to review.
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;
Missing empty line.
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
...
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f6273c1..ef04634 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c ... @@ -3283,6 +3288,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,
This continues with _("scripts are not supported on interfaces of type %s"), virDomainNetTypeToString(netType)); return NULL; } and you would leak the reference to virQEMUDriverConfigPtr. ...
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ee48333..46c1892 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c ... @@ -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; + }
Looks like it would make sense to merge the two if statements above into one.
+ cfg->dynamicOwnership = privileged ? true : false;
cfg->dynamicOwnership = privileged; would be enough, there are bools on both sides. ...
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 18c4109..6c328d6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c ... @@ -1866,11 +1867,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;
This one should be goto cleanup;
...
@@ -1926,11 +1927,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;
And this one too. ...
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index a2ce007..d1d3d95 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c ... @@ -3515,6 +3550,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 */
This continues as virCheckFlags(VIR_QEMU_PROCESS_START_COLD | VIR_QEMU_PROCESS_START_PAUSED | VIR_QEMU_PROCESS_START_AUTODESROY, -1); and you would leak virQEMUDriverConfigPtr reference. ... Nice refactoring but quite hard to follow especially the part that initializes qemu driver structure. You gain bonus points for not breaking make check syntax-check :-) Jirka

On Fri, Feb 01, 2013 at 09:20:25PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:23 +0000, Daniel P. Berrange wrote:
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.
...
15 files changed, 1099 insertions(+), 755 deletions(-)
Uff. I don't want to go through this patch more than once so please don't send v2, just send a diff between v1 and v2, which should be much easier to review.
Here are the changes I propose - should adress every point you mention. Daniel diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 482989f..376a21d 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -50,6 +50,7 @@ bool qemuCgroupControllerActive(virQEMUDriverPtr driver, { virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); bool ret = false; + if (driver->cgroup == NULL) goto cleanup; if (controller < 0 || controller >= VIR_CGROUP_CONTROLLER_LAST) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index ef04634..fbc5481 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3294,6 +3294,7 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("scripts are not supported on interfaces of type %s"), virDomainNetTypeToString(netType)); + virObjectUnref(cfg); return NULL; } diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 46c1892..454aa35 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -104,16 +104,13 @@ virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged) 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->user = 0; cfg->group = 0; } - cfg->dynamicOwnership = privileged ? true : false; + cfg->dynamicOwnership = privileged; cfg->cgroupControllers = (1 << VIR_CGROUP_CONTROLLER_CPU) | diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 6c328d6..d2b717b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1873,7 +1873,7 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, &dev->data.vnc.auth, cfg->vncPassword); if (ret < 0) - return ret; + goto cleanup; /* Steal the new dev's char * reference */ VIR_FREE(olddev->data.vnc.auth.passwd); @@ -1934,7 +1934,7 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, cfg->spicePassword); if (ret < 0) - return ret; + goto cleanup; /* Steal the new dev's char * reference */ VIR_FREE(olddev->data.spice.auth.passwd); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d1d3d95..bf97edd 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3550,7 +3550,7 @@ int qemuProcessStart(virConnectPtr conn, char *nodeset = NULL; virBitmapPtr nodemask = NULL; unsigned int stop_flags; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + virQEMUDriverConfigPtr cfg; /* Okay, these are just internal flags, * but doesn't hurt to check */ @@ -3558,6 +3558,8 @@ int qemuProcessStart(virConnectPtr conn, VIR_QEMU_PROCESS_START_PAUSED | VIR_QEMU_PROCESS_START_AUTODESROY, -1); + cfg = virQEMUDriverGetConfig(driver); + /* From now on until domain security labeling is done: * if any operation fails and we goto cleanup, we must not * restore any security label as we would overwrite labels -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Tue, Feb 05, 2013 at 11:43:36 +0000, Daniel P. Berrange wrote: ...
Here are the changes I propose - should adress every point you mention.
ACK to the original patch with these modifications squashed in. Jirka

On 02/01/2013 12:18 PM, Daniel P. Berrange wrote:
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ee48333..46c1892 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c Sorry for not noticing earlier, but
- 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;
this indirectly breaks "make check" with prefix=/usr/local
- if (!(driver->spiceTLSx509certdir + if (!(cfg->spiceTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-spice"))) goto no_memory;
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c - driver.vncTLS = 1; - driver.vncTLSx509verify = 1; - driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); because we lose the capability to overwrite the driver config in the test cases. We should either allow to override config options, i.e. something
dito like virQEMUDriverConfigNew(bool privileged, const char *sysconfdir) or let some of the offending qemuxml2argvdataxxx.args files by created from .args.in files by configure. -- Mit freundlichen Grüßen/Kind Regards Viktor Mihajlovski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Martin Jetter Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

On Thu, Feb 07, 2013 at 04:51:51PM +0100, Viktor Mihajlovski wrote:
On 02/01/2013 12:18 PM, Daniel P. Berrange wrote:
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index ee48333..46c1892 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c Sorry for not noticing earlier, but
- 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;
this indirectly breaks "make check" with prefix=/usr/local
- if (!(driver->spiceTLSx509certdir + if (!(cfg->spiceTLSx509certdir = strdup(SYSCONFDIR "/pki/libvirt-spice"))) goto no_memory;
dito
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c - driver.vncTLS = 1; - driver.vncTLSx509verify = 1; - driver.vncTLSx509certdir = strdup("/etc/pki/tls/qemu"); because we lose the capability to overwrite the driver config in the test cases. We should either allow to override config options, i.e. something like virQEMUDriverConfigNew(bool privileged, const char *sysconfdir) or let some of the offending qemuxml2argvdataxxx.args files by created from .args.in files by configure.
Actually we can just update the virQEMUDriverConfigPtr object after it has been created to hardcode the path in the test suite. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 02/07/2013 04:58 PM, Daniel P. Berrange wrote:
Actually we can just update the virQEMUDriverConfigPtr object after it has been created to hardcode the path in the test suite.
indeed ... sometimes I am too ... structured. Sigh. As I am currently fixing up my build environment anyway, I can do that, unless you prefer to do it yourself. -- Mit freundlichen Grüßen/Kind Regards Viktor Mihajlovski IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Martin Jetter Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294

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 | 172 ++++++++++++++++++----------------- 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 | 184 +++++++++++++++++++------------------- 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, 665 insertions(+), 632 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index abf2b6b..990e6e4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -776,18 +776,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); } @@ -807,8 +819,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); @@ -818,8 +830,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; @@ -846,8 +858,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); @@ -1842,15 +1854,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; } @@ -1982,8 +1994,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); @@ -14775,14 +14787,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; @@ -14805,7 +14818,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) && @@ -14820,7 +14833,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; @@ -14839,13 +14852,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; @@ -14884,14 +14898,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; @@ -14920,22 +14934,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) @@ -15046,7 +15060,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 @@ -15056,16 +15070,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)) { @@ -15090,7 +15104,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); @@ -15966,10 +15980,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; @@ -15977,13 +15991,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; @@ -15999,7 +16013,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 9a9e0b1..fab04a2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1907,15 +1907,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); @@ -1975,10 +1975,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); @@ -2000,8 +2000,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, @@ -2138,14 +2138,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, @@ -2163,9 +2163,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); @@ -2366,8 +2366,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 c589236..8fe181b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -284,7 +284,6 @@ virBlkioDeviceWeightArrayClear; virDiskNameToBusDeviceIndex; virDiskNameToIndex; virDomainActualNetDefFree; -virDomainAssignDef; virDomainBlockedReasonTypeFromString; virDomainBlockedReasonTypeToString; virDomainBootMenuTypeFromString; @@ -375,9 +374,6 @@ virDomainEmulatorPinAdd; virDomainEmulatorPinDel; virDomainFeatureStateTypeFromString; virDomainFeatureStateTypeToString; -virDomainFindByID; -virDomainFindByName; -virDomainFindByUUID; virDomainFSDefFree; virDomainFSIndexByName; virDomainFSTypeFromString; @@ -442,9 +438,7 @@ virDomainLifecycleCrashTypeFromString; virDomainLifecycleCrashTypeToString; virDomainLifecycleTypeFromString; virDomainLifecycleTypeToString; -virDomainList; virDomainLiveConfigHelperMethod; -virDomainLoadAllConfigs; virDomainLockFailureTypeFromString; virDomainLockFailureTypeToString; virDomainLookupVcpuPin; @@ -476,12 +470,19 @@ virDomainObjAssignDef; virDomainObjCopyPersistentDef; virDomainObjGetPersistentDef; virDomainObjGetState; -virDomainObjIsDuplicate; -virDomainObjListDeinit; +virDomainObjListAdd; +virDomainObjListExport; +virDomainObjListFindByID; +virDomainObjListFindByName; +virDomainObjListFindByUUID; +virDomainObjListFree; virDomainObjListGetActiveIDs; virDomainObjListGetInactiveNames; -virDomainObjListInit; +virDomainObjListIsDuplicate; +virDomainObjListLoadAllConfigs; +virDomainObjListNew; virDomainObjListNumOfDomains; +virDomainObjListRemove; virDomainObjNew; virDomainObjSetDefTransient; virDomainObjSetState; @@ -496,7 +497,6 @@ virDomainPMSuspendedReasonTypeFromString; virDomainPMSuspendedReasonTypeToString; virDomainRedirdevBusTypeFromString; virDomainRedirdevBusTypeToString; -virDomainRemoveInactive; virDomainRunningReasonTypeFromString; virDomainRunningReasonTypeToString; virDomainSaveConfig; diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 019792b..4c3280e 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -67,7 +67,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 c898753..b6dce0d 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -684,7 +684,7 @@ libxlEventHandler(void *data ATTRIBUTE_UNUSED, const libxl_event *event) goto cleanup; libxlDriverLock(driver); - vm = virDomainFindByID(&driver->domains, event->domid); + vm = virDomainObjListFindByID(driver->domains, event->domid); libxlDriverUnlock(driver); if (!vm) @@ -703,7 +703,7 @@ libxlEventHandler(void *data ATTRIBUTE_UNUSED, const libxl_event *event) } libxlVmReap(driver, vm, reason); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } break; @@ -1052,7 +1052,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); } @@ -1060,7 +1060,7 @@ out: static void libxlReconnectDomains(libxlDriverPrivatePtr driver) { - virHashForEach(driver->domains.objs, libxlReconnectDomain, driver); + virHashForEach(driver->domains->objs, libxlReconnectDomain, driver); } static int @@ -1071,7 +1071,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) @@ -1138,8 +1138,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) @@ -1233,29 +1233,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); @@ -1281,14 +1281,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); @@ -1409,7 +1409,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; @@ -1422,7 +1422,7 @@ libxlNumDomains(virConnectPtr conn) int n; libxlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); libxlDriverUnlock(driver); return n; @@ -1445,17 +1445,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; } @@ -1480,7 +1481,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) { @@ -1506,7 +1507,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) { @@ -1532,7 +1533,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) { @@ -1560,7 +1561,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) { @@ -1618,7 +1619,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) { @@ -1678,7 +1679,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); @@ -1731,7 +1732,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); @@ -1774,7 +1775,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); @@ -1799,7 +1800,7 @@ libxlDomainDestroyFlags(virDomainPtr dom, } if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -1828,7 +1829,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]; @@ -1855,7 +1856,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) { @@ -1886,7 +1887,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) { @@ -2005,7 +2006,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) { @@ -2052,7 +2053,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) { @@ -2163,7 +2164,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]; @@ -2182,7 +2183,7 @@ libxlDomainSaveFlags(virDomainPtr dom, const char *to, const char *dxml, goto cleanup; if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2225,17 +2226,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; } @@ -2268,7 +2271,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) { @@ -2319,7 +2322,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; } @@ -2360,7 +2363,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); @@ -2389,7 +2392,7 @@ libxlDomainManagedSave(virDomainPtr dom, unsigned int flags) goto cleanup; if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2434,7 +2437,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); @@ -2463,7 +2466,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); @@ -2522,7 +2525,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) { @@ -2641,7 +2644,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) { @@ -2698,7 +2701,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) { @@ -2765,7 +2768,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) { @@ -2828,7 +2831,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) { @@ -2944,7 +2947,7 @@ libxlListDefinedDomains(virConnectPtr conn, int n; libxlDriverLock(driver); - n = virDomainObjListGetInactiveNames(&driver->domains, names, nnames); + n = virDomainObjListGetInactiveNames(driver->domains, names, nnames); libxlDriverUnlock(driver); return n; } @@ -2956,7 +2959,7 @@ libxlNumDefinedDomains(virConnectPtr conn) int n; libxlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); libxlDriverUnlock(driver); return n; @@ -2973,7 +2976,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); @@ -3019,18 +3022,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; } @@ -3067,7 +3071,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]; @@ -3114,7 +3118,7 @@ libxlDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -3506,7 +3510,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")); @@ -3707,7 +3711,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) { @@ -3736,7 +3740,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]; @@ -3806,7 +3810,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) { @@ -3871,7 +3875,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) { @@ -3954,7 +3958,7 @@ libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, return -1; libxlDriverLock(driver); - vm = virDomainFindByUUID(&driver->domains, dom->uuid); + vm = virDomainObjListFindByUUID(driver->domains, dom->uuid); libxlDriverUnlock(driver); if (!vm) { @@ -4024,7 +4028,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); @@ -4046,7 +4050,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); @@ -4068,7 +4072,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); @@ -4135,7 +4139,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 1fe8039..3611821 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]; @@ -950,7 +951,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) { @@ -990,7 +991,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); @@ -1077,7 +1078,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)) { @@ -1087,8 +1088,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; @@ -1096,7 +1098,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; } @@ -1128,7 +1130,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)); @@ -1315,7 +1317,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); @@ -1338,7 +1340,7 @@ lxcDomainDestroyFlags(virDomainPtr dom, priv->doneStopEvent = true; virDomainAuditStop(vm, "destroyed"); if (!vm->persistent) { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -1442,7 +1444,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(); @@ -1478,23 +1480,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); @@ -1536,12 +1538,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; @@ -1554,7 +1556,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); @@ -1774,7 +1776,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, @@ -1916,7 +1918,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, @@ -2029,7 +2031,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, @@ -2127,7 +2129,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, @@ -2228,7 +2230,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) { @@ -2283,7 +2285,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) { @@ -2311,7 +2313,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]; @@ -2479,7 +2481,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]; @@ -2544,7 +2546,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]; @@ -2604,7 +2606,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); @@ -2682,7 +2684,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, @@ -2747,7 +2749,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; @@ -2769,7 +2771,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) { @@ -2858,7 +2860,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) { @@ -4301,7 +4303,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]; @@ -4485,7 +4487,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 5598a86..0c943ea 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); @@ -576,7 +576,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 { @@ -590,7 +590,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; } } @@ -1290,7 +1290,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 9c88d71..6f3e995 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) { @@ -2334,13 +2335,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)) @@ -2355,7 +2356,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"), @@ -2370,8 +2371,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 46c1892..48ad77f 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -676,7 +676,7 @@ qemuDriverCloseCallbackRun(void *payload, */ virUUIDFormat(uuid, uuidstr); - 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 f98a757..3cc7916 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(); @@ -863,42 +863,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); @@ -959,12 +959,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; @@ -1054,7 +1054,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); @@ -1379,7 +1379,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) { @@ -1404,7 +1404,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) { @@ -1431,7 +1431,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) { @@ -1521,7 +1521,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; @@ -1532,7 +1532,7 @@ static int qemuNumDomains(virConnectPtr conn) { int n; qemuDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); qemuDriverUnlock(driver); return n; @@ -1589,7 +1589,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))) @@ -1601,9 +1601,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; @@ -1670,7 +1670,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]; @@ -1753,7 +1753,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]; @@ -2048,7 +2048,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); @@ -2275,7 +2275,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); @@ -3031,7 +3031,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); @@ -3341,7 +3341,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]; @@ -4525,7 +4525,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)); @@ -4585,7 +4585,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]; @@ -4985,13 +4985,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; @@ -5198,7 +5198,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]; @@ -5432,7 +5432,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; } @@ -5442,7 +5442,7 @@ static int qemuNumDefinedDomains(virConnectPtr conn) { int n; qemuDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); qemuDriverUnlock(driver); return n; @@ -5539,7 +5539,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]; @@ -5601,7 +5601,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))) @@ -5616,9 +5616,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; @@ -5627,9 +5627,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; } } @@ -5702,7 +5702,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]; @@ -6428,7 +6428,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); @@ -6629,7 +6629,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]; @@ -6910,7 +6910,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); @@ -7065,7 +7065,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, @@ -7261,7 +7261,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, @@ -7421,7 +7421,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, @@ -7584,7 +7584,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, @@ -7736,7 +7736,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, @@ -7942,7 +7942,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, @@ -8228,7 +8228,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, @@ -8759,7 +8759,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, @@ -8925,7 +8925,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, @@ -9589,7 +9589,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); @@ -9637,7 +9637,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); @@ -9679,7 +9679,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); @@ -9866,7 +9866,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); @@ -9905,7 +9905,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); @@ -9938,7 +9938,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); @@ -11350,7 +11350,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); @@ -12053,7 +12053,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); @@ -12420,7 +12420,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); @@ -12610,7 +12610,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) @@ -12619,9 +12619,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; @@ -13022,7 +13022,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); @@ -13580,7 +13580,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); @@ -13676,7 +13676,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); @@ -13834,7 +13834,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); @@ -14411,7 +14411,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); @@ -14608,7 +14608,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 d1d3d95..bc2a6de 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3446,7 +3446,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 ddc4110..505570f 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; @@ -546,7 +546,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)); @@ -582,8 +582,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; @@ -645,7 +646,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); @@ -795,7 +796,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))) @@ -926,8 +927,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; } @@ -1113,7 +1115,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); @@ -1182,7 +1184,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); @@ -1253,7 +1255,7 @@ static int testNumOfDomains(virConnectPtr conn) int count; testDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 1); + count = virDomainObjListNumOfDomains(privconn->domains, 1); testDriverUnlock(privconn); return count; @@ -1266,7 +1268,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); @@ -1287,7 +1289,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); @@ -1324,13 +1326,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; @@ -1364,7 +1367,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) { @@ -1390,7 +1393,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) { @@ -1416,7 +1419,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) { @@ -1442,7 +1445,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; @@ -1456,8 +1459,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__); @@ -1470,8 +1473,8 @@ static int testDestroyDomain(virDomainPtr domain) VIR_DOMAIN_EVENT_STOPPED_DESTROYED); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -1493,8 +1496,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) { @@ -1535,8 +1538,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) { @@ -1580,8 +1583,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__); @@ -1600,8 +1603,8 @@ static int testShutdownDomainFlags(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -1630,8 +1633,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__); @@ -1675,8 +1678,8 @@ static int testRebootDomain(virDomainPtr domain, VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); if (!privdom->persistent) { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } } @@ -1700,8 +1703,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) { @@ -1741,8 +1744,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) { @@ -1781,8 +1784,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__); @@ -1839,8 +1842,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; } @@ -1940,13 +1943,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; @@ -1990,8 +1994,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__); @@ -2023,8 +2027,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; } } @@ -2053,8 +2057,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) { @@ -2078,8 +2082,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) { @@ -2105,8 +2109,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) { @@ -2141,7 +2145,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) { @@ -2202,7 +2206,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) { @@ -2285,7 +2289,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) { @@ -2371,7 +2375,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) { @@ -2425,8 +2429,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) { @@ -2451,7 +2455,7 @@ static int testNumOfDefinedDomains(virConnectPtr conn) { int count; testDriverLock(privconn); - count = virDomainObjListNumOfDomains(&privconn->domains, 0); + count = virDomainObjListNumOfDomains(privconn->domains, 0); testDriverUnlock(privconn); return count; @@ -2466,7 +2470,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; @@ -2487,13 +2491,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; @@ -2554,8 +2559,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__); @@ -2602,8 +2607,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__); @@ -2616,8 +2621,8 @@ static int testDomainUndefineFlags(virDomainPtr domain, if (virDomainObjIsActive(privdom)) { privdom->persistent = 0; } else { - virDomainRemoveInactive(&privconn->domains, - privdom); + virDomainObjListRemove(privconn->domains, + privdom); privdom = NULL; } @@ -2645,8 +2650,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) { @@ -2672,8 +2677,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) { @@ -2718,8 +2723,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) { @@ -2768,8 +2773,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) { @@ -2811,8 +2816,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) { @@ -2858,8 +2863,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) { @@ -5710,7 +5715,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 705495e..591d3e4 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; } } @@ -450,7 +450,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(); @@ -535,12 +535,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); @@ -590,12 +590,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; @@ -635,9 +635,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); @@ -690,8 +690,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; } @@ -704,7 +704,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); @@ -1309,7 +1309,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) { @@ -1333,7 +1333,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) { @@ -1357,7 +1357,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) { @@ -1382,7 +1382,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); @@ -1404,7 +1404,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); @@ -1425,7 +1425,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); @@ -1469,7 +1469,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; @@ -1479,7 +1479,7 @@ static int umlNumDomains(virConnectPtr conn) { int n; umlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 1); + n = virDomainObjListNumOfDomains(driver->domains, 1); umlDriverUnlock(driver); return n; @@ -1500,20 +1500,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; } @@ -1546,7 +1546,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, @@ -1588,7 +1588,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); @@ -1601,8 +1601,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; @@ -1629,7 +1629,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", @@ -1655,7 +1655,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) { @@ -1680,7 +1680,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) { @@ -1713,7 +1713,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) { @@ -1753,7 +1753,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) { @@ -1799,7 +1799,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) { @@ -1828,7 +1828,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) { @@ -1854,7 +1854,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; @@ -1865,7 +1865,7 @@ static int umlNumDefinedDomains(virConnectPtr conn) { int n; umlDriverLock(driver); - n = virDomainObjListNumOfDomains(&driver->domains, 0); + n = virDomainObjListNumOfDomains(driver->domains, 0); umlDriverUnlock(driver); return n; @@ -1881,7 +1881,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", @@ -1922,20 +1922,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; } @@ -1961,7 +1961,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")); @@ -1980,7 +1980,7 @@ static int umlDomainUndefineFlags(virDomainPtr dom, if (virDomainObjIsActive(vm)) { vm->persistent = 0; } else { - virDomainRemoveInactive(&driver->domains, vm); + virDomainObjListRemove(driver->domains, vm); vm = NULL; } @@ -2059,7 +2059,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); @@ -2177,7 +2177,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); @@ -2243,7 +2243,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", @@ -2269,7 +2269,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", @@ -2343,7 +2343,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) { @@ -2412,7 +2412,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); @@ -2557,7 +2557,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.1

On Fri, Feb 01, 2013 at 11:18:24 +0000, Daniel P. Berrange wrote:
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 | 172 ++++++++++++++++++----------------- 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 | 184 +++++++++++++++++++------------------- 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, 665 insertions(+), 632 deletions(-)
Pretty big but quite mechanical. You could have changed type function(...) into type function(...) in all places rather than in just a few places but don't bother doing that now. Nice thing is that all the renames and reordering of function parameters can be checked by the compiler. And it doesn't complain about anything, even make check and syntax-check passes. ACK Jirka

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 990e6e4..3861e68 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 { @@ -694,7 +703,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) { @@ -704,6 +715,12 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1; + if (!(virDomainObjListClass = virClassNew(virClassForObject(), + "virDomainObjList", + sizeof(virDomainObjList), + virDomainObjListDispose))) + return -1; + return 0; } @@ -780,26 +797,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); } @@ -15224,6 +15241,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 fab04a2..3ad1173 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" @@ -1893,11 +1892,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) @@ -1908,7 +1902,6 @@ virDomainObjIsActive(virDomainObjPtr dom) virDomainObjPtr virDomainObjNew(virCapsPtr caps); virDomainObjListPtr virDomainObjListNew(void); -void virDomainObjListFree(virDomainObjListPtr objs); virDomainObjPtr virDomainObjListFindByID(const virDomainObjListPtr doms, int id); @@ -2176,6 +2169,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 35f8dde..b4573f5 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 @@ -588,7 +589,6 @@ enum UpdateStep { struct domUpdateCBStruct { virConnectPtr conn; enum UpdateStep step; - int err; virHashTablePtr skipInterfaces; }; @@ -725,14 +725,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 8fe181b..bdc8e9b 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -475,7 +475,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 b6dce0d..1ce3057 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -98,12 +98,12 @@ struct _libxlEventHookInfo { }; static virClassPtr libxlDomainObjPrivateClass; + 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 @@ -433,13 +433,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(); @@ -450,10 +450,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 @@ -1005,12 +1009,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; @@ -1047,7 +1049,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); @@ -1055,12 +1057,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 @@ -1071,7 +1075,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) @@ -1252,11 +1256,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); @@ -1288,8 +1292,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); @@ -2406,14 +2410,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); @@ -2422,9 +2425,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 3611821..9dbab67 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 @@ -1556,7 +1555,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 0c943ea..aaa81a7 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -1246,17 +1246,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(); @@ -1273,6 +1274,7 @@ virLXCProcessAutostartDomain(void *payload, const void *name ATTRIBUTE_UNUSED, v } } virObjectUnlock(vm); + return ret; } @@ -1290,19 +1292,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); @@ -1346,9 +1351,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); @@ -1360,6 +1366,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 6f3e995..bc05a51 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 3cc7916..a02e989 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; } @@ -874,11 +872,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); @@ -894,13 +894,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) @@ -1054,7 +1054,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); @@ -3128,14 +3128,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); @@ -3144,11 +3143,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 bc2a6de..91da3f0 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3353,23 +3353,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. @@ -3430,10 +3428,11 @@ qemuProcessReconnectHelper(void *payload, virObjectUnlock(obj); - return; + return 0; error: VIR_FREE(data); + return -1; } /** @@ -3446,7 +3445,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 505570f..cd47862 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -646,7 +646,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); @@ -1115,7 +1115,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); @@ -1184,7 +1184,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 591d3e4..27f5118 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) @@ -602,10 +601,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); @@ -614,6 +612,7 @@ umlShutdownOneVM(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) virDomainAuditStop(dom, "shutdown"); } virObjectUnlock(dom); + return 0; } /** @@ -635,9 +634,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.1

On Fri, Feb 01, 2013 at 11:18:25 +0000, Daniel P. Berrange wrote:
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 ... diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 990e6e4..3861e68 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c ... @@ -15224,6 +15241,34 @@ cleanup: return -1; }
+ +struct virDomainListIterData { + virDomainObjListIterator callback; + void *opaque; + int ret; +}; + +static void virDomainObjListHelper(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque)
static void virDomainObjListHelper(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque) would better fit out style and would not be longer then 80 chars :-)
+{ + 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/nwfilter_conf.h b/src/conf/nwfilter_conf.h index 35f8dde..b4573f5 100644 --- a/src/conf/nwfilter_conf.h +++ b/src/conf/nwfilter_conf.h ... @@ -725,14 +725,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);
While changing this line, you could remove this mixture of styles for function prototypes: ... virDomainObjListIterator domUpdateCB, void *data);
typedef void (*virNWFilterVoidCall)(void);
...
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 ... @@ -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;
You moved all the code that creates dom further but left this one here. I think you actually wanted to change if (virDomainObjGetState(dom, NULL) == VIR_DOMAIN_SHUTOFF) def->id = -1; else def->id = veid; to if (STREQ(status, "stopped")) def->id = -1; else 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 (!(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;
Shouldn't dom->pid be set only if the domain is running?
virObjectUnlock(dom); dom = NULL; + def = NULL; }
virCommandFree(cmd);
... ACK with the small issues fixed. Jirka

On Mon, Feb 04, 2013 at 14:01:27 +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:25 +0000, Daniel P. Berrange wrote:
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 ... ACK with the small issues fixed.
Oops, that was premature; make check fails after this patch with a lot of errors similar to error: failed to connect to the hypervisor error: Class virDomainObjList must derive from virObjectLockable Jirka

On Mon, Feb 04, 2013 at 02:51:19PM +0100, Jiri Denemark wrote:
On Mon, Feb 04, 2013 at 14:01:27 +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:25 +0000, Daniel P. Berrange wrote:
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 ... ACK with the small issues fixed.
Oops, that was premature; make check fails after this patch with a lot of errors similar to
error: failed to connect to the hypervisor error: Class virDomainObjList must derive from virObjectLockable
Hmm, I fixed that, but I guess the fix ended up in the wrong patch Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Mon, Feb 04, 2013 at 13:51:49 +0000, Daniel P. Berrange wrote:
On Mon, Feb 04, 2013 at 02:51:19PM +0100, Jiri Denemark wrote:
On Mon, Feb 04, 2013 at 14:01:27 +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:25 +0000, Daniel P. Berrange wrote:
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 ... ACK with the small issues fixed.
Oops, that was premature; make check fails after this patch with a lot of errors similar to
error: failed to connect to the hypervisor error: Class virDomainObjList must derive from virObjectLockable
Hmm, I fixed that, but I guess the fix ended up in the wrong patch
Oh, right, it seems like the first two hunks of 5/13 fix that and should be moved into this patch. So ACK with the two hunks moved and small issues fixed. Jirka

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/libvirt_private.syms | 1 - 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 +-- 14 files changed, 174 insertions(+), 214 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3861e68..79da5eb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1871,30 +1871,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; } /* @@ -14850,7 +14911,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; @@ -15076,69 +15137,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 3ad1173..fa13e24 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1968,10 +1968,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); @@ -2156,10 +2161,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/libvirt_private.syms b/src/libvirt_private.syms index bdc8e9b..87171ae 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -478,7 +478,6 @@ virDomainObjListFindByUUID; virDomainObjListForEach; virDomainObjListGetActiveIDs; virDomainObjListGetInactiveNames; -virDomainObjListIsDuplicate; virDomainObjListLoadAllConfigs; virDomainObjListNew; virDomainObjListNumOfDomains; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 1ce3057..e0a9a8e 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1449,12 +1449,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; @@ -2230,12 +2229,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; @@ -3019,7 +3018,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, @@ -3027,12 +3026,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; @@ -3049,12 +3047,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 9dbab67..5e664c7 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) @@ -1077,9 +1077,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")); @@ -1089,7 +1086,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 bc05a51..4e1889f 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 */ @@ -2324,7 +2324,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, @@ -2335,14 +2334,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; @@ -2373,7 +2367,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 a02e989..d6c6af5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1589,9 +1589,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; @@ -1603,7 +1600,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; @@ -4987,15 +4986,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) @@ -5585,12 +5582,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); @@ -5603,9 +5599,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; @@ -5615,26 +5608,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", @@ -5646,14 +5627,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); @@ -5661,13 +5643,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); @@ -5676,6 +5656,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); @@ -12612,9 +12593,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; @@ -12623,7 +12601,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 cd47862..1b31e00 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -584,7 +584,7 @@ static int testOpenDefault(virConnectPtr conn) { goto error; if (!(domobj = virDomainObjListAdd(privconn->domains, privconn->caps, - domdef, false))) + domdef, 0, NULL))) goto error; domdef = NULL; @@ -929,7 +929,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; } @@ -1326,14 +1326,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; @@ -1943,14 +1942,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; @@ -2483,7 +2482,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, @@ -2491,21 +2490,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); @@ -2515,6 +2513,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 27f5118..f2cdc8d 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1499,12 +1499,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; @@ -1921,12 +1920,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.1

On Fri, Feb 01, 2013 at 11:18:26 +0000, Daniel P. Berrange wrote:
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 virDomainDefinXML:
s/Defin/Define/
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;
...
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3861e68..79da5eb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1871,30 +1871,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
It would be cool to have VIR_DOMAIN_OBJ_LIST_ADD_LIVE documented here too :-)
+ * + */ 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);
virObjectUnlock(vm); vm = NULL;
+ 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);
virObjectUnlock(vm); vm = NULL; Given that you need to repeat the same code in three places in this function, it might be worth a dedicated "duplicate" label.
+ goto cleanup; + } + }
- virUUIDFormat(def->uuid, uuidstr); - if (virHashAddEntry(doms->objs, uuidstr, domain) < 0) { - VIR_FREE(domain); - return NULL; - }
So the following if statement is effectively copying virDomainObjAssignDef with a small addition which allows for returning the replaced def in *oldDef. Given how hard to read the code is (mainly because newDef is not a very good name) I'd prefer to keep it only once and call enhanced virDomainObjAssignDef from here.
+ 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);
This else branch is not in virDomainObjAssignDef and seems to be wrong. If you call virDomainObjListAdd with VIR_DOMAIN_OBJ_LIST_ADD_LIVE twice in a row, you will lose the original def (in vm->newDef). It looks like virDomainObjAssignDef is not correct either as we either store vm->def in vm->newDef or replace it without freeing. So I think you wanted to virDomainDefFree vm->def rather than vm->newDef and also add this branch to virDomainObjAssignDef. Another argument against copying the code here.
+ } 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);
Shouldn't this be virObjectUnref(vm)?
+ return NULL; + } + } +cleanup: + return vm; }
/* ... diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 3ad1173..fa13e24 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1968,10 +1968,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 */
This commend would deserve some modifications :-)
+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); ... 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),
It might be easier to read to compute the flags separately and just use the result here.
+ NULL))) goto cleanup;
if (STREQ(status, "stopped")) { ... diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index a02e989..d6c6af5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c ... @@ -5615,26 +5608,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,
I believe the flags should be 0 here. By using VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE you would effectively forbid calling virDomainDefine for running transient domains. And VIR_DOMAIN_OBJ_LIST_ADD_LIVE should not be set either since def is domain's persistent (rather than active) definition.
+ &oldDef))) + goto cleanup; + def = NULL; if (virDomainHasDiskMirror(vm)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", ... @@ -12612,9 +12593,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;
@@ -12623,7 +12601,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)))
Although this could be correct, it doesn't match current code. To match it, you'd need to use just VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE flag.
goto cleanup;
def = NULL;
...
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)))
virDomainObjListIsDuplicate was called with 1 as the third argument, thus you need to use VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE flag here.
goto cleanup;
pDomain = vm->privateData;
... Looking forward to v2 :-) Jirka

On Mon, Feb 04, 2013 at 04:58:25PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:26 +0000, Daniel P. Berrange wrote:
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 virDomainDefinXML: @@ -12623,7 +12601,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)))
Although this could be correct, it doesn't match current code. To match it, you'd need to use just VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE flag.
Yep, I believe this new code is correct
Looking forward to v2 :-)
Here is the diff from v1 to v2 Daniel diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1771668..06dbe1f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1853,21 +1853,33 @@ error: void virDomainObjAssignDef(virDomainObjPtr domain, const virDomainDefPtr def, - bool live) + bool live, + virDomainDefPtr *oldDef) { - if (!virDomainObjIsActive(domain)) { + *oldDef = NULL; + if (virDomainObjIsActive(domain)) { + if (oldDef) + *oldDef = domain->newDef; + else + virDomainDefFree(domain->newDef); + domain->newDef = def; + } else { if (live) { - /* save current configuration to be restored on domain shutdown */ - if (!domain->newDef) - domain->newDef = domain->def; + if (domain->def) { + /* save current configuration to be restored on domain shutdown */ + if (!domain->newDef) + domain->newDef = domain->def; + else + virDomainDefFree(domain->def); + } domain->def = def; } else { - virDomainDefFree(domain->def); + if (oldDef) + *oldDef = domain->def; + else + virDomainDefFree(domain->def); domain->def = def; } - } else { - virDomainDefFree(domain->newDef); - domain->newDef = def; } } @@ -1879,6 +1891,10 @@ void virDomainObjAssignDef(virDomainObjPtr domain, * this will refuse updating an existing def if the * current def is Live * + * If flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE then + * the @def being added is assumed to represent a + * live config, not a future inactive config + * */ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virCapsPtr caps, @@ -1899,7 +1915,7 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' is already defined with uuid %s"), vm->def->name, uuidstr); - goto cleanup; + goto error; } if (flags & VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE) { @@ -1908,30 +1924,14 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virReportError(VIR_ERR_OPERATION_INVALID, _("domain is already active as '%s'"), vm->def->name); - goto cleanup; + goto error; } } - 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; - } + virDomainObjAssignDef(vm, + def, + !!(flags & VIR_DOMAIN_OBJ_LIST_ADD_LIVE), + oldDef); } else { /* UUID does not match, but if a name matches, refuse it */ if ((vm = virDomainObjListFindByName(doms, def->name))) { @@ -1939,9 +1939,7 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), def->name, uuidstr); - virObjectUnlock(vm); - vm = NULL; - goto cleanup; + goto error; } if (!(vm = virDomainObjNew(caps))) @@ -1950,12 +1948,17 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virUUIDFormat(def->uuid, uuidstr); if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) { - VIR_FREE(vm); + virObjectUnref(vm); return NULL; } } cleanup: return vm; + +error: + virObjectUnlock(vm); + vm = NULL; + goto cleanup; } /* @@ -14879,7 +14882,7 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, virDomainDefPtr def = NULL; virDomainObjPtr dom; int autostart; - int newVM = 1; + virDomainDefPtr oldDef = NULL; if ((configFile = virDomainConfigFile(configDir, name)) == NULL) goto error; @@ -14893,32 +14896,15 @@ virDomainObjListLoadConfig(virDomainObjListPtr doms, if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0) goto error; - /* if the domain is already in our hashtable, we only need to - * update the autostart flag - */ - if ((dom = virDomainObjListFindByUUID(doms, def->uuid))) { - dom->autostart = autostart; - - if (virDomainObjIsActive(dom) && - !dom->newDef) { - virDomainObjAssignDef(dom, def, false); - } else { - virDomainDefFree(def); - } - - VIR_FREE(configFile); - VIR_FREE(autostartLink); - return dom; - } - - if (!(dom = virDomainObjListAdd(doms, caps, def, 0, NULL))) + if (!(dom = virDomainObjListAdd(doms, caps, def, 0, &oldDef))) goto error; dom->autostart = autostart; if (notify) - (*notify)(dom, newVM, opaque); + (*notify)(dom, oldDef == NULL, opaque); + virDomainDefFree(oldDef); VIR_FREE(configFile); VIR_FREE(autostartLink); return dom; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index fa13e24..dc411e4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1966,8 +1966,6 @@ void virDomainDefFree(virDomainDefPtr vm); 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), @@ -1979,7 +1977,8 @@ virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms, virDomainDefPtr *oldDef); void virDomainObjAssignDef(virDomainObjPtr domain, const virDomainDefPtr def, - bool live); + bool live, + virDomainDefPtr *oldDef); int virDomainObjSetDefTransient(virCapsPtr caps, virDomainObjPtr domain, bool live); diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index e0a9a8e..d11acfc 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -902,7 +902,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto error; } - virDomainObjAssignDef(vm, def, true); + virDomainObjAssignDef(vm, def, true, NULL); def = NULL; if (unlink(managed_save_path) < 0) { @@ -3602,7 +3602,7 @@ libxlDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, if (!ret && (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) { ret = virDomainSaveConfig(driver->configDir, vmdef); if (!ret) { - virDomainObjAssignDef(vm, vmdef, false); + virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; } } diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 5e664c7..9f636e0 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1863,7 +1863,7 @@ lxcSetSchedulerParametersFlags(virDomainPtr dom, if (rc < 0) goto cleanup; - virDomainObjAssignDef(vm, vmdef, false); + virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; } @@ -4411,7 +4411,7 @@ lxcDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, if (flags & VIR_DOMAIN_AFFECT_CONFIG) { ret = virDomainSaveConfig(driver->configDir, vmdef); if (!ret) { - virDomainObjAssignDef(vm, vmdef, false); + virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; } } diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index e9724fd..3081417 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -586,6 +586,7 @@ int openvzLoadDomains(struct openvz_driver *driver) { line = outbuf; while (line[0] != '\0') { + unsigned int flags = 0; if (virStrToLong_i(line, &status, 10, &veid) < 0 || *status++ != ' ' || (line = strchr(status, '\n')) == NULL) { @@ -642,12 +643,14 @@ int openvzLoadDomains(struct openvz_driver *driver) { openvzReadMemConf(def, veid); virUUIDFormat(def->uuid, uuidstr); + flags = VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE; + if (STRNEQ(status, "stopped")) + flags |= VIR_DOMAIN_OBJ_LIST_ADD_LIVE; + if (!(dom = virDomainObjListAdd(driver->domains, driver->caps, def, - VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE | - (STRNEQ(status, "stopped") ? - VIR_DOMAIN_OBJ_LIST_ADD_LIVE : 0), + flags, NULL))) goto cleanup; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d6c6af5..b0683c6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5168,7 +5168,7 @@ qemuDomainObjRestore(virConnectPtr conn, goto cleanup; } - virDomainObjAssignDef(vm, def, true); + virDomainObjAssignDef(vm, def, true, NULL); def = NULL; ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path, @@ -5611,8 +5611,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, def, - VIR_DOMAIN_OBJ_LIST_ADD_LIVE | - VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + 0, &oldDef))) goto cleanup; @@ -5620,7 +5619,7 @@ static virDomainPtr qemuDomainDefine(virConnectPtr conn, const char *xml) { if (virDomainHasDiskMirror(vm)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", _("domain has active block copy job")); - virDomainObjAssignDef(vm, NULL, false); + virDomainObjAssignDef(vm, NULL, false, NULL); goto cleanup; } vm->persistent = 1; @@ -6532,7 +6531,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, if (flags & VIR_DOMAIN_AFFECT_CONFIG) { ret = virDomainSaveConfig(cfg->configDir, vmdef); if (!ret) { - virDomainObjAssignDef(vm, vmdef, false); + virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; } } @@ -8045,7 +8044,7 @@ qemuSetSchedulerParametersFlags(virDomainPtr dom, if (rc < 0) goto cleanup; - virDomainObjAssignDef(vm, vmdef, false); + virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; } @@ -12181,13 +12180,13 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, goto endjob; } if (config) - virDomainObjAssignDef(vm, config, false); + virDomainObjAssignDef(vm, config, false, NULL); } else { /* Transitions 2, 3 */ load: was_stopped = true; if (config) - virDomainObjAssignDef(vm, config, false); + virDomainObjAssignDef(vm, config, false, NULL); rc = qemuProcessStart(snapshot->domain->conn, driver, vm, NULL, -1, NULL, snap, @@ -12271,7 +12270,7 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, goto endjob; } if (config) - virDomainObjAssignDef(vm, config, false); + virDomainObjAssignDef(vm, config, false, NULL); if (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) { diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 8684f56..b7905fa 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -338,7 +338,9 @@ vmwareDomainDefineXML(virConnectPtr conn, const char *xml) /* assign def */ if (!(vm = virDomainObjListAdd(driver->domains, driver->caps, - vmdef, 0, NULL))) + vmdef, + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, + NULL))) goto cleanup; pDomain = vm->privateData; -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Tue, Feb 05, 2013 at 14:48:01 +0000, Daniel P. Berrange wrote:
On Mon, Feb 04, 2013 at 04:58:25PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:26 +0000, Daniel P. Berrange wrote:
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 virDomainDefinXML: @@ -12623,7 +12601,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)))
Although this could be correct, it doesn't match current code. To match it, you'd need to use just VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE flag.
Yep, I believe this new code is correct
Looking forward to v2 :-)
Here is the diff from v1 to v2
Daniel
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1771668..06dbe1f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1853,21 +1853,33 @@ error:
void virDomainObjAssignDef(virDomainObjPtr domain, const virDomainDefPtr def, - bool live) + bool live, + virDomainDefPtr *oldDef) { - if (!virDomainObjIsActive(domain)) { + *oldDef = NULL;
Oops, oldDef is optional; the above should be + if (oldDef) + *oldDef = NULL;
+ if (virDomainObjIsActive(domain)) { + if (oldDef) + *oldDef = domain->newDef; + else + virDomainDefFree(domain->newDef); + domain->newDef = def; + } else { if (live) { - /* save current configuration to be restored on domain shutdown */ - if (!domain->newDef) - domain->newDef = domain->def; + if (domain->def) {
This test is not really needed since if both def and newDef are NULL, newDef = def does nothing and if def is NULL but newDef is not, virDomainFree should be able to handle NULL argument. Anyway, it's not a big deal, just that the diff could have been smaller :-)
+ /* save current configuration to be restored on domain shutdown */ + if (!domain->newDef) + domain->newDef = domain->def; + else + virDomainDefFree(domain->def); + } domain->def = def; } else { ...
ACK to the original patch with these changes (after fixing the possible NULL dereference) squashed in. Jirka

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 79da5eb..a1e899f 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 */ @@ -715,7 +715,7 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1; - if (!(virDomainObjListClass = virClassNew(virClassForObject(), + if (!(virDomainObjListClass = virClassNew(virClassForObjectLockable(), "virDomainObjList", sizeof(virDomainObjList), virDomainObjListDispose))) @@ -840,9 +840,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; } @@ -853,11 +855,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; } @@ -879,9 +883,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; } @@ -1880,25 +1886,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; } @@ -1908,6 +1921,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; } } @@ -1934,12 +1949,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; } @@ -1958,6 +1972,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. @@ -2076,11 +2105,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); } @@ -14880,6 +14912,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; @@ -14896,7 +14929,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) && @@ -14911,7 +14947,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; @@ -14999,6 +15035,8 @@ int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, return -1; } + virObjectLock(doms); + while ((entry = readdir(dir))) { virDomainObjPtr dom; @@ -15036,7 +15074,7 @@ int virDomainObjListLoadAllConfigs(virDomainObjListPtr doms, } closedir(dir); - + virObjectUnlock(doms); return 0; } @@ -15161,10 +15199,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; } @@ -15189,7 +15229,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; } @@ -15225,7 +15267,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; @@ -15261,8 +15305,9 @@ int virDomainObjListForEach(virDomainObjListPtr doms, struct virDomainListIterData data = { callback, opaque, 0, }; + virObjectLock(doms); virHashForEach(doms->objs, virDomainObjListHelper, &data); - + virObjectUnlock(doms); return data.ret; } @@ -16033,6 +16078,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(); @@ -16062,6 +16108,7 @@ cleanup: } VIR_FREE(data.domains); + virObjectUnlock(doms); return ret; } -- 1.8.1

On Fri, Feb 01, 2013 at 11:18:27 +0000, Daniel P. Berrange wrote:
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 79da5eb..a1e899f 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 */ @@ -715,7 +715,7 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1;
- if (!(virDomainObjListClass = virClassNew(virClassForObject(), + if (!(virDomainObjListClass = virClassNew(virClassForObjectLockable(), "virDomainObjList", sizeof(virDomainObjList), virDomainObjListDispose)))
These two hunks should go to 3/13. ...
@@ -1880,25 +1886,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;
These two lines should go to 4/13.
goto cleanup; }
@@ -1908,6 +1921,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; } }
And this hunk should go to 4/13 too.
@@ -1934,12 +1949,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))) {
I believe you wanted to add virObjectLock(vm) here rather than...
virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), def->name, uuidstr); - virObjectUnlock(vm);
...removing this unlock here.
vm = NULL; goto cleanup; }
... Jirka

On Mon, Feb 04, 2013 at 05:22:59PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:27 +0000, Daniel P. Berrange wrote:
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 79da5eb..a1e899f 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 */ @@ -715,7 +715,7 @@ static int virDomainObjOnceInit(void) virDomainObjDispose))) return -1;
- if (!(virDomainObjListClass = virClassNew(virClassForObject(), + if (!(virDomainObjListClass = virClassNew(virClassForObjectLockable(), "virDomainObjList", sizeof(virDomainObjList), virDomainObjListDispose)))
These two hunks should go to 3/13.
...
@@ -1880,25 +1886,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;
These two lines should go to 4/13.
goto cleanup; }
@@ -1908,6 +1921,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; } }
And this hunk should go to 4/13 too.
@@ -1934,12 +1949,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))) {
I believe you wanted to add virObjectLock(vm) here rather than...
virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), def->name, uuidstr); - virObjectUnlock(vm);
...removing this unlock here.
Yes, that is correct. I've made that change Given that all other comments are just moving chunks to previous patches, do you want to see a v2 ? Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Tue, Feb 05, 2013 at 14:53:13 +0000, Daniel P. Berrange wrote:
On Mon, Feb 04, 2013 at 05:22:59PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:27 +0000, Daniel P. Berrange wrote:
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 ... @@ -1934,12 +1949,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))) {
I believe you wanted to add virObjectLock(vm) here rather than...
virUUIDFormat(vm->def->uuid, uuidstr); virReportError(VIR_ERR_OPERATION_FAILED, _("domain '%s' already exists with uuid %s"), def->name, uuidstr); - virObjectUnlock(vm);
...removing this unlock here.
Yes, that is correct. I've made that change
Given that all other comments are just moving chunks to previous patches, do you want to see a v2 ?
No, I saw you moved two hunks to v2 of 4/13 and I'm fine with you making the other changes just in your tree. ACK Jirka

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 48ad77f..68fc6ff 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 @@ -785,3 +786,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 91da3f0..1585744 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3584,7 +3584,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); @@ -4436,7 +4436,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.1

On Fri, Feb 01, 2013 at 11:18:28 +0000, Daniel P. Berrange wrote:
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
s/methd/method/ ACK Jirka

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 d6c6af5..2d0cd77 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1501,14 +1501,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.1

On Fri, Feb 01, 2013 at 11:18:29 +0000, Daniel P. Berrange wrote:
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.
ACK Jirka

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 87171ae..ae0e7a7 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -991,43 +991,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 21255f0..dadcc6c 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -3622,7 +3622,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 2d0cd77..ce6df5c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -774,13 +774,13 @@ qemuStartup(bool privileged, if (qemuSecurityInit(qemu_driver) < 0) 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))) @@ -1047,8 +1047,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); @@ -10017,7 +10017,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; @@ -10025,22 +10025,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; } @@ -10048,43 +10048,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; } @@ -10092,27 +10092,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 6c328d6..d942de5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2331,8 +2331,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)) { @@ -2368,20 +2368,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 c23ba87..3c87a0f 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -328,8 +328,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; @@ -783,16 +783,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 93a0301..b52bfa1 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 fa2ee57..0676543 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1159,7 +1159,7 @@ virSecuritySELinuxSetSecurityImageLabel(virSecurityManagerPtr mgr, static int -virSecuritySELinuxSetSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxSetSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { virSecurityLabelDefPtr secdef; @@ -1213,16 +1213,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; } @@ -1326,7 +1327,7 @@ virSecuritySELinuxSetSecurityHostdevLabel(virSecurityManagerPtr mgr ATTRIBUTE_UN static int -virSecuritySELinuxRestoreSecurityPCILabel(pciDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { @@ -1374,16 +1375,17 @@ virSecuritySELinuxRestoreSecurityHostdevSubsysLabel(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, virSecuritySELinuxRestoreSecurityPCILabel, mgr); - pciFreeDevice(pci); + ret = virPCIDeviceFileIterate(pci, virSecuritySELinuxRestoreSecurityPCILabel, mgr); + 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 295884f..296871c 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.1

On Fri, Feb 01, 2013 at 11:18:30 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Rename all the pciDeviceXXX and pciXXXDevice APIs to have a fixed virPCIDevice name prefix
Some functions gained just virPCI prefix, I guess that means they don't take virPCIDevicePtr arguments. In any case, the shorter prefix the better so I'm not opposed to it :-) ...
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 ... @@ -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"),
Why not just "PCI device list"?
err ? err->message : _("unknown error")); virResetError(err); goto cleanup;
...
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 ... @@ -748,39 +748,39 @@ pciTryPowerManagementReset(pciDevice *dev, int cfgfd) }
static int -pciInitDevice(pciDevice *dev, int cfgfd) +virPCIDeviceInitDevice(virPCIDevicePtr dev, int cfgfd)
Why not just virPCIDeviceInit?
{ 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; } ... @@ -887,13 +887,13 @@ recheck: }
static int -pciUnbindDeviceFromStub(pciDevice *dev, const char *driver) +virPCIDeviceUnbindDeviceFromStub(virPCIDevicePtr dev, const char *driver)
virPCIDeviceUnbindFromStub would be a much better name.
{ 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) ... @@ -975,7 +975,7 @@ cleanup:
static int -pciBindDeviceToStub(pciDevice *dev, const char *driver) +virPCIDeviceBindDeviceToStub(virPCIDevicePtr dev, const char *driver)
virPCIDeviceBindToStub sounds better.
{ int result = -1; char *drvdir = NULL; ... @@ -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)
Since you're already changing the function name, you could have fixed the typo: virPCIDeviceDetach.
{ - if (pciProbeStubDriver(driver) < 0) { + if (virPCIProbeStubDriver(driver) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to load PCI stub module %s"), driver); 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)
I'd make the "A" lower case.
{ - if (pciProbeStubDriver(driver) < 0) { + if (virPCIProbeStubDriver(driver) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to load PCI stub module %s"), driver); return -1; } ... @@ -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)
Would virPCIDeviceReadID be better? I'm not sure but DeviceReadDeviceID is weird.
{ char *path = NULL; char *id_str;
- if (pciDeviceFile(&path, dev->name, id_name) < 0) { + if (virPCIFile(&path, dev->name, id_name) < 0) { return NULL; }
...
@@ -1880,8 +1880,8 @@ out: }
static int -pciGetPciConfigAddressFromSysfsDeviceLink(const char *device_link, - struct pci_config_address **bdf) +virPCIGetDeviceAddressFromSysfsDeviceLink(const char *device_link, + virPCIDeviceAddressPtr *bdf)
virPCIGetDeviceAddressFromSysfsLink would sound a bit better to me.
{ char *config_address = NULL; char *device_path = NULL; ...
ACK whether you implement changes I suggested or not (or just some of them) as long as make all check syntax-check succeeds. Jirka

On Mon, Feb 04, 2013 at 06:31:10PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:30 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Rename all the pciDeviceXXX and pciXXXDevice APIs to have a fixed virPCIDevice name prefix
Some functions gained just virPCI prefix, I guess that means they don't take virPCIDevicePtr arguments. In any case, the shorter prefix the better so I'm not opposed to it :-)
...
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 ... @@ -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"),
Why not just "PCI device list"?
err ? err->message : _("unknown error")); virResetError(err); goto cleanup;
...
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 ... @@ -748,39 +748,39 @@ pciTryPowerManagementReset(pciDevice *dev, int cfgfd) }
static int -pciInitDevice(pciDevice *dev, int cfgfd) +virPCIDeviceInitDevice(virPCIDevicePtr dev, int cfgfd)
Why not just virPCIDeviceInit?
Yes, it was my intention to remove the double 'Device' from all functions. I guess I missed a few.
ACK whether you implement changes I suggested or not (or just some of them) as long as make all check syntax-check succeeds.
Will fix them all Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 02/05/2013 08:07 AM, Daniel P. Berrange wrote:
On Mon, Feb 04, 2013 at 06:31:10PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:30 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Rename all the pciDeviceXXX and pciXXXDevice APIs to have a fixed virPCIDevice name prefix
ACK whether you implement changes I suggested or not (or just some of them) as long as make all check syntax-check succeeds.
Will fix them all
I believe this patch is the cause of my build failures on RHEL 6: CC libvirt_driver_nodedev_la-node_device_hal.lo cc1: warnings being treated as errors node_device/node_device_hal.c: In function 'gather_pci_cap': node_device/node_device_hal.c:151: error: implicit declaration of function 'pciGetPhysicalFunction' [-Wimplicit-function-declaration] node_device/node_device_hal.c:151: error: nested extern declaration of 'pciGetPhysicalFunction' [-Wnested-externs] node_device/node_device_hal.c:154: error: implicit declaration of function 'pciGetVirtualFunctions' [-Wimplicit-function-declaration] node_device/node_device_hal.c:154: error: nested extern declaration of 'pciGetVirtualFunctions' [-Wnested-externs] -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Tue, Feb 05, 2013 at 03:03:47PM -0700, Eric Blake wrote:
On 02/05/2013 08:07 AM, Daniel P. Berrange wrote:
On Mon, Feb 04, 2013 at 06:31:10PM +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:30 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Rename all the pciDeviceXXX and pciXXXDevice APIs to have a fixed virPCIDevice name prefix
ACK whether you implement changes I suggested or not (or just some of them) as long as make all check syntax-check succeeds.
Will fix them all
I believe this patch is the cause of my build failures on RHEL 6:
CC libvirt_driver_nodedev_la-node_device_hal.lo cc1: warnings being treated as errors node_device/node_device_hal.c: In function 'gather_pci_cap': node_device/node_device_hal.c:151: error: implicit declaration of function 'pciGetPhysicalFunction' [-Wimplicit-function-declaration] node_device/node_device_hal.c:151: error: nested extern declaration of 'pciGetPhysicalFunction' [-Wnested-externs] node_device/node_device_hal.c:154: error: implicit declaration of function 'pciGetVirtualFunctions' [-Wimplicit-function-declaration] node_device/node_device_hal.c:154: error: nested extern declaration of 'pciGetVirtualFunctions' [-Wnested-externs]
Argh, the 'hal' driver - I knew there'd be something I'd miss. Will put together a patch Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

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 ae0e7a7..60c8ba3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1220,25 +1220,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; +virUSBDeviceListAdd; +virUSBDeviceListCount; +virUSBDeviceListDel; +virUSBDeviceListFind; +virUSBDeviceListFree; +virUSBDeviceListGet; +virUSBDeviceListNew; +virUSBDeviceListSteal; +virUSBDeviceNew; +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 5e664c7..32c0b6f 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3373,7 +3373,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) { @@ -3421,8 +3421,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) { @@ -3460,7 +3460,7 @@ lxcDomainAttachDeviceHostdevSubsysUSBLive(virLXCDriverPtr driver, vm->def, def, vroot) < 0) goto cleanup; - if (usbDeviceFileIterate(usb, + if (virUSBDeviceFileIterate(usb, virLXCSetupHostUsbDeviceCgroup, &group) < 0) goto cleanup; @@ -3472,7 +3472,7 @@ cleanup: if (ret < 0 && created) unlink(dstfile); - usbFreeDevice(usb); + virUSBDeviceFree(usb); virCgroupFree(&group); VIR_FREE(src); VIR_FREE(dstfile); @@ -3963,7 +3963,7 @@ lxcDomainDetachDeviceHostdevUSBLive(virLXCDriverPtr driver, int idx, ret = -1; char *dst = NULL; char *vroot; - usbDevice *usb = NULL; + virUSBDevicePtr usb = NULL; if ((idx = virDomainHostdevFind(vm->def, dev->data.hostdev, @@ -3999,8 +3999,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); @@ -4012,13 +4012,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); @@ -4026,7 +4026,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 ce6df5c..f7e9406 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -777,7 +777,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) @@ -1049,7 +1049,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 d942de5..5b6e2c5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1118,7 +1118,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) { @@ -1128,14 +1128,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; } @@ -1166,8 +1166,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, @@ -1176,15 +1176,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; } @@ -1194,7 +1194,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto cleanup; } - usbDeviceListSteal(list, usb); + virUSBDeviceListSteal(list, usb); } if (virSecurityManagerSetHostdevLabel(driver->securityManager, @@ -1221,7 +1221,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto error; } - usbDeviceListFree(list); + virUSBDeviceListFree(list); return 0; error: @@ -1230,9 +1230,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; } @@ -2401,7 +2401,7 @@ qemuDomainDetachHostUsbDevice(virQEMUDriverPtr driver, { qemuDomainObjPrivatePtr priv = vm->privateData; virDomainHostdevSubsysPtr subsys = &detach->source.subsys; - usbDevice *usb; + virUSBDevicePtr usb; int ret; if (!detach->info->alias) { @@ -2423,10 +2423,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 3c87a0f..bf795b0 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -306,7 +306,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; @@ -770,15 +770,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 b52bfa1..ae489e2 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 0676543..2f5012d 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -1172,7 +1172,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; @@ -1196,19 +1196,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; } @@ -1337,7 +1337,7 @@ virSecuritySELinuxRestoreSecurityPCILabel(virPCIDevicePtr dev ATTRIBUTE_UNUSED, } static int -virSecuritySELinuxRestoreSecurityUSBLabel(usbDevice *dev ATTRIBUTE_UNUSED, +virSecuritySELinuxRestoreSecurityUSBLabel(virUSBDevicePtr dev ATTRIBUTE_UNUSED, const char *file, void *opaque) { @@ -1357,19 +1357,19 @@ virSecuritySELinuxRestoreSecurityHostdevSubsysLabel(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, virSecuritySELinuxRestoreSecurityUSBLabel, mgr); - usbFreeDevice(usb); + ret = virUSBDeviceFileIterate(usb, virSecuritySELinuxRestoreSecurityUSBLabel, mgr); + 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.1

On Fri, Feb 01, 2013 at 11:18:31 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Rename all the usbDeviceXXX and usbXXXDevice APIs to have a fixed virUSBDevice name prefix ... 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 ... @@ -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);
This line looks like a standalone bug fix that should be in a separate patch. Not to mention that the same call should be done even if virUSBDeviceFileIterate fails.
break; case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: switch (hostdev->source.caps.type) {
...
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 ... @@ -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; }
This code has the same bug you fixed for LXC. But again, it's for a separate patch.
}
... ACK after separating the bug fix into its own patch. Jirka

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/libvirt_private.syms | 2 -- 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 +- 9 files changed, 77 insertions(+), 46 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 60c8ba3..765025a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1007,7 +1007,6 @@ virPCIDeviceListCount; virPCIDeviceListDel; virPCIDeviceListFind; virPCIDeviceListFindIndex; -virPCIDeviceListFree; virPCIDeviceListGet; virPCIDeviceListNew; virPCIDeviceListSteal; @@ -1233,7 +1232,6 @@ virUSBDeviceListAdd; virUSBDeviceListCount; virUSBDeviceListDel; virUSBDeviceListFind; -virUSBDeviceListFree; virUSBDeviceListGet; virUSBDeviceListNew; virUSBDeviceListSteal; 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 f7e9406..b34b8e1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1047,9 +1047,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 5b6e2c5..450a62e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1221,7 +1221,7 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver, goto error; } - virUSBDeviceListFree(list); + virObjectUnref(list); return 0; error: @@ -1230,7 +1230,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.1

On Fri, Feb 01, 2013 at 11:18:32 +0000, Daniel P. Berrange wrote:
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/libvirt_private.syms | 2 -- 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 +- 9 files changed, 77 insertions(+), 46 deletions(-)
ACK Jirka

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 b34b8e1..1644792 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10030,6 +10030,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, @@ -10038,6 +10040,8 @@ qemuNodeDeviceDettach(virNodeDevicePtr dev) ret = 0; out: + virObjectUnlock(driver->inactivePciHostdevs); + virObjectUnlock(driver->activePciHostdevs); qemuDriverUnlock(driver); if (in_inactive_list) virPCIDeviceFree(pci); @@ -10060,6 +10064,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); @@ -10072,17 +10079,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; @@ -10104,6 +10113,8 @@ qemuNodeDeviceReset(virNodeDevicePtr dev) return -1; qemuDriverLock(driver); + virObjectLock(driver->activePciHostdevs); + virObjectLock(driver->inactivePciHostdevs); if (virPCIDeviceReset(pci, driver->activePciHostdevs, driver->inactivePciHostdevs) < 0) @@ -10111,6 +10122,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 450a62e..0faac3a 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2368,6 +2368,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) { @@ -2383,6 +2385,8 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, } virPCIDeviceFree(pci); } + virObjectUnlock(driver->activePciHostdevs); + virObjectUnlock(driver->inactivePciHostdevs); if (qemuCapsGet(priv->caps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, @@ -2425,7 +2429,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.1

On Fri, Feb 01, 2013 at 11:18:33 +0000, Daniel P. Berrange wrote:
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. ... 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 ... @@ -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);
Bad copy&paste, you really should call virObjectUnlock here :-)
+ return ret; }
static int
ACK with the typo fixed. Jirka

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.1

On Fri, Feb 01, 2013 at 11:18:34 +0000, Daniel P. Berrange wrote:
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; ... + /* Immutable pointer, self-locking APis */
s/APis/APIs/
virPortAllocatorPtr remotePorts;
+ /* Immutable pointer, lockless APIs*/ virSysinfoDefPtr hostsysinfo;
+ /* Immutable pointer. XXX check safety */ virLockManagerPluginPtr lockManager;
+ /* Immutable pointer. Unsafe APIs. XXX */ virHashTablePtr closeCallbacks; };
ACK with the small typo fixed. Jirka

From: "Daniel P. Berrange" <berrange@redhat.com> --- src/qemu/qemu_domain.c | 11 +++-------- src/qemu/qemu_driver.c | 3 +++ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cb031d8..5bf0ab0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1612,14 +1612,9 @@ cleanup: const char * qemuFindQemuImgBinary(virQEMUDriverPtr driver) { - if (!driver->qemuImgBinary) { - driver->qemuImgBinary = virFindFileInPath("kvm-img"); - if (!driver->qemuImgBinary) - driver->qemuImgBinary = virFindFileInPath("qemu-img"); - if (!driver->qemuImgBinary) - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("unable to find kvm-img or qemu-img")); - } + if (!driver->qemuImgBinary) + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("unable to find kvm-img or qemu-img")); return driver->qemuImgBinary; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1644792..ed44b06 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -738,6 +738,9 @@ qemuStartup(bool privileged, virStrerror(-rc, ebuf, sizeof(ebuf))); } + qemu_driver->qemuImgBinary = virFindFileInPath("kvm-img"); + if (!qemu_driver->qemuImgBinary) + qemu_driver->qemuImgBinary = virFindFileInPath("qemu-img"); if (!(qemu_driver->lockManager = virLockManagerPluginNew(cfg->lockManagerName ? -- 1.8.1

On Fri, Feb 01, 2013 at 11:18:35 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
--- src/qemu/qemu_domain.c | 11 +++-------- src/qemu/qemu_driver.c | 3 +++ 2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cb031d8..5bf0ab0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1612,14 +1612,9 @@ cleanup: const char * qemuFindQemuImgBinary(virQEMUDriverPtr driver) { - if (!driver->qemuImgBinary) { - driver->qemuImgBinary = virFindFileInPath("kvm-img"); - if (!driver->qemuImgBinary) - driver->qemuImgBinary = virFindFileInPath("qemu-img"); - if (!driver->qemuImgBinary) - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("unable to find kvm-img or qemu-img")); - } + if (!driver->qemuImgBinary) + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("unable to find kvm-img or qemu-img"));
return driver->qemuImgBinary; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1644792..ed44b06 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -738,6 +738,9 @@ qemuStartup(bool privileged, virStrerror(-rc, ebuf, sizeof(ebuf))); }
+ qemu_driver->qemuImgBinary = virFindFileInPath("kvm-img"); + if (!qemu_driver->qemuImgBinary) + qemu_driver->qemuImgBinary = virFindFileInPath("qemu-img");
if (!(qemu_driver->lockManager = virLockManagerPluginNew(cfg->lockManagerName ?
After this patch, users cannot install missing {qemu,kvm}-img on the fly without restarting libvirtd. However, since the binary is either part of qemu package or the package depend on it and we already require libvirtd restart after installing qemu, this change seems fine. ACK Jirka

On Fri, Feb 01, 2013 at 14:00:47 +0100, Jiri Denemark wrote:
On Fri, Feb 01, 2013 at 11:18:35 +0000, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
--- src/qemu/qemu_domain.c | 11 +++-------- src/qemu/qemu_driver.c | 3 +++ 2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index cb031d8..5bf0ab0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1612,14 +1612,9 @@ cleanup: const char * qemuFindQemuImgBinary(virQEMUDriverPtr driver) { - if (!driver->qemuImgBinary) { - driver->qemuImgBinary = virFindFileInPath("kvm-img"); - if (!driver->qemuImgBinary) - driver->qemuImgBinary = virFindFileInPath("qemu-img"); - if (!driver->qemuImgBinary) - virReportError(VIR_ERR_INTERNAL_ERROR, - "%s", _("unable to find kvm-img or qemu-img")); - } + if (!driver->qemuImgBinary) + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("unable to find kvm-img or qemu-img"));
return driver->qemuImgBinary; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1644792..ed44b06 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -738,6 +738,9 @@ qemuStartup(bool privileged, virStrerror(-rc, ebuf, sizeof(ebuf))); }
+ qemu_driver->qemuImgBinary = virFindFileInPath("kvm-img"); + if (!qemu_driver->qemuImgBinary) + qemu_driver->qemuImgBinary = virFindFileInPath("qemu-img");
if (!(qemu_driver->lockManager = virLockManagerPluginNew(cfg->lockManagerName ?
After this patch, users cannot install missing {qemu,kvm}-img on the fly without restarting libvirtd. However, since the binary is either part of qemu package or the package depend on it and we already require libvirtd restart after installing qemu, this change seems fine.
ACK
And this patch should also change the annotation in /* Lazy-load on first use. Unsafe. XXX */ char *qemuImgBinary; Jirka
participants (4)
-
Daniel P. Berrange
-
Eric Blake
-
Jiri Denemark
-
Viktor Mihajlovski