[libvirt] [PATCH 3/3] qemuDomainGetPreservedMounts: Fix suffixes for corner cases
John Ferlan
jferlan at redhat.com
Wed Jun 14 19:58:38 UTC 2017
On 06/12/2017 11:57 AM, Michal Privoznik wrote:
> 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:
s/preffix/prefix
>
> /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().
>
You didn't finish my bedtime story!
Am I to assume that instead of :
/var/run/libvirt/qemu/fedora.blah/blah2
we would get
/var/run/libvirt/qemu/fedora.blah.blah2
taking things one step further...
would /dev/blah/blah2/blah3
be
/var/run/libvirt/qemu/fedora.blah.blah2.blah3
That's what I see coded at least... Or should the path be:
/var/run/libvirt/qemu/fedora.blah/blah2.blah3
It would seem you'd want to get to the end, reverse search on '/' then
if that spot is greater than @off, then convert it to a '.', but what do
I know. I keep to the simple life and don't use namespaces.
John
> 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)
>
More information about the libvir-list
mailing list