if (!(cfg->namespaces = virBitmapNew(QEMU_DOMAIN_NS_LAST)))
goto error;
-#if defined(__linux__)
if (privileged &&
- virProcessNamespaceAvailable(VIR_PROCESS_NAMESPACE_MNT) == 0 &&
+ qemuDomainNamespaceAvailable(QEMU_DOMAIN_NS_MOUNT) &&
virBitmapSetBit(cfg->namespaces, QEMU_DOMAIN_NS_MOUNT) < 0)
goto error;
-#endif /* defined(__linux__) */
#ifdef DEFAULT_LOADER_NVRAM
if (virFirmwareParseList(DEFAULT_LOADER_NVRAM,
int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
- const char *filename)
+ const char *filename,
+ bool privileged)
{
virConfPtr conf = NULL;
int ret = -1;
goto cleanup;
}
+ if (!privileged) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("cannot use namespaces in session mode"));
+ goto cleanup;
+ }
+
+ if (qemuDomainNamespaceAvailable(ns) < 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("%s namespace is not available"),
+ namespaces[i]);
+ goto cleanup;
+ }
+
if (virBitmapSetBit(cfg->namespaces, ns) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to enable namespace: %s"),
virQEMUDriverConfigPtr virQEMUDriverConfigNew(bool privileged);
int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
- const char *filename);
+ const char *filename,
+ bool privileged);
virQEMUDriverConfigPtr virQEMUDriverGetConfig(virQEMUDriverPtr driver);
bool virQEMUDriverIsPrivileged(virQEMUDriverPtr driver);
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
int ret = -1;
- if (!virBitmapIsBitSet(cfg->namespaces, QEMU_DOMAIN_NS_MOUNT)) {
- ret = 0;
- goto cleanup;
- }
-
- if (!virQEMUDriverIsPrivileged(driver)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("cannot use namespaces in session mode"));
- goto cleanup;
- }
-
- if (virProcessNamespaceAvailable(VIR_PROCESS_NAMESPACE_MNT) < 0)
- goto cleanup;
-
- if (qemuDomainEnableNamespace(vm, QEMU_DOMAIN_NS_MOUNT) < 0)
+ if (virBitmapIsBitSet(cfg->namespaces, QEMU_DOMAIN_NS_MOUNT) &&
+ qemuDomainEnableNamespace(vm, QEMU_DOMAIN_NS_MOUNT) < 0)
goto cleanup;
ret = 0;
}
+bool
+qemuDomainNamespaceAvailable(qemuDomainNamespace ns ATTRIBUTE_UNUSED)
+{
+#if !defined(__linux__)
+ /* Namespaces are Linux specific. */
+ return false;
+
+#else /* defined(__linux__) */
+
+ switch (ns) {
+ case QEMU_DOMAIN_NS_MOUNT:
+# if !defined(HAVE_SYS_ACL_H) || !defined(WITH_SELINUX)
+ /* We can't create the exact copy of paths if either of
+ * these is not available. */
+ return false;
+# else
+ if (virProcessNamespaceAvailable(VIR_PROCESS_NAMESPACE_MNT) < 0)
+ return false;
+# endif
+ break;
+ case QEMU_DOMAIN_NS_LAST:
+ break;
+ }
+
+ return true;
+#endif /* defined(__linux__) */
+}
+
+
struct qemuDomainAttachDeviceMknodData {
virQEMUDriverPtr driver;
virDomainObjPtr vm;
int qemuDomainCreateNamespace(virQEMUDriverPtr driver,
virDomainObjPtr vm);
+bool qemuDomainNamespaceAvailable(qemuDomainNamespace ns);
+
int qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virStorageSourcePtr src);
if (virAsprintf(&driverConf, "%s/qemu.conf", cfg->configBaseDir) < 0)
goto error;
- if (virQEMUDriverConfigLoadFile(cfg, driverConf) < 0)
+ if (virQEMUDriverConfigLoadFile(cfg, driverConf, privileged) < 0)
goto error;
VIR_FREE(driverConf);