diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 3f2c08952b..16000d0c7a 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3774,6 +3774,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, } +static void +virQEMUCapsCachePrivFree(virQEMUCapsCachePrivPtr priv) +{ + VIR_FREE(priv->libDir); + VIR_FREE(priv); +} + + /* * Parsing a doc that looks like * @@ -4262,8 +4270,7 @@ virQEMUCapsRememberCached(virQEMUCapsPtr qemuCaps, const char *cacheDir) static bool virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps, - uid_t runUid, - gid_t runGid) + virQEMUCapsCachePrivPtr priv) { bool kvmUsable; struct stat sb; @@ -4300,7 +4307,7 @@ virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps, } kvmUsable = virFileAccessibleAs("/dev/kvm", R_OK | W_OK, - runUid, runGid) == 0; + priv->runUid, priv->runGid) == 0; if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM) && @@ -4328,8 +4335,7 @@ virQEMUCapsInitCached(virCapsPtr caps, virQEMUCapsPtr *qemuCaps, const char *binary, const char *cacheDir, - uid_t runUid, - gid_t runGid) + virQEMUCapsCachePrivPtr priv) { char *capsdir = NULL; char *capsfile = NULL; @@ -4380,7 +4386,7 @@ virQEMUCapsInitCached(virCapsPtr caps, goto discard; } - if (!virQEMUCapsIsValid(qemuCapsNew, runUid, runGid)) + if (!virQEMUCapsIsValid(qemuCapsNew, priv)) goto discard; VIR_DEBUG("Loaded '%s' for '%s' ctime %lld usedQMP=%d", @@ -5285,22 +5291,21 @@ virQEMUCapsNewForBinaryInternal(virCapsPtr caps, static virQEMUCapsPtr virQEMUCapsNewForBinary(virCapsPtr caps, const char *binary, - const char *libDir, const char *cacheDir, - uid_t runUid, - gid_t runGid) + virQEMUCapsCachePrivPtr priv) { int rv; virQEMUCapsPtr qemuCaps = NULL; - if ((rv = virQEMUCapsInitCached(caps, &qemuCaps, binary, cacheDir, - runUid, runGid)) < 0) + if ((rv = virQEMUCapsInitCached(caps, &qemuCaps, binary, cacheDir, priv)) < 0) goto error; if (rv == 0) { if (!(qemuCaps = virQEMUCapsNewForBinaryInternal(caps, binary, - libDir, runUid, - runGid, false))) { + priv->libDir, + priv->runUid, + priv->runGid, + false))) { goto error; } @@ -5374,13 +5379,17 @@ virQEMUCapsCacheNew(const char *libDir, if (!(cache->binaries = virHashCreate(10, virObjectFreeHashData))) goto error; - if (VIR_STRDUP(cache->libDir, libDir) < 0) - goto error; if (VIR_STRDUP(cache->cacheDir, cacheDir) < 0) goto error; - cache->runUid = runUid; - cache->runGid = runGid; + if (VIR_ALLOC(cache->priv) < 0) + goto error; + + if (VIR_STRDUP(cache->priv->libDir, libDir) < 0) + goto error; + + cache->priv->runUid = runUid; + cache->priv->runGid = runGid; return cache; @@ -5397,7 +5406,7 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache, virQEMUCapsPtr *qemuCaps) { if (*qemuCaps && - !virQEMUCapsIsValid(*qemuCaps, cache->runUid, cache->runGid)) { + !virQEMUCapsIsValid(*qemuCaps, cache->priv)) { VIR_DEBUG("Cached capabilities %p no longer valid for %s", *qemuCaps, binary); virHashRemoveEntry(cache->binaries, binary); @@ -5407,8 +5416,8 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache, if (!*qemuCaps) { VIR_DEBUG("Creating capabilities for %s", binary); *qemuCaps = virQEMUCapsNewForBinary(caps, binary, - cache->libDir, cache->cacheDir, - cache->runUid, cache->runGid); + cache->cacheDir, + cache->priv); if (*qemuCaps) { VIR_DEBUG("Caching capabilities %p for %s", *qemuCaps, binary); if (virHashAddEntry(cache->binaries, binary, *qemuCaps) < 0) { @@ -5527,7 +5536,7 @@ virQEMUCapsCacheFree(virQEMUCapsCachePtr cache) if (!cache) return; - VIR_FREE(cache->libDir); + virQEMUCapsCachePrivFree(cache->priv); VIR_FREE(cache->cacheDir); virHashFree(cache->binaries); virMutexDestroy(&cache->lock); diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h index 3458fc0700..61e7c34d12 100644 --- a/src/qemu/qemu_capspriv.h +++ b/src/qemu/qemu_capspriv.h @@ -28,13 +28,19 @@ #ifndef __QEMU_CAPSPRIV_H__ # define __QEMU_CAPSPRIV_H__ +struct _virQEMUCapsCachePriv { + char *libDir; + uid_t runUid; + gid_t runGid; +}; +typedef struct _virQEMUCapsCachePriv virQEMUCapsCachePriv; +typedef virQEMUCapsCachePriv *virQEMUCapsCachePrivPtr; + struct _virQEMUCapsCache { virMutex lock; virHashTablePtr binaries; - char *libDir; char *cacheDir; - uid_t runUid; - gid_t runGid; + virQEMUCapsCachePrivPtr priv; }; virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps);