[libvirt] [PATCH] qemu: don't refuse to undefine a guest with NVRAM file

Kashyap Chamarthy kchamart at redhat.com
Tue Feb 24 16:46:12 UTC 2015


On Tue, Feb 24, 2015 at 10:12:20AM +0000, Daniel P. Berrange wrote:
> The undefine operation should always be allowed to succeed
> regardless of whether any NVRAM file exists. ie we should
> not force the application to use the VIR_DOMAIN_UNDEFINE_NVRAM
> flag. It is valid for the app to decide it wants the NVRAM
> file left on disk, in the same way that disk images are left
> on disk at undefine.
> ---
>  src/qemu/qemu_driver.c | 20 +++++++-------------
>  1 file changed, 7 insertions(+), 13 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index bec05d4..302bf48 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6985,19 +6985,13 @@ qemuDomainUndefineFlags(virDomainPtr dom,
>  
>      if (!virDomainObjIsActive(vm) &&
>          vm->def->os.loader && vm->def->os.loader->nvram &&
> -        virFileExists(vm->def->os.loader->nvram)) {
> -        if (!(flags & VIR_DOMAIN_UNDEFINE_NVRAM)) {
> -            virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> -                           _("cannot delete inactive domain with nvram"));
> -            goto cleanup;
> -        }
> -
> -        if (unlink(vm->def->os.loader->nvram) < 0) {
> -            virReportSystemError(errno,
> -                                 _("failed to remove nvram: %s"),
> -                                 vm->def->os.loader->nvram);
> -            goto cleanup;
> -        }
> +        virFileExists(vm->def->os.loader->nvram) &&
> +        (flags & VIR_DOMAIN_UNDEFINE_NVRAM) &&
> +        (unlink(vm->def->os.loader->nvram) < 0)) {
> +        virReportSystemError(errno,
> +                             _("failed to remove nvram: %s"),
> +                             vm->def->os.loader->nvram);
> +        goto cleanup;
>      }
>  
>      if (virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm) < 0)

With the above patch applied, I built libvirt RPMs, installed and
restarted libvirtd then I tried the below test (which failed) an AArch64
Fedora21 guest.

Edit the Fedora 21 libvirt guest. Guest XML here[*]:

    $ virsh edit devstack
    [. . .]

Try to add the below fragment under 'os' element:

    <loader readonly='yes' type='pflash'>/usr/share/AAVMF/AAVMF_CODE.fd</loader>
    <nvram>/var/lib/libvirt/nvram/fedora-21-aarch64-nvram</nvram>

It fails to validate the XML:

    error: XML document failed to validate against schema: Unable to validate doc against /usr/share/libvirt/schemas/domain.rng
    Extra element devices in interleave
    Element domain failed to validate content
    
    Failed. Try again? [y,n,i,f,?]: 

However, when I downgrade the libvirt RPMs to version
1.2.11-1.fc22.aarch64 and attempted to add the same XML fragment as
above, it works just fine.


Tested with:

    $ uname -r; rpm -q libvirt-daemon-kvm qemu-system-aarch64
    3.18.6-200.fc21.aarch64
    libvirt-daemon-kvm-1.2.13-1.fc21.aarch64
    qemu-system-aarch64-2.2.0-5.fc22.aarch64

libvirt git after I applied your patch: 

    $ git describe
    v1.2.13-rc1-1-gb63296f


[*] The XML I'm tring to edit:
-----------------------------------------------------------
<domain type='kvm'>
  <name>devstack</name>
  <uuid>d02624c5-460e-436b-baaa-973cfee554c8</uuid>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='aarch64' machine='virt'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>host</model>
  </cpu>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-aarch64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='writeback'/>
      <source file='/home/kashyapc/devstack'/>
      <target dev='vda' bus='virtio'/>
      <address type='virtio-mmio'/>
    </disk>
    <interface type='network'>
      <mac address='52:54:00:f5:6f:23'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='virtio-mmio'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
  </devices>
</domain>
-----------------------------------------------------------

-- 
/kashyap




More information about the libvir-list mailing list