[libvirt] [PATCH 1/5] qemuDomainBuildNamespace: Move /dev/* mountpoints later
Cedric Bosdonnat
cbosdonnat at suse.com
Wed May 3 13:18:07 UTC 2017
On Fri, 2017-04-28 at 13:22 +0200, Michal Privoznik wrote:
> 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)
>
> Not the problem with this approach is that if some device in step
You may have wanted to write "Note" rather than "Not".
Otherwise ACK.
--
Cedric
> 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:
>
> <disk type='file' device='disk'>
> <driver name='qemu' type='raw'/>
> <source file='/dev/shm/vhostmd0'/>
> <target dev='vdb' bus='virtio'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
> </disk>
>
> 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 <mprivozn at redhat.com>
> ---
> src/qemu/qemu_domain.c | 54 +++++++++++++++++++++++++-------------------------
> 1 file changed, 27 insertions(+), 27 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 00b0b4a..be02d54 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -7950,33 +7950,6 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
> if (qemuDomainSetupDev(cfg, mgr, 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;
> -
> - if (devMountsSavePath[i] == devPath)
> - continue;
> -
> - if (stat(devMountsPath[i], &sb) < 0) {
> - virReportSystemError(errno,
> - _("Unable to stat: %s"),
> - devMountsPath[i]);
> - goto cleanup;
> - }
> -
> - /* At this point, devMountsPath is either a regular file or a directory. */
> - if ((S_ISDIR(sb.st_mode) && virFileMakePath(devMountsSavePath[i]) < 0) ||
> - (S_ISREG(sb.st_mode) && virFileTouch(devMountsSavePath[i], sb.st_mode) < 0)) {
> - virReportSystemError(errno,
> - _("Failed to create %s"),
> - devMountsSavePath[i]);
> - goto cleanup;
> - }
> -
> - if (virFileMoveMount(devMountsPath[i], devMountsSavePath[i]) < 0)
> - goto cleanup;
> - }
> -
> if (qemuDomainSetupAllDisks(cfg, vm, devPath) < 0)
> goto cleanup;
>
> @@ -8001,6 +7974,33 @@ qemuDomainBuildNamespace(virQEMUDriverConfigPtr cfg,
> 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;
> +
> + if (devMountsSavePath[i] == devPath)
> + continue;
> +
> + if (stat(devMountsPath[i], &sb) < 0) {
> + virReportSystemError(errno,
> + _("Unable to stat: %s"),
> + devMountsPath[i]);
> + goto cleanup;
> + }
> +
> + /* At this point, devMountsPath is either a regular file or a directory. */
> + if ((S_ISDIR(sb.st_mode) && virFileMakePath(devMountsSavePath[i]) < 0) ||
> + (S_ISREG(sb.st_mode) && virFileTouch(devMountsSavePath[i], sb.st_mode) < 0)) {
> + virReportSystemError(errno,
> + _("Failed to create %s"),
> + devMountsSavePath[i]);
> + goto cleanup;
> + }
> +
> + if (virFileMoveMount(devMountsPath[i], devMountsSavePath[i]) < 0)
> + goto cleanup;
> + }
> +
> if (virFileMoveMount(devPath, "/dev") < 0)
> goto cleanup;
>
More information about the libvir-list
mailing list