static int
virQEMUCapsInitCached(virCapsPtr caps,
virQEMUCapsPtr qemuCaps,
- const char *cacheDir)
+ const char *cacheDir,
+ uid_t runUid,
+ gid_t runGid)
{
char *capsdir = NULL;
char *capsfile = NULL;
goto discard;
}
- if (!virQEMUCapsIsValid(qemuCaps, qemuctime))
+ if (!virQEMUCapsIsValid(qemuCaps, qemuctime, runUid, runGid))
goto discard;
/* Discard cache if QEMU binary or libvirtd changed */
if (!cacheDir)
rv = 0;
- else if ((rv = virQEMUCapsInitCached(caps, qemuCaps, cacheDir)) < 0)
+ else if ((rv = virQEMUCapsInitCached(caps, qemuCaps, cacheDir,
+ runUid, runGid)) < 0)
goto error;
if (rv == 0) {
bool
virQEMUCapsIsValid(virQEMUCapsPtr qemuCaps,
- time_t qemuctime)
+ time_t qemuctime,
+ uid_t runUid,
+ gid_t runGid)
{
+ bool kvmUsable;
+
if (!qemuCaps->binary)
return true;
return false;
}
+ kvmUsable = virFileAccessibleAs("/dev/kvm", R_OK | W_OK,
+ runUid, runGid) == 0;
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
+ virQEMUCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM) &&
+ kvmUsable) {
+ VIR_DEBUG("KVM was not enabled when probing '%s', "
+ "but it should be usable now",
+ qemuCaps->binary);
+ return false;
+ }
+
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
+ !kvmUsable) {
+ VIR_DEBUG("KVM was enabled when probing '%s', "
+ "but it is not available now",
+ qemuCaps->binary);
+ return false;
+ }
+
return true;
}
virMutexLock(&cache->lock);
ret = virHashLookup(cache->binaries, binary);
if (ret &&
- !virQEMUCapsIsValid(ret, 0)) {
+ !virQEMUCapsIsValid(ret, 0, cache->runUid, cache->runGid)) {
VIR_DEBUG("Cached capabilities %p no longer valid for %s",
ret, binary);
virHashRemoveEntry(cache->binaries, binary);