return ret;
}
+
+static int
+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
-qemuSetupChardevCgroup(virDomainDefPtr def ATTRIBUTE_UNUSED,
- virDomainChrDefPtr dev,
- void *opaque)
+qemuSetupChardevCgroupCB(virDomainDefPtr def ATTRIBUTE_UNUSED,
+ virDomainChrDefPtr dev,
+ void *opaque)
{
virDomainObjPtr vm = opaque;
}
+int
+qemuSetupChardevCgroup(virDomainObjPtr vm,
+ virDomainChrDefPtr dev)
+{
+ return qemuSetupChrSourceCgroup(vm, dev->source);
+}
+
+
+int
+qemuTeardownChardevCgroup(virDomainObjPtr vm,
+ virDomainChrDefPtr dev)
+{
+ return qemuTeardownChrSourceCgroup(vm, dev->source);
+}
+
+
static int
qemuSetupDevicesCgroup(virQEMUDriverPtr driver,
virDomainObjPtr vm)
if (virDomainChrDefForeach(vm->def,
true,
- qemuSetupChardevCgroup,
+ qemuSetupChardevCgroupCB,
vm) < 0)
goto cleanup;
virDomainRNGDefPtr rng);
int qemuTeardownRNGCgroup(virDomainObjPtr vm,
virDomainRNGDefPtr rng);
+int qemuSetupChardevCgroup(virDomainObjPtr vm,
+ virDomainChrDefPtr dev);
+int qemuTeardownChardevCgroup(virDomainObjPtr vm,
+ virDomainChrDefPtr dev);
int qemuConnectCgroup(virQEMUDriverPtr driver,
virDomainObjPtr vm);
int qemuSetupCgroup(virQEMUDriverPtr driver,
char *charAlias = NULL;
bool chardevAttached = false;
bool tlsobjAdded = false;
+ bool teardowncgroup = false;
bool secobjAdded = false;
virJSONValuePtr tlsProps = NULL;
char *tlsAlias = NULL;
if (rc == 1)
need_release = true;
+ if (qemuSetupChardevCgroup(vm, chr) < 0)
+ goto cleanup;
+ teardowncgroup = true;
+
if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
goto cleanup;
audit:
virDomainAuditChardev(vm, NULL, chr, "attach", ret == 0);
cleanup:
- if (ret < 0 && virDomainObjIsActive(vm))
- qemuDomainChrInsertPreAllocCleanup(vmdef, chr);
- if (ret < 0 && need_release)
- qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL);
+ if (ret < 0) {
+ if (virDomainObjIsActive(vm))
+ qemuDomainChrInsertPreAllocCleanup(vmdef, chr);
+ 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);
virJSONValueFree(tlsProps);
VIR_FREE(secAlias);
if (rc < 0)
goto cleanup;
+ if (qemuTeardownChardevCgroup(vm, chr) < 0)
+ VIR_WARN("Failed to remove chr device cgroup ACL");
+
event = virDomainEventDeviceRemovedNewFromObj(vm, chr->info.alias);
qemuDomainEventQueue(driver, event);