[libvirt] [libivrt] storage: Two iSCSI node records may cause refreshing iscsi pool failed
by Shichangkuo
Hi, John
When starting an iscsi storage pool, libvirt will execute “iscsiadm --mode node --portal 192.168.0.42 --targetname iqn.2003-10.com.xxxx --op new”, which is called by virISCSINodeNew.
This will add an iSCSI node record. The record file is /etc/iscsi/nodes/iqn.2003-10.com.xxxx/192.168.0.42,3260.
When we already executed "iscsiadm --mode discovery --type sendtargets --portal 192.168.0.42 --op new", another iSCSI node record will be produced in /etc/iscsi/nodes/iqn.2003-10.com.xxxx/192.168.0.42,3260,1/default.
Then two iscsi sessions, as [2] and [3], will be logged in when we start the pool.
Device of session [2] is /dev/sde, and device of session [3] is /dev/sdf.
But there is only one path in /dev/disk/by-path, let's assume it is /dev/sdf.
Refreshing storage pool will choose first session, like [2], and libvirt will find sde NOT sdf in /dev/disk/by-path. We will not find sde, then no volumes is found in the pool.
I think the root reason is we have two iSCSI node records.
Can we use "iscsiadm --mode discovery --type sendtargets --portal 192.168.0.42 --op new" in virISCSINodeNew?
diff --git a/src/util/viriscsi.c b/src/util/viriscsi.c
index 504ffbd..a8a8644 100644
--- a/src/util/viriscsi.c
+++ b/src/util/viriscsi.c
@@ -469,9 +469,9 @@ virISCSINodeNew(const char *portal,
int ret = -1;
cmd = virCommandNewArgList(ISCSIADM,
- "--mode", "node",
+ "--mode", "discovery",
+ "--type", "sendtargets",
"--portal", portal,
- "--targetname", target,
"--op", "new",
NULL);
Thanks,
Changkuo.
-------------------------------------------------------------------------------------------------------------------------------------
本邮件及其附件含有杭州华三通信技术有限公司的保密信息,仅限于发送给上面地址中列出
的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制、
或散发)本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本
邮件!
This e-mail and its attachments contain confidential information from H3C, which is
intended only for the person or entity whose address is listed above. Any use of the
information contained herein in any way (including, but not limited to, total or partial
disclosure, reproduction, or dissemination) by persons other than the intended
recipient(s) is prohibited. If you receive this e-mail in error, please notify the sender
by phone or email immediately and delete it!
7 years, 10 months
[libvirt] [PATCH] internal: Simplify STREQ_NULLABLE
by Michal Privoznik
Our STREQ_NULLABLE and STRNEQ_NULLABLE macros are too
complicated. This was a result of some broken version of gcc.
However, that is long gone and therefore we can simplify the
macros.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/internal.h | 4 ++--
tests/virstringtest.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/src/internal.h b/src/internal.h
index d8cc5adc3..334659d32 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -92,9 +92,9 @@
# define STRSKIP(a, b) (STRPREFIX(a, b) ? (a) + strlen(b) : NULL)
# define STREQ_NULLABLE(a, b) \
- ((a) ? (b) && STREQ((a) ? (a) : "", (b) ? (b) : "") : !(b))
+ ((a) ? (b) && STREQ((a), (b)) : !(b))
# define STRNEQ_NULLABLE(a, b) \
- ((a) ? !(b) || STRNEQ((a) ? (a) : "", (b) ? (b) : "") : !!(b))
+ ((a) ? !(b) || STRNEQ((a), (b)) : !!(b))
# define NUL_TERMINATE(buf) do { (buf)[sizeof(buf)-1] = '\0'; } while (0)
# define ARRAY_CARDINALITY(Array) (sizeof(Array) / sizeof(*(Array)))
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
index 1d660b798..db1731f96 100644
--- a/tests/virstringtest.c
+++ b/tests/virstringtest.c
@@ -34,6 +34,53 @@
VIR_LOG_INIT("tests.stringtest");
+struct testStreqData {
+ const char *a;
+ const char *b;
+};
+
+static int testStreq(const void *args)
+{
+ const struct testStreqData *data = args;
+ int ret = -1;
+ bool equal = true;
+ bool streq_rv, strneq_rv;
+ size_t i;
+
+ if ((size_t) data->a ^ (size_t) data->b)
+ equal = false;
+ if (data->a && data->b) {
+ for (i = 0; data->a[i] != '\0'; i++) {
+ if (data->b[i] == '\0' ||
+ data->a[i] != data->b[i]) {
+ equal = false;
+ break;
+ }
+ }
+ }
+
+ streq_rv = STREQ_NULLABLE(data->a, data->b);
+ strneq_rv = STRNEQ_NULLABLE(data->a, data->b);
+
+ if (streq_rv != equal) {
+ virFilePrintf(stderr,
+ "STREQ not working correctly. Expected %d got %d",
+ (int) equal, (int) streq_rv);
+ goto cleanup;
+ }
+
+ if (strneq_rv == equal) {
+ virFilePrintf(stderr,
+ "STRNEQ not working correctly. Expected %d got %d",
+ (int) equal, (int) strneq_rv);
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ return ret;
+}
+
struct testSplitData {
const char *string;
const char *delim;
@@ -651,6 +698,20 @@ mymain(void)
{
int ret = 0;
+#define TEST_STREQ(aa, bb) \
+ do { \
+ struct testStreqData streqData = {.a = aa, .b = bb}; \
+ if (virTestRun("Streq", testStreq, &streqData) < 0) \
+ ret = -1; \
+ } while (0)
+
+ TEST_STREQ("hello", "world");
+ TEST_STREQ(NULL, NULL);
+ TEST_STREQ(NULL, "");
+ TEST_STREQ("", NULL);
+ TEST_STREQ("", "");
+ TEST_STREQ("hello", "hello");
+
#define TEST_SPLIT(str, del, max, toks) \
do { \
struct testSplitData splitData = { \
--
2.11.0
7 years, 10 months
[libvirt] [PATCH 0/3] Improve release notes process
by Andrea Bolognani
The release note process we have had in place since v2.5.0
was never meant to be anything more than a stop-gap measure
until a better solution was devised. I believe this series
implements exactly that better solution :)
Andrea Bolognani (3):
NEWS: Improve building pipeline
NEWS: Reformat at generation time
docs: Document the release notes process for contributors
.gitignore | 1 +
Makefile.am | 16 ++--
docs/Makefile.am | 22 ++++-
docs/NEWS.xsl | 61 +++++++++++++
docs/hacking.html.in | 8 ++
docs/news.html.in | 157 --------------------------------
docs/news.xml | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++
docs/news.xsl | 103 ++++++++++++++-------
docs/reformat-news.py | 111 +++++++++++++++++++++++
9 files changed, 521 insertions(+), 199 deletions(-)
create mode 100644 docs/NEWS.xsl
delete mode 100644 docs/news.html.in
create mode 100644 docs/news.xml
create mode 100755 docs/reformat-news.py
--
2.7.4
7 years, 10 months
[libvirt] [PATCH go-xml] Added domain OS struct and tests
by Alexey Slaykovsky
Signed-off-by: Alexey Slaykovsky <aslaikov(a)redhat.com>
---
domain.go | 68 ++++++++++++++++++++++++
domain_test.go | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 232 insertions(+)
diff --git a/domain.go b/domain.go
index c98908e..ec2bd02 100644
--- a/domain.go
+++ b/domain.go
@@ -126,6 +126,69 @@ type DomainMemory struct {
Unit string `xml:"unit,attr"`
}
+type DomainOSType struct {
+ Arch string `xml:"arch,attr"`
+ Machine string `xml:"machine,attr"`
+ Type string `xml:",chardata"`
+}
+
+type DomainSMBios struct {
+ Mode string `xml:"mode,attr"`
+}
+
+type DomainNVRam struct {
+ NVRam string `xml:",chardata"`
+ Template string `xml:"template,attr"`
+}
+
+type DomainBootDevice struct {
+ Dev string `xml:"dev,attr"`
+}
+
+type DomainBootMenu struct {
+ Enabled string `xml:"enabled,attr"`
+ Timeout string `xml:"timeout,attr"`
+}
+
+type DomainSysInfo struct {
+ Type string `xml:"type,attr"`
+ System []DomainSysInfoEntry `xml:"system>entry"`
+ BIOS []DomainSysInfoEntry `xml:"bios>entry"`
+ BaseBoard []DomainSysInfoEntry `xml:"baseBoard>entry"`
+}
+
+type DomainSysInfoEntry struct {
+ Name string `xml:"name,attr"`
+ Value string `xml:",chardata"`
+}
+
+type DomainBIOS struct {
+ UseSerial string `xml:"useserial,attr"`
+ RebootTimeout string `xml:"rebootTimeout,attr"`
+}
+
+type DomainLoader struct {
+ Path string `xml:",chardata"`
+ Readonly string `xml:"readonly,attr"`
+ Secure string `xml:"secure,attr"`
+ Type string `xml:"type,attr"`
+}
+
+type DomainOS struct {
+ Type *DomainOSType `xml:"type"`
+ Loader *DomainLoader `xml:"loader"`
+ NVRam *DomainNVRam `xml:"nvram"`
+ Kernel string `xml:"kernel,omitempty"`
+ Initrd string `xml:"initrd,omitempty"`
+ KernelArgs string `xml:"cmdline,omitempty"`
+ BootDevices []DomainBootDevice `xml:"boot"`
+ BootMenu *DomainBootMenu `xml:"bootmenu"`
+ SMBios *DomainSMBios `xml:"smbios"`
+ BIOS *DomainBIOS `xml:"bios"`
+ Init string `xml:"init,omitempty"`
+ InitArgs []string `xml:"initarg"`
+}
+
type Domain struct {
XMLName xml.Name `xml:"domain"`
Type string `xml:"type,attr"`
@@ -134,4 +197,9 @@ type Domain struct {
Memory *DomainMemory `xml:"memory"`
CurrentMemory *DomainMemory `xml:"currentMemory"`
Devices *DomainDeviceList `xml:"devices"`
+ OS *DomainOS `xml:"os"`
+ SysInfo *DomainSysInfo `xml:"sysinfo"`
+ OnPoweroff string `xml:"on_poweroff,omitempty"`
+ OnReboot string `xml:"on_reboot,omitempty"`
+ OnCrash string `xml:"on_crash,omitempty"`
}
diff --git a/domain_test.go b/domain_test.go
index e403aeb..ae262e5 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -121,6 +121,170 @@ var domainTestData = []struct {
`</domain>`,
},
},
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ Memory: &DomainMemory{
+ Unit: "KiB",
+ Value: "8192",
+ },
+ CurrentMemory: &DomainMemory{
+ Unit: "KiB",
+ Value: "4096",
+ },
+ OS: &DomainOS{
+ Type: &DomainOSType{
+ Arch: "x86_64",
+ Machine: "pc",
+ Type: "hvm",
+ },
+ BootDevices: []DomainBootDevice{
+ DomainBootDevice{
+ Dev: "hd",
+ },
+ },
+ Loader: &DomainLoader{
+ Readonly: "yes",
+ Secure: "no",
+ Type: "rom",
+ Path: "/loader",
+ },
+ SMBios: &DomainSMBios{
+ Mode: "sysinfo",
+ },
+ BIOS: &DomainBIOS{
+ UseSerial: "yes",
+ RebootTimeout: "0",
+ },
+ Init: "/bin/systemd",
+ InitArgs: []string{
+ "--unit",
+ "emergency.service",
+ },
+ },
+ SysInfo: &DomainSysInfo{
+ Type: "smbios",
+ BIOS: []DomainSysInfoEntry{
+ DomainSysInfoEntry{
+ Name: "vendor",
+ Value: "vendor",
+ },
+ },
+ System: []DomainSysInfoEntry{
+ DomainSysInfoEntry{
+ Name: "manufacturer",
+ Value: "manufacturer",
+ },
+ DomainSysInfoEntry{
+ Name: "product",
+ Value: "product",
+ },
+ DomainSysInfoEntry{
+ Name: "version",
+ Value: "version",
+ },
+ },
+ BaseBoard: []DomainSysInfoEntry{
+ DomainSysInfoEntry{
+ Name: "manufacturer",
+ Value: "manufacturer",
+ },
+ DomainSysInfoEntry{
+ Name: "product",
+ Value: "product",
+ },
+ DomainSysInfoEntry{
+ Name: "version",
+ Value: "version",
+ },
+ DomainSysInfoEntry{
+ Name: "serial",
+ Value: "serial",
+ },
+ },
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <memory unit="KiB">8192</memory>`,
+ ` <currentMemory unit="KiB">4096</currentMemory>`,
+ ` <os>`,
+ ` <type arch="x86_64" machine="pc">hvm</type>`,
+ ` <loader readonly="yes" secure="no" type="rom">/loader</loader>`,
+ ` <boot dev="hd"></boot>`,
+ ` <smbios mode="sysinfo"></smbios>`,
+ ` <bios useserial="yes" rebootTimeout="0"></bios>`,
+ ` <init>/bin/systemd</init>`,
+ ` <initarg>--unit</initarg>`,
+ ` <initarg>emergency.service</initarg>`,
+ ` </os>`,
+ ` <sysinfo type="smbios">`,
+ ` <system>`,
+ ` <entry name="manufacturer">manufacturer</entry>`,
+ ` <entry name="product">product</entry>`,
+ ` <entry name="version">version</entry>`,
+ ` </system>`,
+ ` <bios>`,
+ ` <entry name="vendor">vendor</entry>`,
+ ` </bios>`,
+ ` <baseBoard>`,
+ ` <entry name="manufacturer">manufacturer</entry>`,
+ ` <entry name="product">product</entry>`,
+ ` <entry name="version">version</entry>`,
+ ` <entry name="serial">serial</entry>`,
+ ` </baseBoard>`,
+ ` </sysinfo>`,
+ `</domain>`,
+ },
+ },
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ OS: &DomainOS{
+ NVRam: &DomainNVRam{
+ Template: "/t.fd",
+ NVRam: "/vars.fd",
+ },
+ BootMenu: &DomainBootMenu{
+ Enabled: "yes",
+ Timeout: "3000",
+ },
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <os>`,
+ ` <nvram template="/t.fd">/vars.fd</nvram>`,
+ ` <bootmenu enabled="yes" timeout="3000"></bootmenu>`,
+ ` </os>`,
+ `</domain>`,
+ },
+ },
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ OS: &DomainOS{
+ Kernel: "/vmlinuz",
+ Initrd: "/initrd",
+ KernelArgs: "arg",
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <os>`,
+ ` <kernel>/vmlinuz</kernel>`,
+ ` <initrd>/initrd</initrd>`,
+ ` <cmdline>arg</cmdline>`,
+ ` </os>`,
+ `</domain>`,
+ },
+ },
}
func TestDomain(t *testing.T) {
--
2.11.0
7 years, 10 months
[libvirt] [PATCH go-xml] Added domain OS struct and tests
by Alexey Slaykovsky
Signed-off-by: Alexey Slaykovsky <aslaikov(a)redhat.com>
---
domain.go | 68 ++++++++++++++++++++++++
domain_test.go | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 232 insertions(+)
diff --git a/domain.go b/domain.go
index c98908e..25155ee 100644
--- a/domain.go
+++ b/domain.go
@@ -126,6 +126,69 @@ type DomainMemory struct {
Unit string `xml:"unit,attr"`
}
+type DomainOSType struct {
+ Arch string `xml:"arch,attr"`
+ Machine string `xml:"machine,attr"`
+ Type string `xml:",chardata"`
+}
+
+type DomainSMBios struct {
+ Mode string `xml:"mode,attr"`
+}
+
+type DomainNVRam struct {
+ NVRam string `xml:",chardata"`
+ Template string `xml:"template,attr,omitempty"`
+}
+
+type DomainBootDevice struct {
+ Dev string `xml:"dev,attr"`
+}
+
+type DomainBootMenu struct {
+ Enabled string `xml:"enabled,attr"`
+ Timeout string `xml:"timeout,attr,omitempty"`
+}
+
+type DomainSysInfo struct {
+ Type string `xml:"type,attr"`
+ System []DomainEntry `xml:"system>entry"`
+ BIOS []DomainEntry `xml:"bios>entry"`
+ BaseBoard []DomainEntry `xml:"baseBoard>entry"`
+}
+
+type DomainEntry struct {
+ Name string `xml:"name,attr"`
+ Value string `xml:",chardata"`
+}
+
+type DomainBIOS struct {
+ UseSerial string `xml:"useserial,attr"`
+ RebootTimeout string `xml:"rebootTimeout,attr"`
+}
+
+type DomainLoader struct {
+ Path string `xml:",chardata"`
+ Readonly string `xml:"readonly,attr"`
+ Secure string `xml:"secure,attr"`
+ Type string `xml:"type,attr"`
+}
+
+type DomainOS struct {
+ Type *DomainOSType `xml:"type"`
+ Loader *DomainLoader `xml:"loader,omitempty"`
+ NVRam *DomainNVRam `xml:"nvram"`
+ Kernel string `xml:"kernel,omitempty"`
+ Initrd string `xml:"initrd,omitempty"`
+ KernelArgs string `xml:"cmdline,omitempty"`
+ BootDevices []DomainBootDevice `xml:"boot"`
+ BootMenu *DomainBootMenu `xml:"bootmenu,omitempty"`
+ SMBios *DomainSMBios `xml:"smbios,omitempty"`
+ BIOS *DomainBIOS `xml:"bios,omitempty"`
+ Init string `xml:"init,omitempty"`
+ InitArgs []string `xml:"initarg,omitempty"`
+}
+
type Domain struct {
XMLName xml.Name `xml:"domain"`
Type string `xml:"type,attr"`
@@ -134,4 +197,9 @@ type Domain struct {
Memory *DomainMemory `xml:"memory"`
CurrentMemory *DomainMemory `xml:"currentMemory"`
Devices *DomainDeviceList `xml:"devices"`
+ OS *DomainOS `xml:"os,omitempty"`
+ SysInfo *DomainSysInfo `xml:"sysinfo,omitempty"`
+ OnPoweroff string `xml:"on_poweroff,omitempty"`
+ OnReboot string `xml:"on_reboot,omitempty"`
+ OnCrash string `xml:"on_crash,omitempty"`
}
diff --git a/domain_test.go b/domain_test.go
index e403aeb..8ee9699 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -121,6 +121,170 @@ var domainTestData = []struct {
`</domain>`,
},
},
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ Memory: &DomainMemory{
+ Unit: "KiB",
+ Value: "8192",
+ },
+ CurrentMemory: &DomainMemory{
+ Unit: "KiB",
+ Value: "4096",
+ },
+ OS: &DomainOS{
+ Type: &DomainOSType{
+ Arch: "x86_64",
+ Machine: "pc",
+ Type: "hvm",
+ },
+ BootDevices: []DomainBootDevice{
+ DomainBootDevice{
+ Dev: "hd",
+ },
+ },
+ Loader: &DomainLoader{
+ Readonly: "yes",
+ Secure: "no",
+ Type: "rom",
+ Path: "/loader",
+ },
+ SMBios: &DomainSMBios{
+ Mode: "sysinfo",
+ },
+ BIOS: &DomainBIOS{
+ UseSerial: "yes",
+ RebootTimeout: "0",
+ },
+ Init: "/bin/systemd",
+ InitArgs: []string{
+ "--unit",
+ "emergency.service",
+ },
+ },
+ SysInfo: &DomainSysInfo{
+ Type: "smbios",
+ BIOS: []DomainEntry{
+ DomainEntry{
+ Name: "vendor",
+ Value: "vendor",
+ },
+ },
+ System: []DomainEntry{
+ DomainEntry{
+ Name: "manufacturer",
+ Value: "manufacturer",
+ },
+ DomainEntry{
+ Name: "product",
+ Value: "product",
+ },
+ DomainEntry{
+ Name: "version",
+ Value: "version",
+ },
+ },
+ BaseBoard: []DomainEntry{
+ DomainEntry{
+ Name: "manufacturer",
+ Value: "manufacturer",
+ },
+ DomainEntry{
+ Name: "product",
+ Value: "product",
+ },
+ DomainEntry{
+ Name: "version",
+ Value: "version",
+ },
+ DomainEntry{
+ Name: "serial",
+ Value: "serial",
+ },
+ },
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <memory unit="KiB">8192</memory>`,
+ ` <currentMemory unit="KiB">4096</currentMemory>`,
+ ` <os>`,
+ ` <type arch="x86_64" machine="pc">hvm</type>`,
+ ` <loader readonly="yes" secure="no" type="rom">/loader</loader>`,
+ ` <boot dev="hd"></boot>`,
+ ` <smbios mode="sysinfo"></smbios>`,
+ ` <bios useserial="yes" rebootTimeout="0"></bios>`,
+ ` <init>/bin/systemd</init>`,
+ ` <initarg>--unit</initarg>`,
+ ` <initarg>emergency.service</initarg>`,
+ ` </os>`,
+ ` <sysinfo type="smbios">`,
+ ` <system>`,
+ ` <entry name="manufacturer">manufacturer</entry>`,
+ ` <entry name="product">product</entry>`,
+ ` <entry name="version">version</entry>`,
+ ` </system>`,
+ ` <bios>`,
+ ` <entry name="vendor">vendor</entry>`,
+ ` </bios>`,
+ ` <baseBoard>`,
+ ` <entry name="manufacturer">manufacturer</entry>`,
+ ` <entry name="product">product</entry>`,
+ ` <entry name="version">version</entry>`,
+ ` <entry name="serial">serial</entry>`,
+ ` </baseBoard>`,
+ ` </sysinfo>`,
+ `</domain>`,
+ },
+ },
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ OS: &DomainOS{
+ NVRam: &DomainNVRam{
+ Template: "/t.fd",
+ NVRam: "/vars.fd",
+ },
+ BootMenu: &DomainBootMenu{
+ Enabled: "yes",
+ Timeout: "3000",
+ },
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <os>`,
+ ` <nvram template="/t.fd">/vars.fd</nvram>`,
+ ` <bootmenu enabled="yes" timeout="3000"></bootmenu>`,
+ ` </os>`,
+ `</domain>`,
+ },
+ },
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ OS: &DomainOS{
+ Kernel: "/vmlinuz",
+ Initrd: "/initrd",
+ KernelArgs: "arg",
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <os>`,
+ ` <kernel>/vmlinuz</kernel>`,
+ ` <initrd>/initrd</initrd>`,
+ ` <cmdline>arg</cmdline>`,
+ ` </os>`,
+ `</domain>`,
+ },
+ },
}
func TestDomain(t *testing.T) {
--
2.11.0
7 years, 10 months
[libvirt] libvirt failed to spawn with namespace
by Qiao, Liyong
Hi Michal
Build with the latest libvirt source code, I found failed to spawn a qemu process, not sure if something wrong with my environment, can you please help to take a look at it?
After build the latest (3.0.0) libvirt, found failed to start an existed domain.
root@s2600wt:/home/taget/qemu# virsh start kvm02
error: Failed to start domain kvm02
error: internal error: Process exited prior to exec: libvirt: QEMU Driver error : Unable to move /dev/mqueue mount: Invalid argument
then I found you had some code get merged, and required to use /dev/mqueue
so mount it then start the domain again:
mount -t mqueue none /dev/mqueue
root@s2600wt:/home/taget/qemu# virsh start kvm02
error: Failed to start domain kvm02
error: An error occurred, but the cause is unknown
some debug log are:
…
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/var/run/libvirt/qemu/kvm02.dev/ mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakeParentPath:2971 : path=/var/run/libvirt/qemu/kvm02.dev//hpet
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/var/run/libvirt/qemu/kvm02.dev/ mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakeParentPath:2971 : path=/var/run/libvirt/qemu/kvm02.dev//vfio/vfio
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/var/run/libvirt/qemu/kvm02.dev//vfio mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/var/run/libvirt/qemu/kvm02.dev/ mode=0777
2017-01-05 07:48:44.195+0000: 37227: info : virObjectUnref:259 : OBJECT_UNREF: obj=0x7f7dc812fad0
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllDisks:7076 : Setting up disks
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllDisks:7085 : Setup all disks
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllHostdevs:7124 : Setting up hostdevs
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllHostdevs:7131 : Setup all hostdevs
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllChardevs:7155 : Setting up chardevs
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllChardevs:7163 : Setup all chardevs
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllInputs:7231 : Setting up disks
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllInputs:7238 : Setup all disks
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllRNGs:7270 : Setting up RNGs
2017-01-05 07:48:44.195+0000: 37227: debug : qemuDomainSetupAllRNGs:7278 : Setup all RNGs
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev/pts mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev/shm mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev/mqueue mode=0777
2017-01-05 07:48:44.195+0000: 37227: debug : virFileMakePathHelper:2899 : path=/dev mode=0777
2017-01-05 07:48:44.195+0000: 37227: info : virObjectUnref:259 : OBJECT_UNREF: obj=0x7f7dc812fad0
2017-01-05 07:48:44.195+0000: 37227: info : virObjectUnref:259 : OBJECT_UNREF: obj=0x7f7dc812fad0
2017-01-05 07:48:44.195+0000: 37227: debug : qemuProcessHook:2693 : Hook complete ret=0
2017-01-05 07:48:44.195+0000: 37227: debug : virExec:699 : Done hook 0
2017-01-05 07:48:44.195+0000: 37227: debug : virExec:736 : Setting child uid:gid to 0:0 with caps 0
2017-01-05 07:48:44.195+0000: 37227: debug : virCommandHandshakeChild:435 : Notifying parent for handshake start on 25
2017-01-05 07:48:44.195+0000: 37227: debug : virCommandHandshakeChild:443 : Waiting on parent for handshake complete on 26
libvirt: error : libvirtd quit during handshake: Input/output error
2017-01-05 07:48:44.216+0000: shutting down, reason=failed
/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
I work on the latest libvirt git tree.
commit 866641d4c5706413393913fdb3bb1cd077683d21
Author: Michal Privoznik <mprivozn(a)redhat.com>
Date: Sat Dec 24 17:55:48 2016 +0100
NEWS: Update after qemu namespace fix
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
Best Regards
Eli Qiao(乔立勇)OpenStack Core team OTC Intel.
--
7 years, 10 months
[libvirt] [PATCH] qemuProcessLaunch: fix indentation
by Michal Privoznik
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
Pushed under trivial rule.
src/qemu/qemu_process.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 7d283fb5f7..d8593ba837 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5582,10 +5582,10 @@ qemuProcessLaunch(virConnectPtr conn,
goto cleanup;
VIR_DEBUG("Setting domain security labels");
- if (qemuSecuritySetAllLabel(driver,
- vm,
- incoming ? incoming->path : NULL) < 0)
- goto cleanup;
+ if (qemuSecuritySetAllLabel(driver,
+ vm,
+ incoming ? incoming->path : NULL) < 0)
+ goto cleanup;
/* Security manager labeled all devices, therefore
* if any operation from now on fails, we need to ask the caller to
--
2.11.0
7 years, 10 months
[libvirt] Loosing lxc guests when restarting libvirt
by Christian Ehrhardt
Hi,
I found an issue in libvirt related to libvirt-lxc, but fail to find the
root cause.
The TL;DR is: libvirt-lxc guests get killed on libvirt restart due to
"internal error: No valid cgroup for machine"
It was able to reproduce libvirt 1.3.1, 2.4 and 2.5 as packages in Ubuntu
and Debian.
I wanted to ask for two things:
- wider coverage where this does reproduce
- your expertise on the case itself.
Steps to reproduce:
1. Spawn new KVM Guest of your choice
2. install test dependencies
$ apt-get install libvirt-daemon-system libvirt-clients libxml2-utils
# or package managers / package names of your chosen os
3. run the following sequence as root
export LIBVIRT_DEFAULT_URI=lxc:///
cat << EOF > /tmp/smoke-lxc.xml
<domain type='lxc'>
<name>sl</name>
<memory unit='KiB'>256000</memory>
<currentMemory unit='KiB'>256000</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type>exe</type>
<init>/bin/bash</init>
</os>
<features>
<privnet/>
</features>
<clock offset='utc'/>
<devices>
<emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/'/>
<target dir='/'/>
</filesystem>
<console type='pty'>
<target type='lxc' port='0'/>
</console>
</devices>
</domain>
EOF
virsh define /tmp/smoke-lxc.xml
virsh start sl
virsh list --all
# is running now
/etc/init.d/libvirtd restart
virsh list --all
# is no more running, but it should
Way more background and detail can be found at
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=848317
--
Christian Ehrhardt
Software Engineer, Ubuntu Server
Canonical Ltd
7 years, 10 months
[libvirt] [PATCH] Changes to support Veritas HyperScale (VxHS) block device protocol with qemu-kvm
by Ashish Mittal
Sample XML for a vxhs vdisk is as follows:
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'>
<host name='192.168.0.1' port='9999'/>
</source>
<backingStore/>
<target dev='vda' bus='virtio'/>
<serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
Signed-off-by: Ashish Mittal <Ashish.Mittal(a)veritas.com>
---
docs/formatdomain.html.in | 12 ++++++--
docs/schemas/domaincommon.rng | 1 +
src/qemu/qemu_command.c | 4 +++
src/qemu/qemu_driver.c | 3 ++
src/qemu/qemu_parse_command.c | 25 ++++++++++++++++
src/util/virstoragefile.c | 4 ++-
src/util/virstoragefile.h | 1 +
.../qemuxml2argv-disk-drive-network-vxhs.args | 23 +++++++++++++++
.../qemuxml2argv-disk-drive-network-vxhs.xml | 34 ++++++++++++++++++++++
tests/qemuxml2argvtest.c | 1 +
10 files changed, 104 insertions(+), 4 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 11b3330..ade35a3 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2276,9 +2276,9 @@
<dd>
The <code>protocol</code> attribute specifies the protocol to
access to the requested image. Possible values are "nbd",
- "iscsi", "rbd", "sheepdog" or "gluster". If the
- <code>protocol</code> attribute is "rbd", "sheepdog" or
- "gluster", an additional attribute <code>name</code> is
+ "iscsi", "rbd", "sheepdog", "gluster" or "vxhs". If the
+ <code>protocol</code> attribute is "rbd", "sheepdog", "gluster"
+ or "vxhs", an additional attribute <code>name</code> is
mandatory to specify which volume/image will be used. For "nbd",
the <code>name</code> attribute is optional. For "iscsi"
(<span class="since">since 1.0.4</span>), the <code>name</code>
@@ -2388,6 +2388,12 @@
<td> one or more (<span class="since">Since 2.1.0</span>), just one prior to that </td>
<td> 24007 </td>
</tr>
+ <tr>
+ <td> vxhs </td>
+ <td> a server running Veritas HyperScale daemon </td>
+ <td> only one </td>
+ <td> 9999 </td>
+ </tr>
</table>
<p>
gluster supports "tcp", "rdma", "unix" as valid values for the
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 19d45fd..e569e0a 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1464,6 +1464,7 @@
<value>ftp</value>
<value>ftps</value>
<value>tftp</value>
+ <value>vxhs</value>
</choice>
</attribute>
<optional>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 4a5fce3..c7b95aa 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -491,6 +491,9 @@ qemuNetworkDriveGetPort(int protocol,
/* no default port specified */
return 0;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
+ return 9999;
+
case VIR_STORAGE_NET_PROTOCOL_RBD:
case VIR_STORAGE_NET_PROTOCOL_LAST:
case VIR_STORAGE_NET_PROTOCOL_NONE:
@@ -1034,6 +1037,7 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src,
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_ISCSI:
case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
ret = qemuBuildNetworkDriveURI(src, secinfo);
break;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a82e58b..4910004 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13724,6 +13724,7 @@ qemuDomainSnapshotPrepareDiskExternalBackingInactive(virDomainDiskDefPtr disk)
case VIR_STORAGE_NET_PROTOCOL_FTPS:
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_SSH:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_LAST:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("external inactive snapshots are not supported on "
@@ -13787,6 +13788,7 @@ qemuDomainSnapshotPrepareDiskExternalOverlayActive(virDomainSnapshotDiskDefPtr d
case VIR_STORAGE_NET_PROTOCOL_FTPS:
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_SSH:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_LAST:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("external active snapshots are not supported on "
@@ -13932,6 +13934,7 @@ qemuDomainSnapshotPrepareDiskInternal(virConnectPtr conn,
case VIR_STORAGE_NET_PROTOCOL_FTPS:
case VIR_STORAGE_NET_PROTOCOL_TFTP:
case VIR_STORAGE_NET_PROTOCOL_SSH:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
case VIR_STORAGE_NET_PROTOCOL_LAST:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("internal inactive snapshots are not supported on "
diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c
index c3b27aa..f2edc28 100644
--- a/src/qemu/qemu_parse_command.c
+++ b/src/qemu/qemu_parse_command.c
@@ -263,6 +263,16 @@ qemuParseNBDString(virDomainDiskDefPtr disk)
return -1;
}
+static int
+qemuParseVxHSString(virDomainDiskDefPtr def)
+{
+ virURIPtr uri = NULL;
+
+ if (!(uri = virURIParse(def->src->path)))
+ return -1;
+
+ return qemuParseDriveURIString(def, uri, "vxhs");
+}
/*
* This method takes a string representing a QEMU command line ARGV set
@@ -737,6 +747,12 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
if (VIR_STRDUP(def->src->path, vdi) < 0)
goto error;
}
+ } else if (STRPREFIX(def->src->path, "vxhs:")) {
+ def->src->type = VIR_STORAGE_TYPE_NETWORK;
+ def->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS;
+
+ if (qemuParseVxHSString(def) < 0)
+ goto error;
} else {
def->src->type = VIR_STORAGE_TYPE_FILE;
}
@@ -1933,6 +1949,10 @@ qemuParseCommandLine(virCapsPtr caps,
disk->src->type = VIR_STORAGE_TYPE_NETWORK;
disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_SHEEPDOG;
val += strlen("sheepdog:");
+ } else if (STRPREFIX(val, "vxhs:")) {
+ disk->src->type = VIR_STORAGE_TYPE_NETWORK;
+ disk->src->protocol = VIR_STORAGE_NET_PROTOCOL_VXHS;
+ val += strlen("vxhs:");
} else {
disk->src->type = VIR_STORAGE_TYPE_FILE;
}
@@ -2009,6 +2029,11 @@ qemuParseCommandLine(virCapsPtr caps,
goto error;
break;
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
+ if (qemuParseVxHSString(disk) < 0)
+ goto error;
+
+ break;
case VIR_STORAGE_NET_PROTOCOL_HTTP:
case VIR_STORAGE_NET_PROTOCOL_HTTPS:
case VIR_STORAGE_NET_PROTOCOL_FTP:
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 272db67..a730a01 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -86,7 +86,8 @@ VIR_ENUM_IMPL(virStorageNetProtocol, VIR_STORAGE_NET_PROTOCOL_LAST,
"ftp",
"ftps",
"tftp",
- "ssh")
+ "ssh",
+ "vxhs")
VIR_ENUM_IMPL(virStorageNetHostTransport, VIR_STORAGE_NET_HOST_TRANS_LAST,
"tcp",
@@ -2634,6 +2635,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src,
case VIR_STORAGE_NET_PROTOCOL_ISCSI:
case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
case VIR_STORAGE_NET_PROTOCOL_SSH:
+ case VIR_STORAGE_NET_PROTOCOL_VXHS:
virReportError(VIR_ERR_INTERNAL_ERROR,
_("malformed backing store path for protocol %s"),
protocol);
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 3d09468..88dff36 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -132,6 +132,7 @@ typedef enum {
VIR_STORAGE_NET_PROTOCOL_FTPS,
VIR_STORAGE_NET_PROTOCOL_TFTP,
VIR_STORAGE_NET_PROTOCOL_SSH,
+ VIR_STORAGE_NET_PROTOCOL_VXHS,
VIR_STORAGE_NET_PROTOCOL_LAST
} virStorageNetProtocol;
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
new file mode 100644
index 0000000..3d37b00
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.args
@@ -0,0 +1,23 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/home/test \
+USER=test \
+LOGNAME=test \
+QEMU_AUDIO_DRV=none \
+/usr/libexec/qemu-kvm \
+-name QEMUGuest1 \
+-S \
+-M pc \
+-cpu qemu32 \
+-m 214 \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
+-nographic \
+-nodefaults \
+-monitor unix:/tmp/lib/domain--1-QEMUGuest1/monitor.sock,server,nowait \
+-no-acpi \
+-boot c \
+-usb \
+-drive file=vxhs://192.168.0.1:9999/eb90327c-8302-4725-9e1b-4e85ed4dc251,\
+format=raw,if=none,id=drive-virtio-disk0,cache=none \
+-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml
new file mode 100644
index 0000000..45c807f
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-network-vxhs.xml
@@ -0,0 +1,34 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/libexec/qemu-kvm</emulator>
+ <disk type='network' device='disk'>
+ <driver name='qemu' type='raw' cache='none'/>
+ <source protocol='vxhs' name='eb90327c-8302-4725-9e1b-4e85ed4dc251'>
+ <host name='192.168.0.1' port='9999'/>
+ </source>
+ <backingStore/>
+ <target dev='vda' bus='virtio'/>
+ <serial>eb90327c-8302-4725-9e1b-4e85ed4dc251</serial>
+ <alias name='virtio-disk0'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
+ </disk>
+ <controller type='usb' index='0'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <input type='mouse' bus='ps2'/>
+ <input type='keyboard' bus='ps2'/>
+ <memballoon model='none'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 1ee8402..d94e3f2 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -869,6 +869,7 @@ mymain(void)
# endif
DO_TEST("disk-drive-network-rbd-ipv6", NONE);
DO_TEST_FAILURE("disk-drive-network-rbd-no-colon", NONE);
+ DO_TEST("disk-drive-network-vxhs", NONE);
DO_TEST("disk-drive-no-boot",
QEMU_CAPS_BOOTINDEX);
DO_TEST_PARSE_ERROR("disk-device-lun-type-invalid",
--
2.5.5
7 years, 10 months
[libvirt] [PATCH] qemu: snapshot: restart CPUs when recover from interrupted snapshot job
by Wangjing (King, Euler)
If we restart libvirtd while VM was doing external memory snapshot, VM's
state be updated to paused as a result of running a migration-to-file
operation, and then VM will be left as paused state. In this case we must
restart the VM's CPUs to resume it.
Signed-off-by: Wang King <king.wang(a)huawei.com>
---
src/qemu/qemu_process.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index afe3cac..7d283fb 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3093,7 +3093,8 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver,
(job->asyncJob == QEMU_ASYNC_JOB_SAVE &&
reason == VIR_DOMAIN_PAUSED_SAVE) ||
(job->asyncJob == QEMU_ASYNC_JOB_SNAPSHOT &&
- reason == VIR_DOMAIN_PAUSED_SNAPSHOT) ||
+ (reason == VIR_DOMAIN_PAUSED_SNAPSHOT ||
+ reason == VIR_DOMAIN_PAUSED_MIGRATION)) ||
reason == VIR_DOMAIN_PAUSED_UNKNOWN)) {
if (qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED,
--
2.8.3
7 years, 10 months