[libvirt] [PATCH v1 05/15] conf: Introduce VIR_DOMAIN_LOADER_TYPE_NONE
Laszlo Ersek
lersek at redhat.com
Thu Feb 28 09:27:07 UTC 2019
On 02/27/19 11:04, Michal Privoznik wrote:
> This is going to extend virDomainLoader enum. The reason is that
> once loader path is NULL its type makes no sense. However, since
> value of zero corresponds to VIR_DOMAIN_LOADER_TYPE_ROM the
> following XML would be produced:
>
> <os>
> <loader type='rom'/>
> ...
> </os>
>
> To solve this, introduce VIR_DOMAIN_LOADER_TYPE_NONE which would
> correspond to value of zero and then use post parse callback to
> set the default loader type to 'rom' if needed.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/conf/domain_conf.c | 23 +++++++++++++++++++++--
> src/conf/domain_conf.h | 3 ++-
> src/qemu/qemu_command.c | 1 +
> src/qemu/qemu_domain.c | 1 +
> tests/domaincapsschemadata/full.xml | 1 +
> 5 files changed, 26 insertions(+), 3 deletions(-)
Sounds pretty complex, but I guess it makes sense. If both @type and the
pathname content are missing, then @type will default to NONE. (This
used not to be possible, given that pathname used to be required.) If
@type is absent but the pathname is present, then we flip the type
manually to ROM.
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index f622a4dddf..b436b91c66 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1013,6 +1013,7 @@ VIR_ENUM_IMPL(virDomainMemoryAllocation, VIR_DOMAIN_MEMORY_ALLOCATION_LAST,
>
> VIR_ENUM_IMPL(virDomainLoader,
> VIR_DOMAIN_LOADER_TYPE_LAST,
> + "none",
> "rom",
> "pflash",
> );
> @@ -4286,6 +4287,20 @@ virDomainDefPostParseMemory(virDomainDefPtr def,
> }
>
>
> +static void
> +virDomainDefPostParseOs(virDomainDefPtr def)
> +{
> + if (!def->os.loader)
> + return;
> +
> + if (def->os.loader->path &&
> + def->os.loader->type == VIR_DOMAIN_LOADER_TYPE_NONE) {
> + /* By default, loader is type of 'rom' */
> + def->os.loader->type = VIR_DOMAIN_LOADER_TYPE_ROM;
> + }
> +}
> +
> +
> static void
> virDomainDefPostParseMemtune(virDomainDefPtr def)
> {
> @@ -5465,6 +5480,8 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
> if (virDomainDefPostParseMemory(def, data->parseFlags) < 0)
> return -1;
>
> + virDomainDefPostParseOs(def);
> +
> virDomainDefPostParseMemtune(def);
>
> if (virDomainDefRejectDuplicateControllers(def) < 0)
> @@ -18706,7 +18723,7 @@ virDomainLoaderDefParseXML(xmlNodePtr node,
>
> if (type_str) {
> int type;
> - if ((type = virDomainLoaderTypeFromString(type_str)) < 0) {
> + if ((type = virDomainLoaderTypeFromString(type_str)) <= 0) {
Why is this change necessary? Hm... I assume, due to the enum
auto-generation in libvirt, the introduction of "none" will
automatically cause virDomainLoaderTypeFromString() to recognize "none"
as value 0. But we want to act like "none" isn't a valid value (it's
internal use only). Hence the same error message as before.
I reckon this is OK.
Reviewed-by: Laszlo Ersek <lersek at redhat.com>
Thanks
Laszlo
> virReportError(VIR_ERR_XML_DETAIL,
> _("unknown type value: %s"), type_str);
> goto cleanup;
> @@ -27611,12 +27628,14 @@ virDomainLoaderDefFormat(virBufferPtr buf,
> if (loader->secure)
> virBufferAsprintf(buf, " secure='%s'", secure);
>
> - virBufferAsprintf(buf, " type='%s'", type);
> + if (loader->type != VIR_DOMAIN_LOADER_TYPE_NONE)
> + virBufferAsprintf(buf, " type='%s'", type);
>
> if (loader->path)
> virBufferEscapeString(buf, ">%s</loader>\n", loader->path);
> else
> virBufferAddLit(buf, "/>\n");
> +
> if (loader->nvram || loader->templt) {
> virBufferAddLit(buf, "<nvram");
> virBufferEscapeString(buf, " template='%s'", loader->templt);
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 1f8454b38c..4e8c02b5e3 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1899,7 +1899,8 @@ struct _virDomainBIOSDef {
> };
>
> typedef enum {
> - VIR_DOMAIN_LOADER_TYPE_ROM = 0,
> + VIR_DOMAIN_LOADER_TYPE_NONE = 0,
> + VIR_DOMAIN_LOADER_TYPE_ROM,
> VIR_DOMAIN_LOADER_TYPE_PFLASH,
>
> VIR_DOMAIN_LOADER_TYPE_LAST
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 74f34af292..92729485ff 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -9846,6 +9846,7 @@ qemuBuildDomainLoaderCommandLine(virCommandPtr cmd,
> }
> break;
>
> + case VIR_DOMAIN_LOADER_TYPE_NONE:
> case VIR_DOMAIN_LOADER_TYPE_LAST:
> /* nada */
> break;
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index cf7e650b34..cc3a01397c 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -12201,6 +12201,7 @@ qemuDomainSetupLoader(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED,
> goto cleanup;
> break;
>
> + case VIR_DOMAIN_LOADER_TYPE_NONE:
> case VIR_DOMAIN_LOADER_TYPE_LAST:
> break;
> }
> diff --git a/tests/domaincapsschemadata/full.xml b/tests/domaincapsschemadata/full.xml
> index eafba1ae5b..0a46e6bb78 100644
> --- a/tests/domaincapsschemadata/full.xml
> +++ b/tests/domaincapsschemadata/full.xml
> @@ -10,6 +10,7 @@
> <value>/foo/bar</value>
> <value>/tmp/my_path</value>
> <enum name='type'>
> + <value>none</value>
> <value>rom</value>
> <value>pflash</value>
> </enum>
>
More information about the libvir-list
mailing list