提交 6451b55e 编写于 作者: M Michal Privoznik

qemuDomainGetPreservedMounts: Fix suffixes for corner cases

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/"
prefix. 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().
The solution is to replace all the slashes in the suffix with say
dots. That way we don't have to care about nested directories.
IOW, the result we want for given example is:

/var/run/libvirt/qemu/fedora.blah.blah2
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
上级 cdd9205d
...@@ -7622,7 +7622,9 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg, ...@@ -7622,7 +7622,9 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
goto error; goto error;
for (i = 0; i < nmounts; i++) { for (i = 0; i < nmounts; i++) {
char *tmp;
const char *suffix = mounts[i] + strlen(DEVPREFIX); const char *suffix = mounts[i] + strlen(DEVPREFIX);
size_t off;
if (STREQ(mounts[i], "/dev")) if (STREQ(mounts[i], "/dev"))
suffix = "dev"; suffix = "dev";
...@@ -7630,6 +7632,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg, ...@@ -7630,6 +7632,20 @@ qemuDomainGetPreservedMounts(virQEMUDriverConfigPtr cfg,
if (virAsprintf(&paths[i], "%s/%s.%s", if (virAsprintf(&paths[i], "%s/%s.%s",
cfg->stateDir, vm->def->name, suffix) < 0) cfg->stateDir, vm->def->name, suffix) < 0)
goto error; 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) if (devPath)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册