mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-08-24 09:49:59 +03:00
qemu: Update cgroup on chardev hotplug
Just like in the previous commit, we are not updating CGroups on chardev hot(un-)plug and thus leaving qemu unable to access any non-default device users are trying to hotplug. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
@ -189,10 +189,32 @@ qemuSetupChrSourceCgroup(virDomainObjPtr vm,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuSetupChardevCgroup(virDomainDefPtr def ATTRIBUTE_UNUSED,
|
qemuTeardownChrSourceCgroup(virDomainObjPtr vm,
|
||||||
virDomainChrDefPtr dev,
|
virDomainChrSourceDefPtr source)
|
||||||
void *opaque)
|
{
|
||||||
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (source->type != VIR_DOMAIN_CHR_TYPE_DEV)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
VIR_DEBUG("Process path '%s' for device", source->data.file.path);
|
||||||
|
|
||||||
|
ret = virCgroupDenyDevicePath(priv->cgroup, source->data.file.path,
|
||||||
|
VIR_CGROUP_DEVICE_RW, false);
|
||||||
|
virDomainAuditCgroupPath(vm, priv->cgroup, "deny",
|
||||||
|
source->data.file.path, "rw", ret == 0);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuSetupChardevCgroupCB(virDomainDefPtr def ATTRIBUTE_UNUSED,
|
||||||
|
virDomainChrDefPtr dev,
|
||||||
|
void *opaque)
|
||||||
{
|
{
|
||||||
virDomainObjPtr vm = opaque;
|
virDomainObjPtr vm = opaque;
|
||||||
|
|
||||||
@ -617,6 +639,22 @@ qemuTeardownRNGCgroup(virDomainObjPtr vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuSetupChardevCgroup(virDomainObjPtr vm,
|
||||||
|
virDomainChrDefPtr dev)
|
||||||
|
{
|
||||||
|
return qemuSetupChrSourceCgroup(vm, dev->source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuTeardownChardevCgroup(virDomainObjPtr vm,
|
||||||
|
virDomainChrDefPtr dev)
|
||||||
|
{
|
||||||
|
return qemuTeardownChrSourceCgroup(vm, dev->source);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuSetupDevicesCgroup(virQEMUDriverPtr driver,
|
qemuSetupDevicesCgroup(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
@ -693,7 +731,7 @@ qemuSetupDevicesCgroup(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
if (virDomainChrDefForeach(vm->def,
|
if (virDomainChrDefForeach(vm->def,
|
||||||
true,
|
true,
|
||||||
qemuSetupChardevCgroup,
|
qemuSetupChardevCgroupCB,
|
||||||
vm) < 0)
|
vm) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -47,6 +47,10 @@ int qemuSetupRNGCgroup(virDomainObjPtr vm,
|
|||||||
virDomainRNGDefPtr rng);
|
virDomainRNGDefPtr rng);
|
||||||
int qemuTeardownRNGCgroup(virDomainObjPtr vm,
|
int qemuTeardownRNGCgroup(virDomainObjPtr vm,
|
||||||
virDomainRNGDefPtr rng);
|
virDomainRNGDefPtr rng);
|
||||||
|
int qemuSetupChardevCgroup(virDomainObjPtr vm,
|
||||||
|
virDomainChrDefPtr dev);
|
||||||
|
int qemuTeardownChardevCgroup(virDomainObjPtr vm,
|
||||||
|
virDomainChrDefPtr dev);
|
||||||
int qemuConnectCgroup(virQEMUDriverPtr driver,
|
int qemuConnectCgroup(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
int qemuSetupCgroup(virQEMUDriverPtr driver,
|
int qemuSetupCgroup(virQEMUDriverPtr driver,
|
||||||
|
@ -1830,6 +1830,7 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
|
|||||||
char *charAlias = NULL;
|
char *charAlias = NULL;
|
||||||
bool chardevAttached = false;
|
bool chardevAttached = false;
|
||||||
bool tlsobjAdded = false;
|
bool tlsobjAdded = false;
|
||||||
|
bool teardowncgroup = false;
|
||||||
bool secobjAdded = false;
|
bool secobjAdded = false;
|
||||||
virJSONValuePtr tlsProps = NULL;
|
virJSONValuePtr tlsProps = NULL;
|
||||||
char *tlsAlias = NULL;
|
char *tlsAlias = NULL;
|
||||||
@ -1851,6 +1852,10 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
|
|||||||
if (rc == 1)
|
if (rc == 1)
|
||||||
need_release = true;
|
need_release = true;
|
||||||
|
|
||||||
|
if (qemuSetupChardevCgroup(vm, chr) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
teardowncgroup = true;
|
||||||
|
|
||||||
if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
|
if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1903,10 +1908,14 @@ int qemuDomainAttachChrDevice(virConnectPtr conn,
|
|||||||
audit:
|
audit:
|
||||||
virDomainAuditChardev(vm, NULL, chr, "attach", ret == 0);
|
virDomainAuditChardev(vm, NULL, chr, "attach", ret == 0);
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0 && virDomainObjIsActive(vm))
|
if (ret < 0) {
|
||||||
qemuDomainChrInsertPreAllocCleanup(vmdef, chr);
|
if (virDomainObjIsActive(vm))
|
||||||
if (ret < 0 && need_release)
|
qemuDomainChrInsertPreAllocCleanup(vmdef, chr);
|
||||||
qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL);
|
if (need_release)
|
||||||
|
qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL);
|
||||||
|
if (teardowncgroup && qemuTeardownChardevCgroup(vm, chr) < 0)
|
||||||
|
VIR_WARN("Unable to remove chr device cgroup ACL on hotplug fail");
|
||||||
|
}
|
||||||
VIR_FREE(tlsAlias);
|
VIR_FREE(tlsAlias);
|
||||||
virJSONValueFree(tlsProps);
|
virJSONValueFree(tlsProps);
|
||||||
VIR_FREE(secAlias);
|
VIR_FREE(secAlias);
|
||||||
@ -3847,6 +3856,9 @@ qemuDomainRemoveChrDevice(virQEMUDriverPtr driver,
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (qemuTeardownChardevCgroup(vm, chr) < 0)
|
||||||
|
VIR_WARN("Failed to remove chr device cgroup ACL");
|
||||||
|
|
||||||
event = virDomainEventDeviceRemovedNewFromObj(vm, chr->info.alias);
|
event = virDomainEventDeviceRemovedNewFromObj(vm, chr->info.alias);
|
||||||
qemuDomainEventQueue(driver, event);
|
qemuDomainEventQueue(driver, event);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user