提交 5d9c2c70 编写于 作者: M Michal Privoznik

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: NMichal Privoznik <mprivozn@redhat.com>
上级 085692c8
...@@ -189,8 +189,30 @@ qemuSetupChrSourceCgroup(virDomainObjPtr vm, ...@@ -189,8 +189,30 @@ qemuSetupChrSourceCgroup(virDomainObjPtr vm,
return ret; return ret;
} }
static int static int
qemuSetupChardevCgroup(virDomainDefPtr def ATTRIBUTE_UNUSED, qemuTeardownChrSourceCgroup(virDomainObjPtr vm,
virDomainChrSourceDefPtr source)
{
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, virDomainChrDefPtr dev,
void *opaque) void *opaque)
{ {
...@@ -617,6 +639,22 @@ qemuTeardownRNGCgroup(virDomainObjPtr vm, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) {
if (virDomainObjIsActive(vm))
qemuDomainChrInsertPreAllocCleanup(vmdef, chr); qemuDomainChrInsertPreAllocCleanup(vmdef, chr);
if (ret < 0 && need_release) if (need_release)
qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL); 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, ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册