Yuanzhen Gu | 30 Jul 16:55 2014
Picon

[libvirt] missing libvirt-sock after compile and install libvirt 1.2.6

Hi folks,

I compiled and installed libvirt latest version 1.2.6, based on this tutorial,

http://blog.scottlowe.org/2012/11/05/compiling-libvirt-1-0-0-on-ubuntu-12-04-and-12-10/

I have compiled qemu and installed too, and make a symbolic link to /usr/bin/qemu-system-x86_64

but my question is even I launch a vm in qemu, $virsh list showed nothing, further more,

1) if I use virtual machine manager, it get connection failiure, due to socket to '/var/run/libvirt/libvirt-sock'; No such file of dirctory.

2). there is missing libvirt-bin under /etc/init.d/,  after compile and installed libvirt 1.2.6

3). I tried to start libvirtd daemon, sudo  /usr/sbin/libvirtd/start shows    "/usr/sbin/libvirtd: unexpected, non-option, command line arguments"

4). I've checked /var/log/libvirt/libvirtd.log
      which shows cannot find suitable emulator for x86_64

I've stuck here for whole afternoon yesterday, any help or suggestion is highly appreciated, thanks a lot in advance !



Best,
Yuanzhen
<div><div dir="ltr">
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>Hi folks,<br><br>
</div>I compiled and installed libvirt latest version 1.2.6, based on this tutorial, <br><br><a href="http://blog.scottlowe.org/2012/11/05/compiling-libvirt-1-0-0-on-ubuntu-12-04-and-12-10/">http://blog.scottlowe.org/2012/11/05/compiling-libvirt-1-0-0-on-ubuntu-12-04-and-12-10/</a><br><br>
</div>I have compiled qemu and installed too, and make a symbolic link to /usr/bin/qemu-system-x86_64<br><br>
</div>but my question is even I launch a vm in qemu, $virsh list showed nothing, further more, <br><br>1) if I use virtual machine manager, it get connection failiure, due to socket to '/var/run/libvirt/libvirt-sock'; No such file of dirctory.<br><br>
</div>2). there is missing libvirt-bin under /etc/init.d/,&nbsp; after compile and installed libvirt 1.2.6<br><br>
</div>3). I tried to start libvirtd daemon, sudo&nbsp; /usr/sbin/libvirtd/start shows&nbsp;&nbsp;&nbsp; "/usr/sbin/libvirtd: unexpected, non-option, command line arguments"<br><br>
</div>4). I've checked /var/log/libvirt/libvirtd.log<br>
</div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which shows cannot find suitable emulator for x86_64<br><br>
</div>I've stuck here for whole afternoon yesterday, any help or suggestion is highly appreciated, thanks a lot in advance !<br><br><br><div><div><div><div>
<br clear="all"><div><div><div><div><div><div><div><div><div><div>
<div><div dir="ltr">Best,<div>Yuanzhen</div>
</div></div>
</div></div></div></div></div></div></div></div></div></div>
</div></div></div></div>
</div></div>
Jean-Baptiste Rouault | 30 Jul 11:51 2014
Picon

[libvirt] [RFC] Adding a "none" model for video cards

Hi,

I'm trying to run vexpress-a9 virtual machines (armv7l architecture) using 
libvirt.

The vexpress-a9 doesn't support vga cards, but libvirt adds a video "cirrus" 
video card when there is a "graphics" element in the domain xml. This prevents 
the domain from booting.

At the moment, the only workaround I found is to add the following to my xml 
file :
<qemu:commandline>
  <qemu:arg value='-vga'/>
  <qemu:arg value='none'/>
</qemu:commandline>

What do you think about adding a "none" model type for video cards ? I know it 
is a bit strange to declare a video card in order to have none...
I don't know the QEMU driver well, but maybe this could be handled by the 
driver ? i.e. "no VGA card when the machine is vexpress-a9".

Regards,

Jean-Baptiste

--

-- 
Jean-Baptiste ROUAULT
R&D Engineer - diateam : Architectes de l'information
Phone : +33 (0)2 98 050 050 Fax : +33 (0)2 98 050 051

Cédric Bosdonnat | 30 Jul 11:25 2014

[libvirt] [PATCH] Domain config: write <features/> if some capabilities are set.

If all features are set to default (including the capabilities policy),
but some capabilities are toggled, we need to output the <features>
element when formatting the config.
---
 src/conf/domain_conf.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2a8cdeb..421a44a 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
 <at>  <at>  -17860,7 +17860,8  <at>  <at>  virDomainDefFormatInternal(virDomainDefPtr def,
             break;
     }

-    if (i != VIR_DOMAIN_FEATURE_LAST) {
+    if (i != VIR_DOMAIN_FEATURE_LAST ||
+        virDomainDefHasCapabilitiesFeatures(def)) {
         virBufferAddLit(buf, "<features>\n");
         virBufferAdjustIndent(buf, 2);

--

-- 
1.8.4.5

Eric Blake | 30 Jul 06:05 2014
Picon

[libvirt] [PATCH v6 0/2] turn on active commit

v5 was here, and got tentative ACKs:
https://www.redhat.com/archives/libvir-list/2014-July/msg01414.html

the only change is some reordering of logic in patch 2/2 (the former
4/4) to make sure that even for a super-fast commit where the event
d occurs before the API call regains the lock that the event is correct.

I'm still unsure whether to count this as a bug fix to a partial
new feature and include it in 1.2.7, or defer it to 1.2.8. If we
want it in this release, then getting it in before rc2 would be
the nicest.

Also at:
http://repo.or.cz/w/libvirt/ericb.git/shortlog/refs/heads/gluster
or git checkout git://repo.or.cz/libvirt/ericb.git gluster

Eric Blake (2):
  blockcommit: track job type in xml
  blockcommit: turn on active commit

 docs/formatdomain.html.in                          | 15 ++++---
 docs/schemas/domaincommon.rng                      | 13 ++++++
 src/conf/domain_conf.c                             | 33 ++++++++++++++-
 src/conf/domain_conf.h                             |  1 +
 src/qemu/qemu_driver.c                             | 48 +++++++++++++++++++---
 src/qemu/qemu_process.c                            | 39 +++++++++++++++++-
 .../qemuxml2argv-disk-active-commit.xml            | 37 +++++++++++++++++
 .../qemuxml2argvdata/qemuxml2argv-disk-mirror.xml  |  6 +--
 .../qemuxml2xmlout-disk-mirror-old.xml             |  4 +-
 tests/qemuxml2xmltest.c                            |  1 +
 10 files changed, 179 insertions(+), 18 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-active-commit.xml

--

-- 
1.9.3

Chen Hanxiao | 30 Jul 05:03 2014

[libvirt] [PATCH] docs: fix an incorrect example for memoryBacking

commit 136ad49740f017aabcac48d02d2df6ab7b0195e9
forgot to add an end-tags for hugepages.

Signed-off-by: Chen Hanxiao <chenhanxiao <at> cn.fujitsu.com>
---
 docs/formatdomain.html.in | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 2f0be20..df3fc4a 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
 <at>  <at>  -620,6 +620,7  <at>  <at> 
     &lt;hugepages&gt;
       &lt;page size="1" unit="G" nodeset="0-3,5"/&gt;
       &lt;page size="2" unit="M" nodeset="4"/&gt;
+    &lt;/hugepages&gt;
     &lt;nosharepages/&gt;
     &lt;locked/&gt;
   &lt;/memoryBacking&gt;
--

-- 
1.9.0

John Ferlan | 29 Jul 22:41 2014
Picon

[libvirt] [PATCH v2] storage: Refresh storage pool after upload

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

Upon successful upload of a volume, the target volume and storage pool
were not updated to reflect any changes as a result of the upload. Make
use of the existing stream close callback mechanism to force a backend
pool refresh to occur in a separate thread once the stream closes. The
separate thread should avoid potential deadlocks if the refresh needed
to wait on some event from the event loop which is used to perform
the stream callback.

Signed-off-by: John Ferlan <jferlan <at> redhat.com>
---

Update since v1 - as discussed in original posting, use virThreadCreate to
generate a thread to handle the refresh callback:

http://www.redhat.com/archives/libvir-list/2014-July/msg01395.html

Avoid the Free callback function and have the thread do the memory free
as long as thread creation was successful.  Thus a couple of changes to
function names were appropriate.

Understood that this can wait for 1.2.8 - figured to get it ready to go

NOTE: Still used pool refresh, since I found that without this patch
applied a pool-dumpxml displayed the same allocation/available before
and after the upload, so that data is not refreshed for each call as
was my concern over using refreshVol vs. refreshPool

# virsh pool-dumpxml default
...
  <allocation unit='bytes'>33852141568</allocation>
  <available unit='bytes'>110510419968</available>
... 
# virsh vol-upload test-qcow2-4g.img test.img default
# virsh pool-dumpxml default
...
  <allocation unit='bytes'>33852141568</allocation>
  <available unit='bytes'>110510419968</available>
...
#

 src/libvirt.c                |   8 ++++
 src/libvirt_private.syms     |   1 +
 src/storage/storage_driver.c | 103 +++++++++++++++++++++++++++++++++++++++++++
 tools/virsh.pod              |   3 ++
 4 files changed, 115 insertions(+)

diff --git a/src/libvirt.c b/src/libvirt.c
index 143d319..992e4f2 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
 <at>  <at>  -13960,6 +13960,14  <at>  <at>  virStorageVolDownload(virStorageVolPtr vol,
  * detect any errors. The results will be unpredictable if
  * another active stream is writing to the storage volume.
  *
+ * When the data stream is closed whether the upload is successful
+ * or not the target storage pool will be refreshed to reflect pool
+ * and volume changes as a result of the upload. Depending on
+ * the target volume storage backend and the source stream type
+ * for a successful upload, the target volume may take on the
+ * characteristics from the source stream such as format type,
+ * capacity, and allocation.
+ *
  * Returns 0, or -1 upon error.
  */
 int
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index e792a44..08111d4 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
 <at>  <at>  -825,6 +825,7  <at>  <at>  virFDStreamCreateFile;
 virFDStreamOpen;
 virFDStreamOpenFile;
 virFDStreamOpenPTY;
+virFDStreamSetInternalCloseCb;

 
 # libvirt_internal.h
diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c
index efbe5ff..b023281 100644
--- a/src/storage/storage_driver.c
+++ b/src/storage/storage_driver.c
 <at>  <at>  -59,6 +59,12  <at>  <at>  static virStorageDriverStatePtr driverState;

 static int storageStateCleanup(void);

+typedef struct _virStorageVolStreamInfo virStorageVolStreamInfo;
+typedef virStorageVolStreamInfo *virStorageVolStreamInfoPtr;
+struct _virStorageVolStreamInfo {
+    char *pool_name;
+};
+
 static void storageDriverLock(virStorageDriverStatePtr driver)
 {
     virMutexLock(&driver->lock);
 <at>  <at>  -1956,6 +1962,78  <at>  <at>  storageVolDownload(virStorageVolPtr obj,
 }

 
+/**
+ * Frees opaque data.
+ *
+ *  <at> opaque Data to be freed.
+ */
+static void
+virStorageVolPoolRefreshDataFree(void *opaque)
+{
+    virStorageVolStreamInfoPtr cbdata = opaque;
+
+    VIR_FREE(cbdata->pool_name);
+    VIR_FREE(cbdata);
+}
+
+/**
+ * Thread to handle the pool refresh
+ *
+ *  <at> st Pointer to stream being closed.
+ *  <at> opaque Domain's device information structure.
+ */
+static void
+virStorageVolPoolRefreshThread(void *opaque)
+{
+
+    virStorageVolStreamInfoPtr cbdata = opaque;
+    virStoragePoolObjPtr pool = NULL;
+    virStorageBackendPtr backend;
+
+    storageDriverLock(driverState);
+    if (!(pool = virStoragePoolObjFindByName(&driverState->pools,
+                                             cbdata->pool_name)))
+        goto cleanup;
+
+    if (!(backend = virStorageBackendForType(pool->def->type)))
+        goto cleanup;
+
+    virStoragePoolObjClearVols(pool);
+    if (backend->refreshPool(NULL, pool) < 0)
+        VIR_DEBUG("Failed to refresh storage pool");
+
+ cleanup:
+    if (pool)
+        virStoragePoolObjUnlock(pool);
+    storageDriverUnlock(driverState);
+    virStorageVolPoolRefreshDataFree(cbdata);
+}
+
+/**
+ * Callback being called if a FDstream is closed. Will spin off a thread
+ * to perform a pool refresh.
+ *
+ *  <at> st Pointer to stream being closed.
+ *  <at> opaque Buffer to hold the pool name to be rereshed
+ */
+static void
+virStorageVolFDStreamCloseCb(virStreamPtr st ATTRIBUTE_UNUSED,
+                             void *opaque)
+{
+    virThread thread;
+
+    if (virThreadCreate(&thread, false, virStorageVolPoolRefreshThread,
+                        opaque) < 0) {
+        /* Not much else can be done */
+        VIR_ERROR(_("Failed to create thread to handle pool refresh"));
+        goto error;
+    }
+    return; /* Thread will free opaque data */
+
+ error:
+    virStorageVolPoolRefreshDataFree(opaque);
+}
+
 static int
 storageVolUpload(virStorageVolPtr obj,
                  virStreamPtr stream,
 <at>  <at>  -1966,6 +2044,7  <at>  <at>  storageVolUpload(virStorageVolPtr obj,
     virStorageBackendPtr backend;
     virStoragePoolObjPtr pool = NULL;
     virStorageVolDefPtr vol = NULL;
+    virStorageVolStreamInfoPtr cbdata = NULL;
     int ret = -1;

     virCheckFlags(0, -1);
 <at>  <at>  -1996,11 +2075,35  <at>  <at>  storageVolUpload(virStorageVolPtr obj,
         goto cleanup;
     }

+    /* If we have a refreshPool, use the callback routine in order to
+     * refresh the pool after the volume upload stream closes. This way
+     * we make sure the volume and pool data are refreshed without user
+     * interaction and we can just lookup the backend in the callback
+     * routine in order to call the refresh API.
+     */
+    if (backend->refreshPool) {
+        if (VIR_ALLOC(cbdata) < 0 ||
+            VIR_STRDUP(cbdata->pool_name, pool->def->name) < 0)
+            goto cleanup;
+    }
+
     ret = backend->uploadVol(obj->conn, pool, vol, stream,
                              offset, length, flags);

+    /* Add cleanup callback - call after uploadVol since the stream
+     * is then fully set up
+     */
+    if (cbdata) {
+        virFDStreamSetInternalCloseCb(stream,
+                                      virStorageVolFDStreamCloseCb,
+                                      cbdata, NULL);
+        cbdata = NULL;
+    }
+
  cleanup:
     virStoragePoolObjUnlock(pool);
+    if (cbdata)
+        virStorageVolPoolRefreshDataFree(cbdata);

     return ret;
 }
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 849ae31..e377df9 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
 <at>  <at>  -2981,6 +2981,9  <at>  <at>  of the amount of data to be uploaded. A negative value is interpreted
 as an unsigned long long value to essentially include everything from
 the offset to the end of the volume.
 An error will occur if the I<local-file> is greater than the specified length.
+See the description for the libvirt virStorageVolUpload API for details
+regarding possible target volume and pool changes as a result of the
+pool refresh when the upload is attempted.

 =item B<vol-download> [I<--pool> I<pool-or-uuid>] [I<--offset> I<bytes>]
 [I<--length> I<bytes>] I<vol-name-or-key-or-path> I<local-file>
--

-- 
1.9.3

Jiri Denemark | 29 Jul 16:32 2014
Picon

[libvirt] [python PATCH] spec: Reorganize to satisfy buggy spectool

From: Jiri Denemark <Jiri.Denemark <at> gmail.com>

spectool parses a specfile and strips everything but a preamble.
However, if the first section is preceded by %if clause, it keeps it
there which then makes rpmbuild complain about unmatched %if. Let's make
the buggy tool happy by moving sections around so that the first one is
not in any conditional.

Signed-off-by: Jiri Denemark <jdenemar <at> redhat.com>
---
 libvirt-python.spec.in | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/libvirt-python.spec.in b/libvirt-python.spec.in
index b51571e..8a21003 100644
--- a/libvirt-python.spec.in
+++ b/libvirt-python.spec.in
 <at>  <at>  -22,14 +22,6  <at>  <at>  BuildRequires: python3-nose
 BuildRequires: python3-lxml
 %endif

-%if %{with_python3}
-%package -n libvirt-python3
-Summary: The libvirt virtualization API python3 binding
-Url: http://libvirt.org
-License: LGPLv2+
-Group: Development/Libraries
-%endif
-
 # Don't want provides for python shared objects
 %{?filter_provides_in: %filter_provides_in %{python_sitearch}/.*\.so}
 %{?filter_setup}
 <at>  <at>  -41,6 +33,12  <at>  <at>  supplied by the libvirt library to use the virtualization capabilities
 of recent versions of Linux (and other OSes).

 %if %{with_python3}
+%package -n libvirt-python3
+Summary: The libvirt virtualization API python3 binding
+Url: http://libvirt.org
+License: LGPLv2+
+Group: Development/Libraries
+
 %description -n libvirt-python3
 The libvirt-python package contains a module that permits applications
 written in the Python programming language to use the interface
--

-- 
2.0.2

Chunyan Liu | 29 Jul 11:59 2014

[libvirt] [PATCH] blockcopy: check dst = identical device

Check whether dst is the same device as source, if yes, report
error and exit.

Currently if dst is the same device as source, blockcopy is still
going and qemu 'drive-mirror' is executed. Considering that:
a). blockcopy to the same device is meaningless. b.) result is
unexpected. (tested with block device whose source path is /dev/sdaX,
after blockcopy, shutdown VM and then create VM from xml again, the
VM cannot be started.) This case should not be allowed.

Signed-off-by: Chunyan Liu <cyliu <at> suse.com>
---
 src/qemu/qemu_driver.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 704ba39..87a3790 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
 <at>  <at>  -15309,6 +15309,13  <at>  <at>  qemuDomainBlockCopy(virDomainObjPtr vm,
     }

     /* Prepare the destination file.  */
+    if (STREQ(disk->src->path, dest)) {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("destination '%s' is the same as disk '%s' source"),
+                       dest, path);
+        goto endjob;
+    }
+
     if (stat(dest, &st) < 0) {
         if (errno != ENOENT) {
             virReportSystemError(errno, _("unable to stat for disk %s: %s"),
--

-- 
1.8.4.5

Wang Rui | 29 Jul 10:47 2014

[libvirt] [PATCH] daemon: Fix indentation in libvirtd.c

Signed-off-by: Wang Rui <moon.wangrui <at> huawei.com>
---
 daemon/libvirtd.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
index 4c926b3..946081a 100644
--- a/daemon/libvirtd.c
+++ b/daemon/libvirtd.c
 <at>  <at>  -803,11 +803,11  <at>  <at>  static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
                                 siginfo_t *sig ATTRIBUTE_UNUSED,
                                 void *opaque ATTRIBUTE_UNUSED)
 {
-        VIR_INFO("Reloading configuration on SIGHUP");
-        virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
-                    VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
-        if (virStateReload() < 0)
-            VIR_WARN("Error while reloading drivers");
+    VIR_INFO("Reloading configuration on SIGHUP");
+    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
+                VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
+    if (virStateReload() < 0)
+        VIR_WARN("Error while reloading drivers");
 }

 static int daemonSetupSignals(virNetServerPtr srv)
--

-- 
1.7.12.4

Eric Blake | 29 Jul 06:20 2014
Picon

[libvirt] [PATCH v5 0/4] fix blockcopy across libvirtd restart, turn on active blockcommit

v4 was here:
https://www.redhat.com/archives/libvir-list/2014-June/msg01095.html

Since then: I _finally_ implemented persistent domain updates to
match live changes, by reimplementing how <mirror> is tracked in
XML to be more robust to libvirtd restarts.  In particular, it
fixes a bug in v4 that Adam Litke pointed out where a pivot
commit would emit a ready event for 'active commit' but then a
completed event for plain 'commit'.

Patches 1 and 2 are completely local to blockcopy, and fix a
long-standing bug where it is not robust to libvirtd restarts
(similar to the bug fixed in 60e4944).  They are pre-requisite
to turning on active commit.

Patches 3 and 4 are borderline on whether it is a new feature
or a bug fix.  But consider that commit 47549d5 turned on qemu
feature probing with the intent of getting this in 1.2.7, and
we already missed getting active commit into 1.2.6.  As it is,
patch 4 is very similar to the already-acked counterpart of v4.

Therefore, even though I missed rc1, I'm arguing that this whole
series should be included in rc2 in time for 1.2.7.

Not done yet, but that I'd also like to have in the release if I
can swing it: the new virConnectGetDomainCapabilities API needs
to expose features on whether active commit will work.  Also,
I'd like to fix libvirtd restarts to inspect all existing <mirror>
tags and see if the job completed while libvirtd was offline (that
is, when we miss an event, we should still start up in the correct
state when reconnecting to qemu).

Eric Blake (4):
  blockcopy: add more XML for state tracking
  blockjob: properly track blockcopy xml changes on disk
  blockcommit: track job type in xml
  blockcommit: turn on active commit

 docs/formatdomain.html.in                          |  23 ++-
 docs/schemas/domaincommon.rng                      |  19 ++-
 src/conf/domain_conf.c                             |  56 ++++++-
 src/conf/domain_conf.h                             |  14 +-
 src/qemu/qemu_driver.c                             | 167 ++++++++++++++-------
 src/qemu/qemu_process.c                            |  92 ++++++++++--
 .../qemuxml2argv-disk-active-commit.xml            |  37 +++++
 .../qemuxml2argvdata/qemuxml2argv-disk-mirror.xml  |   8 +-
 .../qemuxml2xmlout-disk-mirror-old.xml             |   4 +-
 tests/qemuxml2xmltest.c                            |   1 +
 10 files changed, 336 insertions(+), 85 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-active-commit.xml

--

-- 
1.9.3

Chen Hanxiao | 29 Jul 04:05 2014

[libvirt] [PATCH] nodedev: fix a uninitialized variable build failure

Fix a -Werror=maybe-uninitialized warring

Signed-off-by: Chen Hanxiao <chenhanxiao <at> cn.fujitsu.com>
---
 src/conf/node_device_conf.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c
index 78bc63f..96524a6 100644
--- a/src/conf/node_device_conf.c
+++ b/src/conf/node_device_conf.c
 <at>  <at>  -1349,7 +1349,7  <at>  <at>  virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt,
 {
     virNodeDevCapsDefPtr caps;
     char *tmp;
-    int val, ret;
+    int val, ret = -1;

     if (VIR_ALLOC(caps) < 0)
         return NULL;
--

-- 
1.9.0


Gmane