[libvirt] [PATCH 4/5] qemuDomainAttachDeviceMknodRecursive: Don't try to create devices under preserved mount points
Cedric Bosdonnat
cbosdonnat at suse.com
Wed May 3 13:28:31 UTC 2017
On Fri, 2017-04-28 at 13:22 +0200, Michal Privoznik wrote:
> Just like in previous commit, this fixes the same issue for
> hotplug.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_domain.c | 112 ++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 97 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 5840c57..60f8f01 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -8238,6 +8238,8 @@ static int
> qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> const char *file,
> + char * const *devMountsPath,
> + size_t ndevMountsPath,
> unsigned int ttl)
> {
> struct qemuDomainAttachDeviceMknodData data;
> @@ -8315,20 +8317,36 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
> #endif
>
> if (STRPREFIX(file, DEVPREFIX)) {
> - if (qemuSecurityPreFork(driver->securityManager) < 0)
> - goto cleanup;
> + size_t i;
>
> - if (virProcessRunInMountNamespace(vm->pid,
> - qemuDomainAttachDeviceMknodHelper,
> - &data) < 0) {
> + for (i = 0; i < ndevMountsPath; i++) {
> + if (STREQ(devMountsPath[i], "/dev"))
> + continue;
> + if (STRPREFIX(file, devMountsPath[i]))
> + break;
> + }
> +
> + if (i == ndevMountsPath) {
> + if (qemuSecurityPreFork(driver->securityManager) < 0)
> + goto cleanup;
> +
> + if (virProcessRunInMountNamespace(vm->pid,
> + qemuDomainAttachDeviceMknodHelper,
> + &data) < 0) {
> + qemuSecurityPostFork(driver->securityManager);
> + goto cleanup;
> + }
> qemuSecurityPostFork(driver->securityManager);
> - goto cleanup;
> + } else {
> + VIR_DEBUG("Skipping dev %s because of %s mount point",
> + file, devMountsPath[i]);
> }
> - qemuSecurityPostFork(driver->securityManager);
> }
>
> if (isLink &&
> - qemuDomainAttachDeviceMknodRecursive(driver, vm, target, ttl -1) < 0)
> + qemuDomainAttachDeviceMknodRecursive(driver, vm, target,
> + devMountsPath, ndevMountsPath,
> + ttl -1) < 0)
> goto cleanup;
>
> ret = 0;
> @@ -8345,11 +8363,15 @@ qemuDomainAttachDeviceMknodRecursive(virQEMUDriverPtr driver,
> static int
> qemuDomainAttachDeviceMknod(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> - const char *file)
> + const char *file,
> + char * const *devMountsPath,
> + size_t ndevMountsPath)
> {
> long symloop_max = sysconf(_SC_SYMLOOP_MAX);
>
> - return qemuDomainAttachDeviceMknodRecursive(driver, vm, file, symloop_max);
> + return qemuDomainAttachDeviceMknodRecursive(driver, vm, file,
> + devMountsPath, ndevMountsPath,
> + symloop_max);
> }
>
>
> @@ -8389,6 +8411,9 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virStorageSourcePtr src)
> {
> + virQEMUDriverConfigPtr cfg = NULL;
> + char **devMountsPath = NULL;
> + size_t ndevMountsPath = 0;
> virStorageSourcePtr next;
> struct stat sb;
> int ret = -1;
> @@ -8396,6 +8421,12 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
> if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
> return 0;
>
> + cfg = virQEMUDriverGetConfig(driver);
> + if (qemuDomainGetPreservedMounts(cfg, vm,
> + &devMountsPath, NULL,
> + &ndevMountsPath) < 0)
> + goto cleanup;
> +
> for (next = src; next; next = next->backingStore) {
> if (virStorageSourceIsEmpty(next) ||
> !virStorageSourceIsLocalStorage(next)) {
> @@ -8414,12 +8445,15 @@ qemuDomainNamespaceSetupDisk(virQEMUDriverPtr driver,
>
> if (qemuDomainAttachDeviceMknod(driver,
> vm,
> - next->path) < 0)
> + next->path,
> + devMountsPath, ndevMountsPath) < 0)
> goto cleanup;
> }
>
> ret = 0;
> cleanup:
> + virStringListFreeCount(devMountsPath, ndevMountsPath);
> + virObjectUnref(cfg);
> return ret;
> }
>
> @@ -8444,6 +8478,9 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainHostdevDefPtr hostdev)
> {
> + virQEMUDriverConfigPtr cfg = NULL;
> + char **devMountsPath = NULL;
> + size_t ndevMountsPath = 0;
> int ret = -1;
> char **path = NULL;
> size_t i, npaths = 0;
> @@ -8454,10 +8491,17 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
> if (qemuDomainGetHostdevPath(NULL, hostdev, false, &npaths, &path, NULL) < 0)
> goto cleanup;
>
> + cfg = virQEMUDriverGetConfig(driver);
> + if (qemuDomainGetPreservedMounts(cfg, vm,
> + &devMountsPath, NULL,
> + &ndevMountsPath) < 0)
> + goto cleanup;
> +
> for (i = 0; i < npaths; i++) {
> if (qemuDomainAttachDeviceMknod(driver,
> vm,
> - path[i]) < 0)
> + path[i],
> + devMountsPath, ndevMountsPath) < 0)
> goto cleanup;
> }
>
> @@ -8466,6 +8510,8 @@ qemuDomainNamespaceSetupHostdev(virQEMUDriverPtr driver,
> for (i = 0; i < npaths; i++)
> VIR_FREE(path[i]);
> VIR_FREE(path);
> + virStringListFreeCount(devMountsPath, ndevMountsPath);
> + virObjectUnref(cfg);
> return ret;
> }
>
> @@ -8505,6 +8551,9 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainMemoryDefPtr mem)
> {
> + virQEMUDriverConfigPtr cfg = NULL;
> + char **devMountsPath = NULL;
> + size_t ndevMountsPath = 0;
> int ret = -1;
>
> if (mem->model != VIR_DOMAIN_MEMORY_MODEL_NVDIMM)
> @@ -8513,10 +8562,19 @@ qemuDomainNamespaceSetupMemory(virQEMUDriverPtr driver,
> if (!qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT))
> return 0;
>
> - if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath) < 0)
> + cfg = virQEMUDriverGetConfig(driver);
> + if (qemuDomainGetPreservedMounts(cfg, vm,
> + &devMountsPath, NULL,
> + &ndevMountsPath) < 0)
> + goto cleanup;
> +
> + if (qemuDomainAttachDeviceMknod(driver, vm, mem->nvdimmPath,
> + devMountsPath, ndevMountsPath) < 0)
> goto cleanup;
> ret = 0;
> cleanup:
> + virStringListFreeCount(devMountsPath, ndevMountsPath);
> + virObjectUnref(cfg);
> return ret;
> }
>
> @@ -8547,6 +8605,9 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainChrDefPtr chr)
> {
> + virQEMUDriverConfigPtr cfg = NULL;
> + char **devMountsPath = NULL;
> + size_t ndevMountsPath = 0;
> const char *path;
> int ret = -1;
>
> @@ -8558,12 +8619,21 @@ qemuDomainNamespaceSetupChardev(virQEMUDriverPtr driver,
>
> path = chr->source->data.file.path;
>
> + cfg = virQEMUDriverGetConfig(driver);
> + if (qemuDomainGetPreservedMounts(cfg, vm,
> + &devMountsPath, NULL,
> + &ndevMountsPath) < 0)
> + goto cleanup;
> +
> if (qemuDomainAttachDeviceMknod(driver,
> vm,
> - path) < 0)
> + path,
> + devMountsPath, ndevMountsPath) < 0)
> goto cleanup;
> ret = 0;
> cleanup:
> + virStringListFreeCount(devMountsPath, ndevMountsPath);
> + virObjectUnref(cfg);
> return ret;
> }
>
> @@ -8598,6 +8668,9 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainRNGDefPtr rng)
> {
> + virQEMUDriverConfigPtr cfg = NULL;
> + char **devMountsPath = NULL;
> + size_t ndevMountsPath = 0;
> const char *path = NULL;
> int ret = -1;
>
> @@ -8615,12 +8688,21 @@ qemuDomainNamespaceSetupRNG(virQEMUDriverPtr driver,
> goto cleanup;
> }
>
> + cfg = virQEMUDriverGetConfig(driver);
> + if (qemuDomainGetPreservedMounts(cfg, vm,
> + &devMountsPath, NULL,
> + &ndevMountsPath) < 0)
> + goto cleanup;
> +
> if (qemuDomainAttachDeviceMknod(driver,
> vm,
> - path) < 0)
> + path,
> + devMountsPath, ndevMountsPath) < 0)
> goto cleanup;
> ret = 0;
> cleanup:
> + virStringListFreeCount(devMountsPath, ndevMountsPath);
> + virObjectUnref(cfg);
> return ret;
> }
>
ACK
--
Cedric
More information about the libvir-list
mailing list