[libvirt] [PATCH 3/3] qemuDomainGetPreservedMounts: Fix suffixes for corner cases

Michal Privoznik mprivozn at redhat.com
Mon Jun 12 15:57:17 UTC 2017


https://bugzilla.redhat.com/show_bug.cgi?id=1431112

Imagine a FS mounted on /dev/blah/blah2. Our process of creating
suffix for temporary location where all the mounted filesystems
are moved is very simplistic. We want:

/var/run/libvirt/qemu/$domName.$suffix\

were $suffix is just the mount point path stripped of the "/dev/"
preffix. For instance:

/var/run/libvirt/qemu/fedora.mqueue  for /dev/mqueue
/var/run/libvirt/qemu/fedora.pts     for /dev/pts

and so on. Now if we plug /dev/blah/blah2 into the example we see
some misbehaviour:

/var/run/libvirt/qemu/fedora.blah/blah2

Well, misbehaviour if /dev/blah/blah2 is a file, because in that
case we call virFileTouch() instead of virFileMakePath().

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/qemu/qemu_domain.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index accf05a6f..547c9fbfb 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7570,7 +7570,9 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
         goto error;
 
     for (i = 0; i < nmounts; i++) {
+        char *tmp;
         const char *suffix = mounts[i] + strlen(DEVPREFIX);
+        size_t off;
 
         if (STREQ(mounts[i], "/dev"))
             suffix = "dev";
@@ -7578,6 +7580,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
         if (virAsprintf(&paths[i], "%s/%s.%s",
                         cfg->stateDir, vm->def->name, suffix) < 0)
             goto error;
+
+        /* Now consider that mounts[i] is "/dev/blah/blah2".
+         * @suffix then points to "blah/blah2". However, caller
+         * expects all the @paths to be the same depth. The
+         * caller doesn't always do `mkdir -p` but sometimes bare
+         * `touch`. Therefore fix all the suffixes. */
+        off = strlen(paths[i]) - strlen(suffix);
+
+        tmp = paths[i] + off;
+        while (*tmp) {
+            if (*tmp == '/')
+                *tmp = '.';
+            tmp++;
+        }
     }
 
     if (devPath)
-- 
2.13.0




More information about the libvir-list mailing list