[libvirt] [PATCH 02/12] nvram: generate it's path in qemuDomainDefPostParse
Pavel Hrdina
phrdina at redhat.com
Tue Mar 22 12:03:54 UTC 2016
On Tue, Mar 22, 2016 at 10:06:19AM +0100, Jiri Denemark wrote:
> On Tue, Mar 15, 2016 at 14:15:58 +0100, Pavel Hrdina wrote:
> > The postParse callback is the correct place to generate default values
> > that should be present in offline XML.
> >
> > Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> > ---
> > src/qemu/qemu_domain.c | 10 ++++
> > src/qemu/qemu_process.c | 153 ++++++++++++++++++------------------------------
> > 2 files changed, 68 insertions(+), 95 deletions(-)
> >
> > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> > index 594063e..632cf47 100644
> > --- a/src/qemu/qemu_domain.c
> > +++ b/src/qemu/qemu_domain.c
> > @@ -1397,6 +1397,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
> > void *opaque)
> > {
> > virQEMUDriverPtr driver = opaque;
> > + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> > virQEMUCapsPtr qemuCaps = NULL;
> > int ret = -1;
> >
> > @@ -1412,6 +1413,15 @@ qemuDomainDefPostParse(virDomainDefPtr def,
> > return ret;
> > }
> >
> > + if (def->os.loader &&
> > + def->os.loader->type == VIR_DOMAIN_LOADER_TYPE_PFLASH &&
> > + def->os.loader->readonly == VIR_TRISTATE_SWITCH_ON &&
> > + !def->os.loader->nvram) {
> > + if (virAsprintf(&def->os.loader->nvram, "%s/%s_VARS.fd",
> > + cfg->nvramDir, def->name) < 0)
> > + goto cleanup;
> > + }
> > +
> > /* check for emulator and create a default one if needed */
> > if (!def->emulator &&
> > !(def->emulator = virDomainDefGetDefaultEmulator(def, caps)))
> > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> > index 3c496cb..958fae3 100644
> > --- a/src/qemu/qemu_process.c
> > +++ b/src/qemu/qemu_process.c
> > @@ -3878,7 +3878,6 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver,
> >
> > static int
> > qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
> > - virCapsPtr caps,
> > virDomainObjPtr vm,
> > bool migrated)
> > {
> > @@ -3886,111 +3885,81 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
> > int srcFD = -1;
> > int dstFD = -1;
> > virDomainLoaderDefPtr loader = vm->def->os.loader;
> > - bool generated = false;
> > bool created = false;
> > + const char *master_nvram_path;
> > + ssize_t r;
> >
> > - /* Unless domain has RO loader of pflash type, we have
> > - * nothing to do here. If the loader is RW then it's not
> > - * using split code and vars feature, so no nvram file needs
> > - * to be created. */
> > - if (!loader || loader->type != VIR_DOMAIN_LOADER_TYPE_PFLASH ||
> > - loader->readonly != VIR_TRISTATE_SWITCH_ON)
> > + if (!loader->nvram || !migrated)
> > return 0;
> >
> > - /* If the nvram path is configured already, there's nothing
> > - * we need to do. Unless we are starting the destination side
> > - * of migration in which case nvram is configured in the
> > - * domain XML but the file doesn't exist yet. Moreover, after
> > - * the migration is completed, qemu will invoke a
> > - * synchronization write into the nvram file so we don't have
> > - * to take care about transmitting the real data on the other
> > - * side. */
> > - if (loader->nvram && !migrated)
> > + if (virFileExists(loader->nvram))
> > return 0;
>
> So previously if loader->nvram != NULL, the file was already created
> (except for migration). Now you fixed it and generated nvram path has no
> relation to the existence of the file. It doesn't make any sense to
> check whether we are migrating or not anymore. I think the check should
> be
>
> if (!loader->nvram || virFileExists(loader->nvram))
> return 0;
>
> The check you have would only create the nvram file if loader->nvram !=
> NULL and migrated = true, i.e., it won't be created if you start a new
> domain without migrating it.
>
> ACK to the patch if you agree with ^, otherwise an explanation of why
> your current code is correct will be needed :-)
>
> Jirka
Nice catch, you're right and this modification fixes the startup of new machine.
Thanks,
Pavel
More information about the libvir-list
mailing list