From 2cc49072ced64daa446a90b802191496b4d28e69 Mon Sep 17 00:00:00 2001 Message-Id: <2cc49072ced64daa446a90b802191496b4d28e69@dist-git> From: Michal Privoznik Date: Thu, 11 May 2017 15:38:37 +0200 Subject: [PATCH] qemuDomainBuildNamespace: Move /dev/* mountpoints later https://bugzilla.redhat.com/show_bug.cgi?id=1449510 When setting up mount namespace for a qemu domain the following steps are executed: 1) get list of mountpoints under /dev/ 2) move them to /var/run/libvirt/qemu/$domName.ext 3) start constructing new device tree under /var/run/libvirt/qemu/$domName.dev 4) move the mountpoint of the new device tree to /dev 5) restore original mountpoints from step 2) Note the problem with this approach is that if some device in step 3) requires access to a mountpoint from step 2) it will fail as the mountpoint is not there anymore. For instance consider the following domain disk configuration:
In this case operation fails as we are unable to create vhostmd0 in the new device tree because after step 2) there is no /dev/shm anymore. Leave aside fact that we shouldn't try to create devices living in other mountpoints. That's a separate bug that will be addressed later. Currently, the order described above is rearranged to: 1) get list of mountpoints under /dev/ 2) start constructing new device tree under /var/run/libvirt/qemu/$domName.dev 3) move them to /var/run/libvirt/qemu/$domName.ext 4) move the mountpoint of the new device tree to /dev 5) restore original mountpoints from step 3) Signed-off-by: Michal Privoznik Reviewed-by: Cedric Bosdonnat (cherry picked from commit a7cc039dc796f541793955598377807af48341fb) Signed-off-by: Michal Privoznik Signed-off-by: Jiri Denemark --- src/qemu/qemu_domain.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2790d7e74..fbb65fab4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8026,6 +8026,30 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg, if (qemuDomainSetupDev(cfg, mgr, vm, devPath) < 0) goto cleanup; + if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllHostdevs(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllMemories(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllChardevs(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupTPM(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllGraphics(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllInputs(cfg, vm, devPath) < 0) + goto cleanup; + + if (qemuDomainSetupAllRNGs(cfg, vm, devPath) < 0) + goto cleanup; + /* Save some mount points because we want to share them with the host */ for (i = 0; i < ndevMountsPath; i++) { struct stat sb; @@ -8053,30 +8077,6 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg, goto cleanup; } - if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllHostdevs(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllMemories(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllChardevs(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupTPM(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllGraphics(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllInputs(cfg, vm, devPath) < 0) - goto cleanup; - - if (qemuDomainSetupAllRNGs(cfg, vm, devPath) < 0) - goto cleanup; - if (virFileMoveMount(devPath, "/dev") < 0) goto cleanup; -- 2.13.0