提交 731cfd5f 编写于 作者: P Pavel Hrdina

qemu: introduce struct _virQEMUCapsCachePriv

This will store private data that will be used by following patches
when switching to virFileCache.
Signed-off-by: NPavel Hrdina <phrdina@redhat.com>
Reviewed-by: NJiri Denemark <jdenemar@redhat.com>
上级 478f0c5b
...@@ -3774,6 +3774,14 @@ virQEMUCapsLoadCPUModels(virQEMUCapsPtr qemuCaps, ...@@ -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 * Parsing a doc that looks like
* *
...@@ -4262,8 +4270,7 @@ virQEMUCapsRememberCached(virQEMUCapsPtr qemuCaps, const char *cacheDir) ...@@ -4262,8 +4270,7 @@ virQEMUCapsRememberCached(virQEMUCapsPtr qemuCaps, const char *cacheDir)
static bool static bool
virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps, virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
uid_t runUid, virQEMUCapsCachePrivPtr priv)
gid_t runGid)
{ {
bool kvmUsable; bool kvmUsable;
struct stat sb; struct stat sb;
...@@ -4300,7 +4307,7 @@ virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps, ...@@ -4300,7 +4307,7 @@ virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
} }
kvmUsable = virFileAccessibleAs("/dev/kvm", R_OK | W_OK, kvmUsable = virFileAccessibleAs("/dev/kvm", R_OK | W_OK,
runUid, runGid) == 0; priv->runUid, priv->runGid) == 0;
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) && if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM) && virQEMUCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM) &&
...@@ -4328,8 +4335,7 @@ virQEMUCapsInitCached(virCapsPtr caps, ...@@ -4328,8 +4335,7 @@ virQEMUCapsInitCached(virCapsPtr caps,
virQEMUCapsPtr *qemuCaps, virQEMUCapsPtr *qemuCaps,
const char *binary, const char *binary,
const char *cacheDir, const char *cacheDir,
uid_t runUid, virQEMUCapsCachePrivPtr priv)
gid_t runGid)
{ {
char *capsdir = NULL; char *capsdir = NULL;
char *capsfile = NULL; char *capsfile = NULL;
...@@ -4380,7 +4386,7 @@ virQEMUCapsInitCached(virCapsPtr caps, ...@@ -4380,7 +4386,7 @@ virQEMUCapsInitCached(virCapsPtr caps,
goto discard; goto discard;
} }
if (!virQEMUCapsIsValid(qemuCapsNew, runUid, runGid)) if (!virQEMUCapsIsValid(qemuCapsNew, priv))
goto discard; goto discard;
VIR_DEBUG("Loaded '%s' for '%s' ctime %lld usedQMP=%d", VIR_DEBUG("Loaded '%s' for '%s' ctime %lld usedQMP=%d",
...@@ -5285,22 +5291,21 @@ virQEMUCapsNewForBinaryInternal(virCapsPtr caps, ...@@ -5285,22 +5291,21 @@ virQEMUCapsNewForBinaryInternal(virCapsPtr caps,
static virQEMUCapsPtr static virQEMUCapsPtr
virQEMUCapsNewForBinary(virCapsPtr caps, virQEMUCapsNewForBinary(virCapsPtr caps,
const char *binary, const char *binary,
const char *libDir,
const char *cacheDir, const char *cacheDir,
uid_t runUid, virQEMUCapsCachePrivPtr priv)
gid_t runGid)
{ {
int rv; int rv;
virQEMUCapsPtr qemuCaps = NULL; virQEMUCapsPtr qemuCaps = NULL;
if ((rv = virQEMUCapsInitCached(caps, &qemuCaps, binary, cacheDir, if ((rv = virQEMUCapsInitCached(caps, &qemuCaps, binary, cacheDir, priv)) < 0)
runUid, runGid)) < 0)
goto error; goto error;
if (rv == 0) { if (rv == 0) {
if (!(qemuCaps = virQEMUCapsNewForBinaryInternal(caps, binary, if (!(qemuCaps = virQEMUCapsNewForBinaryInternal(caps, binary,
libDir, runUid, priv->libDir,
runGid, false))) { priv->runUid,
priv->runGid,
false))) {
goto error; goto error;
} }
...@@ -5374,13 +5379,17 @@ virQEMUCapsCacheNew(const char *libDir, ...@@ -5374,13 +5379,17 @@ virQEMUCapsCacheNew(const char *libDir,
if (!(cache->binaries = virHashCreate(10, virObjectFreeHashData))) if (!(cache->binaries = virHashCreate(10, virObjectFreeHashData)))
goto error; goto error;
if (VIR_STRDUP(cache->libDir, libDir) < 0)
goto error;
if (VIR_STRDUP(cache->cacheDir, cacheDir) < 0) if (VIR_STRDUP(cache->cacheDir, cacheDir) < 0)
goto error; goto error;
cache->runUid = runUid; if (VIR_ALLOC(cache->priv) < 0)
cache->runGid = runGid; goto error;
if (VIR_STRDUP(cache->priv->libDir, libDir) < 0)
goto error;
cache->priv->runUid = runUid;
cache->priv->runGid = runGid;
return cache; return cache;
...@@ -5397,7 +5406,7 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache, ...@@ -5397,7 +5406,7 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache,
virQEMUCapsPtr *qemuCaps) virQEMUCapsPtr *qemuCaps)
{ {
if (*qemuCaps && if (*qemuCaps &&
!virQEMUCapsIsValid(*qemuCaps, cache->runUid, cache->runGid)) { !virQEMUCapsIsValid(*qemuCaps, cache->priv)) {
VIR_DEBUG("Cached capabilities %p no longer valid for %s", VIR_DEBUG("Cached capabilities %p no longer valid for %s",
*qemuCaps, binary); *qemuCaps, binary);
virHashRemoveEntry(cache->binaries, binary); virHashRemoveEntry(cache->binaries, binary);
...@@ -5407,8 +5416,8 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache, ...@@ -5407,8 +5416,8 @@ virQEMUCapsCacheValidate(virQEMUCapsCachePtr cache,
if (!*qemuCaps) { if (!*qemuCaps) {
VIR_DEBUG("Creating capabilities for %s", binary); VIR_DEBUG("Creating capabilities for %s", binary);
*qemuCaps = virQEMUCapsNewForBinary(caps, binary, *qemuCaps = virQEMUCapsNewForBinary(caps, binary,
cache->libDir, cache->cacheDir, cache->cacheDir,
cache->runUid, cache->runGid); cache->priv);
if (*qemuCaps) { if (*qemuCaps) {
VIR_DEBUG("Caching capabilities %p for %s", *qemuCaps, binary); VIR_DEBUG("Caching capabilities %p for %s", *qemuCaps, binary);
if (virHashAddEntry(cache->binaries, binary, *qemuCaps) < 0) { if (virHashAddEntry(cache->binaries, binary, *qemuCaps) < 0) {
...@@ -5527,7 +5536,7 @@ virQEMUCapsCacheFree(virQEMUCapsCachePtr cache) ...@@ -5527,7 +5536,7 @@ virQEMUCapsCacheFree(virQEMUCapsCachePtr cache)
if (!cache) if (!cache)
return; return;
VIR_FREE(cache->libDir); virQEMUCapsCachePrivFree(cache->priv);
VIR_FREE(cache->cacheDir); VIR_FREE(cache->cacheDir);
virHashFree(cache->binaries); virHashFree(cache->binaries);
virMutexDestroy(&cache->lock); virMutexDestroy(&cache->lock);
......
...@@ -28,13 +28,19 @@ ...@@ -28,13 +28,19 @@
#ifndef __QEMU_CAPSPRIV_H__ #ifndef __QEMU_CAPSPRIV_H__
# define __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 { struct _virQEMUCapsCache {
virMutex lock; virMutex lock;
virHashTablePtr binaries; virHashTablePtr binaries;
char *libDir;
char *cacheDir; char *cacheDir;
uid_t runUid; virQEMUCapsCachePrivPtr priv;
gid_t runGid;
}; };
virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps); virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册