]> xenbits.xensource.com Git - libvirt.git/log
libvirt.git
10 years agoutil: Add virProcessSetScheduler() function for scheduler settings
Martin Kletzander [Thu, 8 Jan 2015 14:36:54 +0000 (15:36 +0100)]
util: Add virProcessSetScheduler() function for scheduler settings

This function uses sched_setscheduler() function so it works with
processes and threads as well (even threads not created by us, which is
what we'll need in the future).

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
10 years agodomain: include portgroup in interface status xml
Laine Stump [Tue, 10 Feb 2015 21:17:11 +0000 (16:17 -0500)]
domain: include portgroup in interface status xml

Prior to commit 7d5bf484747 (first appearing in libvirt 1.2.2), the
status XML of a domain's interface was missing a lot of important
information; mainly it just output the config of the interface, plus
the name of the tap device and qemu device alias. Commit 7d5bf484747
changed the status XML to include many important bits of information
that were required to make network "hook" scripts useful - bandwidth
information, vlan tag, the name of the bridge (or physical device in
the case of macvtap) that the tap/macvtap device was attached to - the
commit log for 7d5bf484747 has a very detailed explanation of the
change. For quick reference - in the example given there, prior to the
change, status XML looked like figure [C]:

      <interface type='network'>
        <source network='testnet' portgroup='admin'/>
        <target dev='macvtap0'/>
        <alias name='net0'/>
        <address type='pci' domain='0x0000' bus='0x00'
                 slot='0x03' function='0x0'/>
      </interface>

and after the change, it looked like figure [E]:

      <interface type='direct'>
        <source dev='p4p1_0' mode='bridge'/>
        <bandwidth>
            <inbound average='1000' peak='5000' burst='1024'/>
            <outbound average='128' peak='256' burst='256'/>
        </bandwidth>
        <target dev='macvtap0'/>
        <alias name='net0'/>
        <address type='pci' domain='0x0000' bus='0x00'
                 slot='0x03' function='0x0'/>
      </interface>

You'll notice that bandwidth info, physdev, and macvtap mode have been
added, but the network and portgroup names are now missing - I didn't
think that this information was of any use once the needed
bandwidth/vlan/etc config had been pulled from the network/portgroup.

I was wrong.

A few months after that change a user on IRC asked what happened to
portgroup in the status XML and described how he used it (more or less
as a tag to decide what external information to use in a hook script
that was run at startup/migration time - see
http://wiki.libvirt.org/page/OVS_and_PVLANS ). At that time I planned
to make a patch to re-add portgroup, but life intervened as that was
just prior to a transatlantic move involving several weeks of
"vacation". During this time I somehow forgot to make the patch, and
also mistakenly remembered that I *had* made it.

Subsequent to this, as a part of mprivozn's work to add support for
network-specific hooks, I did re-add the output of the network name in
status XML, but once again completely forgot about portgroup. This was
in commit a3609121 (first appearing in libvirt 1.2.11). This made the
status XML from the above example look like this:

      <interface type='direct'>
        <source network='testnet' dev='p4p1_0' mode='bridge'/>
        <bandwidth>
            <inbound average='1000' peak='5000' burst='1024'/>
            <outbound average='128' peak='256' burst='256'/>
        </bandwidth>
        <target dev='macvtap0'/>
        <alias name='net0'/>
        <address type='pci' domain='0x0000' bus='0x00'
                 slot='0x03' function='0x0'/>
      </interface>

*This* patch just adds the portgroup back to the status XML, so the
 same example interface will look like this:

      <interface type='direct'>
        <source network='testnet' portgroup='admin'
                dev='p4p1_0' mode='bridge'/>
        <bandwidth>
            <inbound average='1000' peak='5000' burst='1024'/>
            <outbound average='128' peak='256' burst='256'/>
        </bandwidth>
        <target dev='macvtap0'/>
        <alias name='net0'/>
        <address type='pci' domain='0x0000' bus='0x00'
                 slot='0x03' function='0x0'/>
      </interface>

The result is that the status XML now contains all information about
how the interface is setup (bandwidth, physical device, tap device,
etc), in addition to pointers to its origin (the network and
portgroup).

10 years agodomain: avoid potential memory leak in virDomainGraphicsListenSet*()
Laine Stump [Tue, 10 Feb 2015 19:04:40 +0000 (14:04 -0500)]
domain: avoid potential memory leak in virDomainGraphicsListenSet*()

virDomainGraphicsListenSetAddress() and
virDomainGraphicsListenSetNetwork() both set their respective char* to
NULL directly when asked to set it to NULL, which is okay as long as
it's already set to NULL. If these functions are ever called to clear
a listen object that has a valid string in address or network, it will
end up leaking the old value. Currently that doesn't happen, so this
is just a preemptive strike.

10 years agodomain: backfill listen address to parent <graphics> listen attribute
Laine Stump [Tue, 10 Feb 2015 18:49:16 +0000 (13:49 -0500)]
domain: backfill listen address to parent <graphics> listen attribute

Prior to 0.9.4, libvirt only supported a single listen, and it had to
be an IP address:

   <graphics listen='1.2.3.4' ..../>

Starting with 0.9.4, a graphics element could have a <listen>
subelement (actually the grammar supports multiples, but all of the
drivers only support a single <listen> per <graphics>), and that
listen element can be of type='address' or type='network'. For
type='address', <listen> also has an attribute called 'address' which
contains the IP address for listening:

    <graphics ....>
      <listen type='address' address='1.2.3.4' .../>
    </graphics>

type can also be "network", and in that case listen will have a
"network" attribute which will contain the name of a libvirt
network:

    <graphics ....>
      <listen type='network' network='testnet' .../>
    </graphics>

At domain start (or migrate) time, libvirt will attempt to
find an IP address associated with that network (e.g. the IP address
of the bridge device used by the network, or the physical device
listed in <forward dev='physdev'/>) and fill in that address in the
status XML:

    <graphics ....>
      <listen type='network' network='testnet' address='1.2.3.4' .../>
    </graphics>

In the case that a <graphics> element has a <listen> subelement of
type='address', that listen subelement's "address" attribute is
backfilled into the parent graphics element's "listen" *attribute* for
backward compatibility (so that a management application unaware of
the separate <listen> element can still learn the listen
address). This backfill should be done with the IP learned from
type='network' as well, and that's what this patch does:

    <graphics listen='1.2.3.4' ....>
      <listen type='network' network='testnet' address='1.2.3.4' .../>
    </graphics>

This is a continuation of the fix for:

   https://bugzilla.redhat.com/show_bug.cgi?id=1191016

10 years agovirsh: fix IP address in domdisplay for listen type='network'
Luyao Huang [Tue, 10 Feb 2015 09:35:56 +0000 (17:35 +0800)]
virsh: fix IP address in domdisplay for listen type='network'

https://bugzilla.redhat.com/show_bug.cgi?id=1191016

virsh's domdisplay command looks in /domain/devices/graphics/@listen
of the domain's XML for the listen address, however for listen
type='network' (added in libvirt 0.9.4), the <graphics> element
doesn't have a listen attribute, but has a <listen> subelement,
*still* with no address (this is the inactive XML):

 <graphics type='spice' autoport='yes' keymap='en-us'>
  <listen type='network' network='default'/>
 </graphics>

However, at domain start time the <listen> subelement gets its address
attribute filled in once libvirt figures out the IP address associated
with the named network (this is the status XML):

 <graphics type='spice' port='5901' autoport='yes' keymap='en-us'>
  <listen type='network' address='192.168.122.1' network='default'/>
 </graphics>

So in these cases, we need to look at
/domain/devices/graphics/listen/@address instead.

Even though another patch is being pushed that will backfill
listen/@address into @listen, this patch is still useful, as it fixes
domdisplay for cases of a new virsh (with this patch) connecting to a
libvirtd that is newer than 0.9.4 but doesn't have the followup patch.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Laine Stump <laine@laine.org>
10 years agobhyvexml2argvmock: change int to size_t for tapfdSize
Pavel Hrdina [Tue, 10 Feb 2015 09:50:38 +0000 (10:50 +0100)]
bhyvexml2argvmock: change int to size_t for tapfdSize

Commit c5b6a4a5 forget to update also this mock function.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
10 years agoqemu: qemuOpenFileAs - set flag VIR_FILE_OPEN_FORCE_MODE
John Ferlan [Mon, 26 Jan 2015 19:28:25 +0000 (14:28 -0500)]
qemu: qemuOpenFileAs - set flag VIR_FILE_OPEN_FORCE_MODE

In the event we're falling into the code that tries to create the file
in a forked environment (VIR_FILE_OPEN_FORK) we pass different mode bits,
but those are never set because the virFileOpenForceOwnerMode has a check
if the OPEN_FORCE_MODE bit is set before attempting to change the mode.

Since this is a special case it seems reasonable to set u+rw,g+rw,o

10 years agovirfile: Adjust error path for virFileOpenForked
John Ferlan [Wed, 28 Jan 2015 17:34:54 +0000 (12:34 -0500)]
virfile: Adjust error path for virFileOpenForked

Rather than have a dummy waitpid loop and return of the failure status
from recvfd, adjust the logic to save the recvfd error & fd and then
in priority order:

- if waitpid failed, use that errno value
- waitpid succeeded, but if the child exited abnormally, report failure
(use EACCES to report as return failure, since either EACCES or EPERM is
what caused us to fall into the fork+setuid path)
- waitpid succeeded, but if the child reported non-zero status, report
failure (use the errno value that the child encoded into exit status)
- waitpid succeeded, but if recvfd failed, report recvfd_errno
- waitpid and recvfd succeeded, use the fd

NOTE: Original logic to retry the open and force owner mode was
"documented" as only being attempted if we had already tried opening
with the fork+setuid, but checked flags vs. VIR_FILE_OPEN_NOFORK which
is counter to how we would get to that point. So that code was removed.

10 years agoqemu: fix crash when migrateuri has no scheme
Luyao Huang [Wed, 11 Feb 2015 08:30:32 +0000 (16:30 +0800)]
qemu: fix crash when migrateuri has no scheme

https://bugzilla.redhat.com/show_bug.cgi?id=1191355

When we attempt to migrate a vm with a migrateuri that has no scheme:

 # virsh migrate test4 --live qemu+ssh://lhuang/system --migrateuri 127.0.0.1

target libvirtd will crash because uri->scheme is NULL in
qemuMigrationPrepareDirect on this line:

     if (STRNEQ(uri->scheme, "tcp") &&

Add a value check before this line. Also fix a bug like this in
doNativeMigrate, that could only happen when destination libvirtd
returned an incorrect URI.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
10 years agoconf: Fix libvirtd crash and memory leak caused by virDomainVcpuPinDel()
Zhang Bo [Wed, 11 Feb 2015 08:48:24 +0000 (16:48 +0800)]
conf: Fix libvirtd crash and memory leak caused by virDomainVcpuPinDel()

The function virDomainVcpuPinDel() used vcpupin_list to stand for
def->cputune.vcpupin, which made the codes more readable.
However, in this function, it will realloc vcpupin_list later.
As the definition of realloc(), it may free vcpupin_list and then
points it to a new-realloced address, but def->cputune.vcpupin doesn't
point to the new address(it's freed however).
Thus,
1) When we refer to the def->cputune.vcpupin afterwards, which was freed
by realloc(), an INVALID READ occurs, and libvirtd may crash.
2) As no one will use vcpupin_list any more, and no one frees it(it's just
alloced by realloc()), memory leak occurs.

Part of the valgrind logs are shown as below:
==1837== Thread 15:
==1837== Invalid read of size 8
==1837==    at 0x5367337: virDomainDefFormatInternal (domain_conf.c:18392)
        which is : virBufferAsprintf(buf, "<vcpupin vcpu='%u' ",
                          def->cputune.vcpupin[i]->vcpuid);
==1837==    by 0x536966C: virDomainObjFormat (domain_conf.c:18970)
==1837==    by 0x5369743: virDomainSaveStatus (domain_conf.c:19166)
==1837==    by 0x117B26DC: qemuDomainPinVcpuFlags (qemu_driver.c:4586)
==1837==    by 0x53EA313: virDomainPinVcpuFlags (libvirt.c:9803)
==1837==    by 0x14CB7D: remoteDispatchDomainPinVcpuFlags (remote_dispatch.h:6762)
==1837==    by 0x14CC81: remoteDispatchDomainPinVcpuFlagsHelper (remote_dispatch.h:6740)
==1837==    by 0x5464C30: virNetServerProgramDispatchCall (virnetserverprogram.c:437)
==1837==    by 0x546507A: virNetServerProgramDispatch (virnetserverprogram.c:307)
==1837==    by 0x171B83: virNetServerProcessMsg (virnetserver.c:172)
==1837==    by 0x171E6E: virNetServerHandleJob (virnetserver.c:193)
==1837==    by 0x5318E78: virThreadPoolWorker (virthreadpool.c:145)
==1837==  Address 0x12ea2870 is 0 bytes inside a block of size 16 free'd
==1837==    at 0x4C291AC: realloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==1837==    by 0x52A3D14: virReallocN (viralloc.c:245)
==1837==    by 0x52A3DFB: virShrinkN (viralloc.c:372)
==1837==    by 0x52A3F57: virDeleteElementsN (viralloc.c:503)
==1837==    by 0x533939E: virDomainVcpuPinDel (domain_conf.c:15405)  //doReset为true时才会进到。
==1837==    by 0x117B2642: qemuDomainPinVcpuFlags (qemu_driver.c:4573)
==1837==    by 0x53EA313: virDomainPinVcpuFlags (libvirt.c:9803)
==1837==    by 0x14CB7D: remoteDispatchDomainPinVcpuFlags (remote_dispatch.h:6762)
==1837==    by 0x14CC81: remoteDispatchDomainPinVcpuFlagsHelper (remote_dispatch.h:6740)
==1837==    by 0x5464C30: virNetServerProgramDispatchCall (virnetserverprogram.c:437)
==1837==    by 0x546507A: virNetServerProgramDispatch (virnetserverprogram.c:307)
==1837==    by 0x171B83: virNetServerProcessMsg (virnetserver.c:172)

Steps to reproduce the problem:
1) use virDomainPinVcpuFlags() to pin a guest's vcpu to all the pcpus
of the host.

This patch uses def->cputune.vcpupin instead of vcpupin_list to do the
realloc() job, to avoid invalid read or memory leaking.

Signed-off-by: Zhang Bo <oscar.zhangbo@huawei.com>
Signed-off-by: Yue Wenyuan <yuewenyuan@huawei.com@huawei.com>
10 years agoconf: forbid seclabel duplicates for domain devices
Erik Skultety [Tue, 10 Feb 2015 16:17:35 +0000 (17:17 +0100)]
conf: forbid seclabel duplicates for domain devices

Parser checks for per-domain seclabel duplicates, so it would be nice if
it checked for per-device seclabel duplicates the same way

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1165485

10 years agoschema: allow multiple seclabel for devices in domaincommon.rng
Erik Skultety [Tue, 10 Feb 2015 16:17:36 +0000 (17:17 +0100)]
schema: allow multiple seclabel for devices in domaincommon.rng

In our RNG schema we do allow multiple (different) seclabels per-domain,
but don't allow this for devices, yet we neither have a check in our XML parser,
nor in a post-parse callback. In that case we should allow multiple
(different) seclabels for devices as well.

10 years agoFix qemu job handling in SetSchedulerParameters
Ján Tomko [Tue, 10 Feb 2015 13:36:03 +0000 (14:36 +0100)]
Fix qemu job handling in SetSchedulerParameters

Commit c5ee5cf added a job to SetSchedulerParameters, but
forgot to change one label in the SCHED_RANGE_CHECK macro.

10 years agoqemu: Implement random number generator hotunplug
Luyao Huang [Sat, 17 Jan 2015 05:09:38 +0000 (13:09 +0800)]
qemu: Implement random number generator hotunplug

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoqemu: Implement random number generator hotplug
Luyao Huang [Sat, 17 Jan 2015 05:09:37 +0000 (13:09 +0800)]
qemu: Implement random number generator hotplug

Export the required helpers and add backend code to hotplug RNG devices.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoqemu: Implement random number generator cold (un)plug
Peter Krempa [Thu, 5 Feb 2015 12:46:06 +0000 (13:46 +0100)]
qemu: Implement random number generator cold (un)plug

Add support for using the attach/detach device APIs on the inactive
configuration to add RNG devices.

10 years agoconf: Add helpers to insert/remove/find RNG devices in domain def
Luyao Huang [Sat, 17 Jan 2015 05:09:32 +0000 (13:09 +0800)]
conf: Add helpers to insert/remove/find RNG devices in domain def

The helpers will be useful when implementing hotplug and coldplug of
random number generator devices.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoaudit: export virDomainAuditRNG
Luyao Huang [Sat, 17 Jan 2015 05:09:36 +0000 (13:09 +0800)]
audit: export virDomainAuditRNG

Signed-off-by: Luyao Huang <lhuang@redhat.com>
10 years agoqemu: command: Refactor creation of RNG device commandline
Peter Krempa [Tue, 3 Feb 2015 09:31:33 +0000 (10:31 +0100)]
qemu: command: Refactor creation of RNG device commandline

As the RNG device is using an -object as backend refactor the code to
use the JSON to commandline generator so that we can reuse the code
later in hotplug.

10 years agoqemu: command: Break some very long lines in qemuBuildRNGDevStr()
Peter Krempa [Tue, 3 Feb 2015 09:26:40 +0000 (10:26 +0100)]
qemu: command: Break some very long lines in qemuBuildRNGDevStr()

10 years agoqemu: command: Shuffle around formatting of alias for RNG device backend
Peter Krempa [Tue, 3 Feb 2015 09:14:42 +0000 (10:14 +0100)]
qemu: command: Shuffle around formatting of alias for RNG device backend

Move the alias name right after the object type for rng-egd backend so
that we can later use the JSON to commandline generator to create the
command line.

10 years agoqemu: command: Make RNG backend device IDs unique
Luyao Huang [Sat, 17 Jan 2015 05:09:34 +0000 (13:09 +0800)]
qemu: command: Make RNG backend device IDs unique

Libvirt didn't prefix the random number generator backend object alias
with any string thus the device alias and object alias were identical.

To avoid possible problems, rename the alias for the backend object and
tweak tests to comply with the change.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoqemu: refactor qemuBuildRNGDeviceArgs to allow reuse in RNG hotplug
Luyao Huang [Sat, 17 Jan 2015 05:09:31 +0000 (13:09 +0800)]
qemu: refactor qemuBuildRNGDeviceArgs to allow reuse in RNG hotplug

Rename qemuBuildRNGDeviceArgs to qemuBuildRNGDevStr and change the
return type so that it can be reused in the device hotplug code later.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoqemu: Add helper to assign RNG device aliases
Luyao Huang [Sat, 17 Jan 2015 05:09:30 +0000 (13:09 +0800)]
qemu: Add helper to assign RNG device aliases

This function is used to assign an alias for a RNG device. It will be
later reused when hotplugging RNGs.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
10 years agoconf: Introduce helper to find duplicate device address
Peter Krempa [Wed, 21 Jan 2015 14:41:44 +0000 (15:41 +0100)]
conf: Introduce helper to find duplicate device address

When adding devices to the definition it's useful to check whether the
devices don't reside on a conflicting address. This patch adds a helper
that iterates all device info and compares the addresses with the given
info.

10 years agoconf: disallow invalid values for video attributes
Martin Kletzander [Tue, 10 Feb 2015 07:55:06 +0000 (08:55 +0100)]
conf: disallow invalid values for video attributes

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1190956

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
10 years agoS390: Documentation for ccw address type
Stefan Zimmermann [Wed, 4 Feb 2015 14:00:09 +0000 (15:00 +0100)]
S390: Documentation for ccw address type

Change the wording in the device-address-part of the docmunentation since
the ccw bus address support added to the optional address parameter of
virsh attach-disk for S390.

Signed-off-by: Stefan Zimmermann <stzi@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
10 years agoS390: ccw support for virsh attach-disk address parameter
Stefan Zimmermann [Wed, 4 Feb 2015 14:00:08 +0000 (15:00 +0100)]
S390: ccw support for virsh attach-disk address parameter

Adding ccw bus address support to the optional address parameter of virsh
attach-disk. The format used is ccw:cssid. ssid.devno, e.g.
ccw:0xfe.0x0.0x0201

Virtio-ccw devices must have their cssid set to 0xfe.

Signed-off-by: Stefan Zimmermann <stzi@linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
10 years agoconf: fix a minor typo
Erik Skultety [Fri, 6 Feb 2015 18:13:24 +0000 (19:13 +0100)]
conf: fix a minor typo

10 years agoClear dynamic seclabels on LXCProcessStart failure
Cédric Bosdonnat [Fri, 6 Feb 2015 13:13:43 +0000 (14:13 +0100)]
Clear dynamic seclabels on LXCProcessStart failure

commit a58e1cb4 didn't fix the bug if the security_default_confined is
not set to 1. We now clean up even if there is no seclabel defined or
the default one.

10 years agomaint: improve usage of autogen's --no-git
Stefan Zimmermann [Fri, 6 Feb 2015 16:19:03 +0000 (17:19 +0100)]
maint: improve usage of autogen's --no-git

If you build libvirt with the --no-git option, then gnulib requires
either $GNULIB_SRCDIR in the environment or --gnulib-srcdir on the
command line.  But we had not been supporting its use from the
command line.  This patch is a bit picky: --gnulib-srcdir must be
passed immediately after --no-git; but since we don't reorder
arguments, and since we already required --no-git to be first to
have any effect, it's not too horrible.  It also does the wrong
thing if you include spaces in your arguments, but developers
doing that deserve what they get, right?

Signed-off-by: Stefan Zimmermann <stzi@linux.vnet.ibm.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
10 years agonetwork: don't allow multiple portgroups with the same name in a network
Laine Stump [Thu, 5 Feb 2015 19:20:54 +0000 (14:20 -0500)]
network: don't allow multiple portgroups with the same name in a network

When defining and creating networks, we have been checking to make
sure there is only a single "default" portgroup, but haven't verified
that no two portgroups have the same name. We *do* check for multiple
definitions when updating the portgroups in an existing network
though.

This patch adds a check to networkValidate(), which is called when a
network is defined or created, to disallow duplicate names. It would
actually make sense to do this in the network XML parser (since it's
not really "something that might make sense but isn't supported by
this driver", but is instead "something that should never be
allowed"), but doing that carries the danger of causing errors when
rereading the config of existing networks when libvirtd is restarted
after an upgrade, and that would result in networks disappearing from
libvirt's list. (I'm thinking I should change the error to "XML_ERROR"
instead of "UNSUPPORTED", even though that's not the type of error
that networkValidate is intended for)

This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1115858

10 years agoError out when custom tap device path makes no sense
Ján Tomko [Thu, 5 Feb 2015 12:40:11 +0000 (13:40 +0100)]
Error out when custom tap device path makes no sense

It is only usable for NETWORK and BRIDGE type interfaces.
Error out when trying to start a domain where the custom
tap device path is specified for interfaces of other types,
or when the daemon is not privileged.

Note that this cannot be checked at definition time, because
the comparison is against actual type.

https://bugzilla.redhat.com/show_bug.cgi?id=1147195

10 years agoOnly parse custom vhost path for virtio interfaces
Ján Tomko [Thu, 5 Feb 2015 12:38:40 +0000 (13:38 +0100)]
Only parse custom vhost path for virtio interfaces

It is only supported for virtio adapters.
Silently drop it if it was specified for other models,
as is done for other virtio attributes.

Also mention this in the documentation.

https://bugzilla.redhat.com/show_bug.cgi?id=1147195

10 years agoTrivially support DomainHasManagedSaveImage
Ján Tomko [Thu, 15 Jan 2015 14:02:44 +0000 (15:02 +0100)]
Trivially support DomainHasManagedSaveImage

Return 0 instead of ERR_NO_SUPPORT in each driver
where we don't support managed save or -1 if
the domain does not exist.

This avoids spamming daemon logs when 'virsh dominfo' is run.

https://bugzilla.redhat.com/show_bug.cgi?id=1095637

10 years agoqemu: include libvirt & QEMU versions in QEMU log files
Daniel P. Berrange [Mon, 2 Feb 2015 10:28:30 +0000 (10:28 +0000)]
qemu: include libvirt & QEMU versions in QEMU log files

It is often helpful to know which version of libvirt and QEMU
was present when a guest was first launched. Ensure this info
is written into the QEMU log file for each guest.

10 years agolibxl: update dom->id in libxlDomainCreateWithFlags
Marek Marczykowski-Górecki [Thu, 5 Feb 2015 05:17:07 +0000 (06:17 +0100)]
libxl: update dom->id in libxlDomainCreateWithFlags

Otherwise domainCreateWithFlags via remote returns -1 as domid.

Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
10 years agonodedev: check/add for scsi_host caps for NumOfCaps and ListCaps
John Ferlan [Wed, 4 Feb 2015 13:10:52 +0000 (08:10 -0500)]
nodedev: check/add for scsi_host caps for NumOfCaps and ListCaps

Commit id '652a2ec6' introduced two new node device capability flags
and the ability to use those flags as a way to search for a specific
subset of a 'scsi_host' device - namely a 'fc_host' and/or 'vports'.
The code modified the virNodeDeviceCapMatch whichs allows for searching
using the 'virsh nodedev-list [cap]' via virConnectListAllNodeDevices.

However, the original patches did not account for other searches for
the same capability key from virNodeDeviceNumOfCaps and virNodeDeviceListCaps
using nodeDeviceNumOfCaps and nodeDeviceListCaps. Since 'fc_host' and
'vports' are self defined bits of a 'scsi_host' device mere string
comparison against the basic/root type is not sufficient.

This patch adds the check for the 'fc_host' and 'vports' bits within
a 'scsi_host' device and allows the following python code to find the
capabilities for the device:

import libvirt
conn = libvirt.openReadOnly('qemu:///system')
devs = conn.listAllDevices()
for dev in devs:
    if 'fc_host' in dev.listCaps() or 'vports' in dev.listCaps():
        print dev.name(),dev.numOfCaps(),dev.listCaps()

10 years agonodedev: check/add for scsi_host caps for ListDevices
Shivaprasad G Bhat [Tue, 3 Feb 2015 11:55:16 +0000 (06:55 -0500)]
nodedev: check/add for scsi_host caps for ListDevices

Commit id '652a2ec6' introduced two new node device capability flags
and the ability to use those flags as a way to search for a specific
subset of a 'scsi_host' device - namely a 'fc_host' and/or 'vports'.
The code modified the virNodeDeviceCapMatch whichs allows for searching
using the 'virsh nodedev-list [cap]' via virConnectListAllNodeDevices.

However, the original patches did not account for other searches for
the same capability key from virNodeListDevices using virNodeDeviceHasCap.
Since 'fc_host' and 'vports' are self defined bits of a 'scsi_host'
device mere string comparison against the basic/root type is not
sufficient.

This patch adds the check for the 'fc_host' and 'vports' bits within
a 'scsi_host' device and allows the following python code to find the
capabilities for the device:

import libvirt
conn = libvirt.openReadOnly('qemu:///system')
fc = conn.listDevices('fc_host', 0)
print(fc)
fc = conn.listDevices('vports', 0)
print(fc)

Signed-off-by: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
10 years agoqemu: Properly report error on uuid mismatch in the migration cookie
Luyao Huang [Thu, 5 Feb 2015 03:42:26 +0000 (11:42 +0800)]
qemu: Properly report error on uuid mismatch in the migration cookie

Add the missing jump to the error label when the uuid in the
migration cookie XML does not match the uuid of the migrated
domain.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
10 years agolxc: fix double close handshakefds[1]
Luyao Huang [Wed, 4 Feb 2015 13:32:52 +0000 (21:32 +0800)]
lxc: fix double close handshakefds[1]

Signed-off-by: Luyao Huang <lhuang@redhat.com>
10 years agocpu: add Freescale ppc64 CPU models
Olivia Yin [Fri, 30 Jan 2015 06:50:03 +0000 (14:50 +0800)]
cpu: add Freescale ppc64 CPU models

With this patch, Freescale ppc64 CPU modesl could be recognized.

virsh # cpu-models ppc64
POWERPC_e6500
POWERPC_e5500
power8
power8e
power7+
power7
power6
POWER8_v1.0
POWER7+_v2.1
POWER7_v2.3
POWER7_v2.1
POWER7

virsh # capabilities
<capabilities>
  <host>
    <uuid>5a54efa6-20dc-4da7-b271-0b7fb7062cb8</uuid>
    <cpu>
      <arch>ppc64</arch>
      <model>POWERPC_e6500</model>
      <vendor>Freescale</vendor>

10 years agoutil: storage: Fix parsing of nbd:// URI without path
Peter Krempa [Tue, 3 Feb 2015 17:03:41 +0000 (18:03 +0100)]
util: storage: Fix parsing of nbd:// URI without path

If a storage file would be backed with a NBD device without path
(nbd://localhost) libvirt would crash when parsing the backing path for
the disk as the URI structure's path element is NULL in such case but
the NBD parser would access it shamelessly.

10 years agotests: virstoragetest: Switch backing chain test to use automatic numbering
Peter Krempa [Tue, 3 Feb 2015 16:54:04 +0000 (17:54 +0100)]
tests: virstoragetest: Switch backing chain test to use automatic numbering

I'm going to add a few test cases so it's the best time to convert the
test to automatic numbering.

10 years agoconf: Properly report error of unsupported input bus type
Luyao Huang [Wed, 4 Feb 2015 02:33:29 +0000 (10:33 +0800)]
conf: Properly report error of unsupported input bus type

https://bugzilla.redhat.com/show_bug.cgi?id=1188914

Add a missing jump to the error label in case the input device bus is
invalid.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
10 years agoconf: Properly report error when an unsupported chr device name is passed
Luyao Huang [Wed, 4 Feb 2015 01:53:24 +0000 (09:53 +0800)]
conf: Properly report error when an unsupported chr device name is passed

Add the missing jump to thje error label. The error message shouldn't
ever be triggered though as it's called only on pre-selected nodes.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
10 years agovirsh-volume: add support for --reflink
Chen Hanxiao [Tue, 3 Feb 2015 03:05:27 +0000 (11:05 +0800)]
virsh-volume: add support for --reflink

Add support for --reflink to the virsh 'vol-create-from' and 'vol-clone'
commands to signify usage of the VIR_STORAGE_VOL_CREATE_REFLINK flag in the
ensuing virStorageVolCreateXMLFrom API call.

Updated the man page to describe the new flag.

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
10 years agovirutil: fix MinGW build
Pavel Hrdina [Tue, 3 Feb 2015 13:20:25 +0000 (14:20 +0100)]
virutil: fix MinGW build

Commit b38da584 introduced two new functions to get a page size but it
won't work on Windows. We should take care of this.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
10 years agovirnetdev: fix some issues found by coverity and mingw builds
Pavel Hrdina [Tue, 3 Feb 2015 10:20:40 +0000 (11:20 +0100)]
virnetdev: fix some issues found by coverity and mingw builds

Commit e562a61a introduced new function to get/set interface state but
there was misuse of ATTRIBUTE_NONNULL on non-pointer attributes and also
we need to wrap that functions by #ifdef to not break mingw build.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
10 years agoMake tests independant of system page size
Daniel P. Berrange [Mon, 2 Feb 2015 10:26:49 +0000 (05:26 -0500)]
Make tests independant of system page size

Some code paths have special logic depending on the page size
reported by sysconf, which in turn affects the test results.
We must mock this so tests always have a consistent page size.

10 years agoutil: make virNetDev(Get|Set)IFFlags() static
Laine Stump [Fri, 30 Jan 2015 16:56:15 +0000 (11:56 -0500)]
util: make virNetDev(Get|Set)IFFlags() static

e562a61a0739 added these two new helper functions and only used them
within virnetdev.c, but declared them in the .h file. If some
currently unsupported interface flags need to be accessed in the
future, it will make more sense to write the appropriate higher level
function rather than require us to artificially define IFF_* on some
mythical platform that doesn't have SIOC[SG]IFFLAGS (and therefore
doesn't have IFF_*) just so we can call virNetDevSetIFFFlags() to
return an error.

To help someone in not going down the wrong road, this patch makes the
two helper functions static, hopefully making it less likely that
someone will want to use them outside of virnetdev.c.

10 years agostorage: Need to clear pool prior to refreshPool during Autostart
John Ferlan [Fri, 30 Jan 2015 18:21:49 +0000 (13:21 -0500)]
storage: Need to clear pool prior to refreshPool during Autostart

https://bugzilla.redhat.com/show_bug.cgi?id=1176510

When storageDriverAutostart is called path virStateReload via a 'service
libvirtd reload', then because the volume list in the pool wasn't cleared
prior to the call, each volume would be listed multiple times (as many
times as we reload). I believe the issue would be introduced by commit
id '9e093f0b' at least for the libvirtd reload path, although I suppose
the introduction of virStateReload (commit id '70da0494') could be a
different cause.

Thus like other places prior to calling refreshPool, we need to call
virStoragePoolObjClearVols

10 years agoqemu: command: Don't combine old and modern NUMA node creation
Peter Krempa [Mon, 26 Jan 2015 12:48:02 +0000 (13:48 +0100)]
qemu: command: Don't combine old and modern NUMA node creation

Change done by commit f309db1f4d51009bad0d32e12efc75530b66836b wrongly
assumes that qemu can start with a combination of NUMA nodes specified
with the "memdev" option and the appropriate backends, and the legacy
way by specifying only "mem" as a size argument. QEMU rejects such
commandline though:

$ /usr/bin/qemu-system-x86_64 -S -M pc -m 1024 -smp 2 \
-numa node,nodeid=0,cpus=0,mem=256 \
-object memory-backend-ram,id=ram-node1,size=12345 \
-numa node,nodeid=1,cpus=1,memdev=ram-node1
qemu-system-x86_64: -numa node,nodeid=1,cpus=1,memdev=ram-node1: qemu: memdev option must be specified for either all or no nodes

To fix this issue we need to check if any of the nodes requires the new
definition with the backend and if so, then all other nodes have to use
it too.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1182467

10 years agoqemu: command: Refactor NUMA backend object formatting to use JSON objs
Peter Krempa [Thu, 15 Jan 2015 21:42:51 +0000 (22:42 +0100)]
qemu: command: Refactor NUMA backend object formatting to use JSON objs

With the new JSON to argv formatter we are now able to represent the
memory backend definitions in the JSON object format that is reusable
for monitor use (hotplug) and then convert it into the shell string.
This will avoid having two separate instances of the same code that
would create the different formats.

Previous refactors now allow to make this step without changes to the
test suite.

10 years agoqemu: command: Switch to bytes when formatting size for memory backends
Peter Krempa [Thu, 15 Jan 2015 16:31:31 +0000 (17:31 +0100)]
qemu: command: Switch to bytes when formatting size for memory backends

QEMU's command line visitor as well as the JSON interface take bytes by
default for memory object sizes. Convert mebibytes to bytes so that we
can later refactor the existing code for hotplug purposes.

10 years agoqemu: command: Unify values for boolean values when formating memory backends
Peter Krempa [Thu, 15 Jan 2015 15:59:50 +0000 (16:59 +0100)]
qemu: command: Unify values for boolean values when formating memory backends

QEMU's qapi visitor code allows yes/on/y for true and no/off/n for false
value of boolean properities. Unify the used style so that we can
generate it later and fix test cases.

10 years agoqemu: command: Shuffle around formating of alias for memory backend objs
Peter Krempa [Thu, 15 Jan 2015 14:55:48 +0000 (15:55 +0100)]
qemu: command: Shuffle around formating of alias for memory backend objs

Move the alias as the second formated argument and tweak the tests so
that a future refactor that will change the order doesn't break tests.

10 years agoqemu: Extract code to setup memory backing objects
Peter Krempa [Fri, 9 Jan 2015 09:34:12 +0000 (10:34 +0100)]
qemu: Extract code to setup memory backing objects

Extract the memory backend device code into a separate function so that
it can be later easily refactored and reused.

Few small changes for future reusability, namely:
- new (currently unused) parameter for user specified page size
- size of the memory is specified in kibibytes, divided up in the
function
- new (currently unused) parameter for user specifed source nodeset
- option to enforce capability check

10 years agoqemu: command: Add helper to format -object strings from JSON representation
Peter Krempa [Tue, 13 Jan 2015 17:19:34 +0000 (18:19 +0100)]
qemu: command: Add helper to format -object strings from JSON representation

Unlike -device, qemu uses a JSON object to add backend "objects" via the
monitor rather than the string that would be passed on the commandline.

To be able to reuse code parts that configure backends for various
devices, this patch adds a helper that will allow generating the command
line representations from the JSON property object.

10 years agoutil: json: add helper to iterate JSON object key=value pairs
Peter Krempa [Tue, 13 Jan 2015 15:43:30 +0000 (16:43 +0100)]
util: json: add helper to iterate JSON object key=value pairs

This helper eases iterating all key=value pairs stored in a JSON
object. Usually we pick only certain known keys from a JSON object, but
this will allow to walk complete objects and have the callback act on
those.

10 years agoutil: json: Add functions to convert JSON arrays from/to virBitmaps
Peter Krempa [Tue, 13 Jan 2015 14:06:16 +0000 (15:06 +0100)]
util: json: Add functions to convert JSON arrays from/to virBitmaps

To be able to easily represent nodesets and other data stored in
virBitmaps in libvirt, this patch introduces a set of helpers that allow
to convert the bitmap to and from JSON value objects.

10 years agoutil: bitmap: Add option to allocate bitmap without reporting error
Peter Krempa [Fri, 30 Jan 2015 10:19:59 +0000 (11:19 +0100)]
util: bitmap: Add option to allocate bitmap without reporting error

The virBitmapNew() function reports only OOM errors. Split out the
internals into a "quiet" function and add a wrapper that reports the
error.

10 years agoutil: json: make value object creator universal by supporting adding
Peter Krempa [Mon, 12 Jan 2015 15:35:17 +0000 (16:35 +0100)]
util: json: make value object creator universal by supporting adding

To allow constructing of value objects stepwise explode the helper into
separate steps and allow appending into existing value objects.

10 years agotest: utils: Add helpers for automatic numbering of test cases
Peter Krempa [Thu, 15 Jan 2015 10:44:58 +0000 (11:44 +0100)]
test: utils: Add helpers for automatic numbering of test cases

Adding or reordering test cases is usually a pain due to static test
case names that are then passed to virtTestRun(). To ease the numbering
of test cases, this patch adds two simple helpers that generate the test
names according to the order they are run. The test name can be
configured via the reset function.

This will allow us to freely add test cases in middle of test groups
without the need to re-number the rest of test cases.

10 years agoconf: numatune: Extract code for requesting memory nodeset from formatting
Peter Krempa [Thu, 15 Jan 2015 21:40:15 +0000 (22:40 +0100)]
conf: numatune: Extract code for requesting memory nodeset from formatting

Extract the logic to determine which nodeset has to be used for a domain
from the formatting step so that it can be reused separately when the
nodeset is used in a different way.

10 years agoxend: Don't crash in virDomainXMLDevID
Michal Privoznik [Fri, 30 Jan 2015 09:37:10 +0000 (10:37 +0100)]
xend: Don't crash in virDomainXMLDevID

The function is called from all {Attach,Update,Detach}Device APIs to
create config strings that are later passed to the xend to perform the
desired action. The function is intended to handle all supported
devices. However, as of 5b05358abacb1029fa0d61f72decacf0d4fd8ffb we
are trying to get disk driver of the device without checking if the
device really is a disk. This leads to an segmentation fault:

  #0 0x00007ffff7571815 in virDomainDiskGetDriver () from /usr/lib/libvirt.so.0
  #1 0x00007fffeb9ad471 in ?? () from /usr/lib/libvirt/connection-driver/libvirt_driver_xen.so
  #2 0x00007fffeb9b1062 in xenDaemonAttachDeviceFlags () from /usr/lib/libvirt/connection-driver/libvirt_driver_xen.so
  #3 0x00007fffeb9a8a86 in ?? () from /usr/lib/libvirt/connection-driver/libvirt_driver_xen.so
  #4 0x00007ffff7609266 in virDomainAttachDevice () from /usr/lib/libvirt.so.0
  #5 0x0000555555593c9d in ?? ()
  #6 0x00007ffff76743c9 in virNetServerProgramDispatch () from /usr/lib/libvirt.so.0
  #7 0x00005555555a678d in ?? ()
  #8 0x00007ffff755460e in ?? () from /usr/lib/libvirt.so.0
  #9 0x00007ffff7553b06 in ?? () from /usr/lib/libvirt.so.0
  #10 0x00007ffff4998b50 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
  #11 0x00007ffff46e30ed in clone () from /lib/x86_64-linux-gnu/libc.so.6
  #12 0x0000000000000000 in ?? ()

Reported-by: Xiaolin Su <linxxnil@126.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoconf: Don't mangle vcpu placement randomly
Michal Privoznik [Thu, 22 Jan 2015 12:57:22 +0000 (13:57 +0100)]
conf: Don't mangle vcpu placement randomly

https://bugzilla.redhat.com/show_bug.cgi?id=1170492

In one of our previous commits (dc8b7ce7) we've done a functional
change even though it was intended as pure refactor. The problem is,
that the following XML:

 <vcpu placement='static' current='2'>6</vcpu>
 <cputune>
   <emulatorpin cpuset='1-3'/>
 </cputune>
 <numatune>
   <memory mode='strict' placement='auto'/>
 </numatune>

gets translated into this one:

 <vcpu placement='auto' current='2'>6</vcpu>
 <cputune>
   <emulatorpin cpuset='1-3'/>
 </cputune>
 <numatune>
   <memory mode='strict' placement='auto'/>
 </numatune>

We should not change the vcpu placement mode. Moreover, we're doing
something similar in case of emulatorpin and iothreadpin. If they were
set, but vcpu placement was auto, we've mistakenly removed them from
the domain XML even though we are able to set them independently on
vcpus.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoqemu: change macvtap device options in response to NIC_RX_FILTER_CHANGED
Tony Krowiak [Thu, 22 Jan 2015 19:47:03 +0000 (14:47 -0500)]
qemu: change macvtap device options in response to NIC_RX_FILTER_CHANGED

This patch enables synchronization of the host macvtap
device options with the guest device's in response to the
NIC_RX_FILTER_CHANGED event.

The following device options will be synchronized:
* PROMISC
* MULTICAST
* ALLMULTI

Signed-off-by: Tony Krowiak <akrowiak@linux.vnet.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoutil: Functions for getting/setting device options
Tony Krowiak [Thu, 22 Jan 2015 19:47:02 +0000 (14:47 -0500)]
util: Functions for getting/setting device options

This patch provides the utility functions needed to synchronize
the rxfilter changes made to a guest domain with the corresponding
macvtap devices on the host:

* Get/set PROMISC flag
* Get/set ALLMULTI, MULTICAST

Signed-off-by: Tony Krowiak <akrowiak@linux.vnet.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoqemu: Don't unconditionally delete file in qemuOpenFileAs
John Ferlan [Wed, 28 Jan 2015 18:14:38 +0000 (13:14 -0500)]
qemu: Don't unconditionally delete file in qemuOpenFileAs

https://bugzilla.redhat.com/show_bug.cgi?id=1158034

If we're expecting to create a file somewhere and that fails for some
reason during qemuOpenFileAs, then we unlink the path we're attempting
to create leaving no way to determine what the "existing" privileges,
protections, or labels are that caused the failure (open, change owner
and group, change mode, etc.).

Furthermore, if we fall into the path where we'll be opening / creating
the file using VIR_FILE_OPEN_FORK, we need to first unlink/delete the file
we created in the first path; otherwise, the attempt by the child process
to open as some specific user:group may fail because the file was already
created using nfsnobody:nfsnobody. Again, if we didn't create the file we
don't want to blindly delete what already exists. Thus, a second reason for
the original check to set need_unlink to false when we find the file with
CREAT set, but already existing.

Signed-off-by: John Ferlan <jferlan@redhat.com>
10 years agovirfile: Need to check for ENOTCONN from recvfd failure
John Ferlan [Wed, 28 Jan 2015 00:03:12 +0000 (19:03 -0500)]
virfile: Need to check for ENOTCONN from recvfd failure

A gnulib change (commit id 'beae0bdc') causes ENOTCONN to be returned
from recvfd which causes us to fall into the throwaway waitpid() call
and return ENOTCONN to the caller, this then gets displayed during
a 'virsh save' when using a root squashed NFS environment that's trying
to save the file as something other than root:root.

This patch will add the additional check for ENOTCONN to force the code
into the waitpid loop looking for the actual status from the _exit()'d
child fork.

Signed-off-by: John Ferlan <jferlan@redhat.com>
10 years agoqemu: Adjust EndAsyncJob for qemuDomainSaveInternal error path
John Ferlan [Mon, 26 Jan 2015 19:13:22 +0000 (14:13 -0500)]
qemu: Adjust EndAsyncJob for qemuDomainSaveInternal error path

Commit id '540c339a' to fix issues with reference counting and transient
domains moved the qemuDomainObjEndAsyncJob call prior to the attempt to
restart the guest CPU's resulting in an error:

    error: Failed to save domain rhel70 to /tmp/pl/rhel70.save
    error: internal error: unexpected async job 3

when (ret != 0) - eg, the error path from qemuDomainSaveMemory.

This patch will adjust the logic to call the EndAsyncJob only after
we've tried to restart the guest CPUs. It also needs to adjust the
test for qemuDomainRemoveInactive to add the ret == 0 condition.

Additionally, if we get to endjob: because of some error earlier, then
we need to save that error in the event the CPU restart logic fails.
We don't want to return the error from CPU restart failure, rather we
want to return the error from the failed save that caused us to fall
into the retry to start the CPU logic.

Signed-off-by: John Ferlan <jferlan@redhat.com>
10 years agoschemas: Allow all generic elements and attributes for all interfaces
Michal Privoznik [Wed, 28 Jan 2015 17:14:22 +0000 (18:14 +0100)]
schemas: Allow all generic elements and attributes for all interfaces

There are some interface types (notably 'server' and 'client')
which instead of allowing the default set of elements and
attributes (like the rest do), try to enumerate only the elements
they know of. This way it's, however, easy to miss something. For
instance, the <address/> element was not mentioned at all. This
resulted in a strange behavior: when such interface was added
into XML, the address was automatically generated by parsing
code. Later, the formatted XML hasn't passed the RNG schema. This
became more visible once we've turned on the XML validation on
domain XML changes: appending an empty line at the end of
formatted XML (to trick virsh think the XML had changed) made
libvirt to refuse the very same XML it formatted.

Instead of trying to find each element and attribute we are
missing in the schema, lets just allow all the elements and
attributes like we're doing that for the rest of types. It's no
harm if the schema is wider than our parser allows.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoqemu: Add AAVMF to the list of known UEFIs
Michal Privoznik [Wed, 21 Jan 2015 18:44:43 +0000 (19:44 +0100)]
qemu: Add AAVMF to the list of known UEFIs

Well, even though users can pass the list of UEFI:NVRAM pairs at the
configure time, we may maintain the list of widely available UEFI
ourselves too. And as arm64 begin to rises, OVMF was ported there too.
With a slight name change - it's called AAVMF, with AAVMF_CODE.fd
being the UEFI firmware and AAVMF_VARS.fd being the NVRAM store file.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoqemu: Allow UEFI paths to be specified at compile time
Michal Privoznik [Wed, 21 Jan 2015 18:38:57 +0000 (19:38 +0100)]
qemu: Allow UEFI paths to be specified at compile time

Up until now there are just two ways how to specify UEFI paths to
libvirt. The first one is editing qemu.conf, the other is editing
qemu_conf.c and recompile which is not that fancy. So, new
configure option is introduced: --with-loader-nvram which takes a
list of pairs of UEFI firmware and NVRAM store. This way, the
compiled in defaults can be passed during compile time without
need to change the code itself.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
10 years agoFix syntax-check
Ján Tomko [Thu, 29 Jan 2015 13:39:12 +0000 (14:39 +0100)]
Fix syntax-check

My commit 08d1ae1 broke syntax-check by adding ATTRIBUTE_UNUSED
to the flags parameter.

Rename the parameter to unused_flags to bypass the check.

10 years agoRemove flag checking in MacVLanCreate helper stub
Ján Tomko [Thu, 29 Jan 2015 09:03:29 +0000 (10:03 +0100)]
Remove flag checking in MacVLanCreate helper stub

When compiling without WITH_MACVTAP, we can get:
'unsupported flags (0x1) in function
virNetDevMacVLanCreateWithVPortProfile'
on an attempt to start a domain.

Remove the flag check to reach the more helpful error:
Cannot create macvlan devices on this platform

https://bugzilla.redhat.com/show_bug.cgi?id=1186928

10 years agovirsh: man: Document behavior of some blkdeviotune's flags when querying
Peter Krempa [Thu, 29 Jan 2015 07:33:51 +0000 (08:33 +0100)]
virsh: man: Document behavior of some blkdeviotune's flags when querying

--live and --config can't be specified together when querying the
configuration, but are valid when setting. The man page was hinting that
they are valid always.

10 years agoutil: bitmap: Tolerate NULL bitmaps in virBitmapEqual
Peter Krempa [Tue, 20 Jan 2015 18:41:08 +0000 (19:41 +0100)]
util: bitmap: Tolerate NULL bitmaps in virBitmapEqual

After virBitmapEqual is able to compare NULL bitmaps few bits of code
can be cleaned up.

10 years agostorage: Check the partition name against provided name
John Ferlan [Fri, 16 Jan 2015 00:12:42 +0000 (19:12 -0500)]
storage: Check the partition name against provided name

https://bugzilla.redhat.com/show_bug.cgi?id=1138516

If the provided volume name doesn't match what parted generated as the
partition name, then return a failure.

Update virsh.pod and formatstorage.html.in to describe the 'name' restriction
for disk pools as well as the usage of the <target>'s <format type='value'>.

10 years agostorage: When delete extended partition, need to refresh pool
John Ferlan [Thu, 22 Jan 2015 16:23:10 +0000 (11:23 -0500)]
storage: When delete extended partition, need to refresh pool

When removing a volume that is the extended partition, all the logical
volume partitions that exist within the extended partition will also be
removed, so we need to refresh the pool to have the updated list

10 years agostorage: Adjust how to refresh extended partition disk data
John Ferlan [Thu, 22 Jan 2015 14:12:04 +0000 (09:12 -0500)]
storage: Adjust how to refresh extended partition disk data

During virStorageBackendDiskMakeDataVol processing, if we find an extended
partition, then handle it specially when updating the capacity/allocation
rather than calling virStorageBackendUpdateVolInfo.

As it turns out, once a logical partition exists, any attempt to refresh
the pool or after libvirtd restart/reload will result in a failure to open
the extended partition device resulting in the inability to start the pool.
The downside to this is we will lose the <permissions> and <timestamps> for
the extended partition upon subsequent restart, refresh, reload since the
stat() in virStorageBackendUpdateVolTargetInfoFD will not be called. However,
since it's really only a container and shouldn't directly be used for
storage that seems reasonable.

Therefore, only use the existing code that already had a comment about
getting the allocation wrong for extended partitions for just the setting
of the extended partition data.

10 years agostorage: Fix check for partition type for disk backing volumes
John Ferlan [Thu, 22 Jan 2015 13:30:36 +0000 (08:30 -0500)]
storage: Fix check for partition type for disk backing volumes

While checking the existing partitions in virStorageBackendDiskPartFormat,
the code would erroneously compare the volume target format type (eg, the
virStoragePartedFsType) rather than the source partition type (eg, the
virStorageVolTypeDisk) which is set during virStorageBackendDiskReadPartitions.

10 years agostorage: Attempt error recovery in virStorageBackendDiskCreateVol
John Ferlan [Wed, 21 Jan 2015 20:38:05 +0000 (15:38 -0500)]
storage: Attempt error recovery in virStorageBackendDiskCreateVol

During virStorageBackendDiskCreateVol if virStorageBackendDiskReadPartitions
fails, then we were leaving with an error and a partition on the disk for
which there was no corresponding volume and used space on the disk which
could be reclaimable through direct parted activity. On a subsequent restart,
reload, or refresh the volume may magically appear too.

10 years agostorage: Move virStorageBackendDiskDeleteVol
John Ferlan [Wed, 21 Jan 2015 19:41:02 +0000 (14:41 -0500)]
storage: Move virStorageBackendDiskDeleteVol

Move the API to before virStorageBackendDiskCreateVol in order to be
able to call the DeleteVol API when virStorageBackendDiskReadPartitions
fails so that we don't by chance leave a partition on the disk.

10 years agolibvirt.spec: remove vbox storage and network .so files
Pavel Hrdina [Wed, 28 Jan 2015 17:40:14 +0000 (18:40 +0100)]
libvirt.spec: remove vbox storage and network .so files

Commit 55ea7be7 removed separated modules for vbox_network and
vbox_storage drivers but forget to update libvirt.spec.in file. This
patch will fix rpm build.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
10 years agoqemu: fix cannot set graphic passwd via qemuDomainSaveImageDefineXML
Luyao Huang [Tue, 20 Jan 2015 09:04:41 +0000 (17:04 +0800)]
qemu: fix cannot set graphic passwd via qemuDomainSaveImageDefineXML

https://bugzilla.redhat.com/show_bug.cgi?id=1183890

When we try to update a xml to a image file, we will clear the
graphics passwd settings, because we do not pass VIR_DOMAIN_XML_SECURE
to qemuDomainDefCopy, qemuDomainDefFormatBuf won't format the passwd.

Add VIR_DOMAIN_XML_SECURE flag when we call qemuDomainDefCopy
in qemuDomainSaveImageUpdateDef.

Signed-off-by: Luyao Huang <lhuang@redhat.com>
10 years agohotplug: only add a chardev to vmdef after monitor call
Ján Tomko [Tue, 27 Jan 2015 17:44:30 +0000 (18:44 +0100)]
hotplug: only add a chardev to vmdef after monitor call

https://bugzilla.redhat.com/show_bug.cgi?id=1161024

This way the device is in vmdef only if ret = 0 and the caller
(qemuDomainAttachDeviceFlags) does not free it.

Otherwise it might get double freed by qemuProcessStop
and qemuDomainAttachDeviceFlags if the domain crashed
in monitor after we've added it to vm->def.

10 years agoSplit qemuDomainChrInsert into two parts
Ján Tomko [Tue, 27 Jan 2015 17:30:15 +0000 (18:30 +0100)]
Split qemuDomainChrInsert into two parts

Do the allocation first, then add the actual device.
The second part should never fail. This is good
for live hotplug where we don't want to remove the device
on OOM after the monitor command succeeded.

The only change in behavior is that on failure, the
vmdef->consoles array is freed, not just the first console.

10 years agolxc: report veth device indexes to systemd
Daniel P. Berrange [Fri, 16 Jan 2015 16:58:39 +0000 (16:58 +0000)]
lxc: report veth device indexes to systemd

Record the index of each host-side veth device created and report
them to systemd, so they show up in machinectl status for the VM.

lxc-shell(95449419f969d649d9962566ec42af7d)
     Since: Fri 2015-01-16 16:53:37 GMT; 3s ago
    Leader: 28085 (sh)
   Service: libvirt-lxc; class container
     Iface: vnet0
   Address: fe80::216:3eff:fe00:c317%124
        OS: Fedora 21 (Twenty One)
      Unit: machine-lxc\x2dshell.scope
            └─28085 /bin/sh

10 years agolxc: more logging during startup paths
Daniel P. Berrange [Fri, 16 Jan 2015 17:20:48 +0000 (17:20 +0000)]
lxc: more logging during startup paths

Add more logging to the lxc controller and container files to
facilitate debugging startup problems. Also make it clear when
the container is going to close stdout and thus no longer do
any logging.

10 years agolxc: delay setup of cgroup until we have the init pid
Daniel P. Berrange [Fri, 16 Jan 2015 16:23:45 +0000 (16:23 +0000)]
lxc: delay setup of cgroup until we have the init pid

Don't create the cgroups ahead of launching the container since
there is no need for the limits to apply during initial bootstrap.
Create the cgroup after the container PID is known and tell
systemd the initpid is the leader, instead of the controller
pid.

10 years agolxc: only write XML once for lxc controller
Daniel P. Berrange [Fri, 16 Jan 2015 16:39:57 +0000 (16:39 +0000)]
lxc: only write XML once for lxc controller

Currently when launching the LXC controller we first write out
the plain, inactive XML configuration, then launch the controller,
then replace the file with the live status XML configuration.
By good fortune this hasn't caused any problems other than some
misleading error messages during failure scenarios.

This simplifies the code so it only writes out the XML once and
always writes the live status XML. To do this we need to handshake
with the child process, to make execution pause just before exec()
so we can write the XML status with the child PID present.

10 years agolxc: re-arrange startup synchronization sequence with controller
Daniel P. Berrange [Fri, 16 Jan 2015 15:03:16 +0000 (15:03 +0000)]
lxc: re-arrange startup synchronization sequence with controller

Currently the lxc controller process itself is responsible for
daemonizing itself into the background and writing out its pid
file. The lxc driver would fork the controller and then attempt
to connect to the lxc monitor. This connection would only
succeed after the controller has backgrounded itself, setup
cgroups and written its pid file, so startup was race free.

The problem is that we need to delay create of the cgroups to
much later, such that we can tell systemd the container init
pid when we create the cgroups. If we delay cgroup creation
though the current synchronization won't work.

A second problem is that the controller needs the XML config
of the guest. Currently we write out the plain virDomainDefPtr
XML before starting the controller, and then later replace it
with the full virDomainObjPtr status XML. This is kind of gross
and also means that the controller doesn't get a record of the
live XML config right away. This means it doesn't have a record
of the veth device names either and so can't give that info
to systemd when creating the cgroups.

To address this we change the startup sequencing. The goal
is that we want to get the PID as soon as possible, before
the LXC controller even starts. So we stop letting the LXC
controller daemonize itself, and instead use virCommand's
built-in capabilities. This daemonizes and writes the PID
before LXC controller is exec'd. So the driver can read
the PID as soon as virCommandRun returns. It is no longer
safe to connect to the monitor or detect the cgroups though.

Fortunately the LXC controller already has a second point
of synchronization. Immediately before its  event loop
starts running, it performs a handshake with the driver.
So we move the opening of the monitor connection and cgroup
detection after this synchronization point.

10 years agolxc: don't build pidfile string multiple times
Daniel P. Berrange [Fri, 16 Jan 2015 11:54:30 +0000 (11:54 +0000)]
lxc: don't build pidfile string multiple times

Build the pidfile string once when starting a guest and then
use the same string thereafter. This will benefit following
patches which need the pidfile string in more situations.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
10 years agosystemd: don't report an error if the guest is already terminated
Daniel P. Berrange [Fri, 16 Jan 2015 11:26:39 +0000 (11:26 +0000)]
systemd: don't report an error if the guest is already terminated

In many cases where we invoke virSystemdTerminateMachine the
process(es) will have already gone away on their own accord.
In these cases we log an error message that the machine does
not exist. We should catch this particular error and simply
ignore it, so we don't pollute the logs.

10 years agoqemu: report TAP device indexes to systemd
Daniel P. Berrange [Fri, 16 Jan 2015 11:25:50 +0000 (11:25 +0000)]
qemu: report TAP device indexes to systemd

Record the index of each TAP device created and report them to
systemd, so they show up in machinectl status for the VM.

10 years agoFix shadowed variable warning
Ján Tomko [Tue, 27 Jan 2015 12:36:10 +0000 (13:36 +0100)]
Fix shadowed variable warning

libvirtd.c: In function 'daemonSetupAccessManager':
libvirtd.c:730:18: error: declaration of 'driver' shadows
  a global declaration [-Werror=shadow]
     const char **driver = (const char **)config->access_drivers;
                  ^
In file included from libvirtd.c:95:0:
../src/node_device/node_device_driver.h:43:36: error: shadowed
  declaration is here [-Werror=shadow]
 extern virNodeDeviceDriverStatePtr driver;
                                    ^

10 years agostorage: add a flag to clone files on btrfs
Chen Hanxiao [Fri, 23 Jan 2015 10:22:35 +0000 (18:22 +0800)]
storage: add a flag to clone files on btrfs

When creating a RAW file, we don't take advantage
of clone of btrfs.

Add a VIR_STORAGE_VOL_CREATE_REFLINK flag to request
a reflink copy.

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>
10 years agostorage: introduce btrfsCloneFile() for COW copy
Chen Hanxiao [Fri, 23 Jan 2015 10:22:34 +0000 (18:22 +0800)]
storage: introduce btrfsCloneFile() for COW copy

Add a wrapper for BTRFS_IOC_CLONE ioctl.

Signed-off-by: Chen Hanxiao <chenhanxiao@cn.fujitsu.com>
Signed-off-by: Ján Tomko <jtomko@redhat.com>