[libvirt] [PATCH] qemu: taint domain if virDomainQemuAgentCommand API is used
by Pavel Hrdina
This is similar to the virDomainQemuMonitorCommand API, it can change
the domain state in a way that libvirt may not understand.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/conf/domain_conf.c | 3 ++-
src/conf/domain_conf.h | 1 +
src/qemu/qemu_driver.c | 2 ++
3 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index fffcc8e9da..55b3cb2430 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -100,7 +100,8 @@ VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
"host-cpu",
"hook-script",
"cdrom-passthrough",
- "custom-dtb");
+ "custom-dtb",
+ "custom-ga-command");
VIR_ENUM_IMPL(virDomainVirt, VIR_DOMAIN_VIRT_LAST,
"none",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index e3f060b122..af5e379468 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2444,6 +2444,7 @@ typedef enum {
VIR_DOMAIN_TAINT_HOOK, /* Domain (possibly) changed via hook script */
VIR_DOMAIN_TAINT_CDROM_PASSTHROUGH,/* CDROM passthrough */
VIR_DOMAIN_TAINT_CUSTOM_DTB, /* Custom device tree blob was specified */
+ VIR_DOMAIN_TAINT_CUSTOM_GA_COMMAND, /* Custom guest agent command */
VIR_DOMAIN_TAINT_LAST
} virDomainTaintFlags;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6132bc4a9a..3a0e3b6cec 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18737,6 +18737,8 @@ qemuDomainQemuAgentCommand(virDomainPtr domain,
if (!qemuDomainAgentAvailable(vm, true))
goto endjob;
+ qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_CUSTOM_GA_COMMAND, NULL);
+
agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentArbitraryCommand(agent, cmd, &result, timeout);
qemuDomainObjExitAgent(vm, agent);
--
2.13.6
7 years
[libvirt] [PATCH 0/2] Fix storage driver crash
by John Ferlan
As described recently on list:
https://www.redhat.com/archives/libvir-list/2017-November/msg00043.html
and then discussed more in depth recently on OFTC #virt IRC, the
thread run after a storageVolUpload is completed to refresh the volume
and pool statistics could cause a crash if there was a storageVolCreateXML
being run in a different thread that was taking a long time to build the
volume. In the create/build case, the storage pool is unlocked while the
build occurs, but before doing so "asyncjobs" is incremented to avoid
certain other destructive operations such as PoolUndefine, PoolDestroy,
PoolDelete, and PoolRefresh. The poolRefresh will clear and repopulate
the pool volume list which is a bad thing to do since the create logic
will have added to that list and be keeping track of what was added just
in case the volume would need to be removed in the event of a build
failure.
The patches here will fix the case found and then alter the logic for
another possible miscreant that would clear the volumes in a thread that
needs to be run "later" than the normal processing for SCSI Fibre Channel
volume recognition.
John Ferlan (2):
storage: Resolve storage driver crash
scsi: Check for long running create in FCRefreshThread
src/storage/storage_backend_scsi.c | 1 +
src/storage/storage_driver.c | 9 +++++++++
2 files changed, 10 insertions(+)
--
2.13.6
7 years
[libvirt] [PATCH go-xml] Add support for panic device
by zhenwei.pi
Add DomainAddressISA for panic device address.
Add DomainPanic.
Add test code.
Signed-off-by: zhenwei.pi <zhenwei.pi(a)youruncloud.com>
---
domain.go | 38 ++++++++++++++++++++++++++++++++++++++
domain_test.go | 28 +++++++++++++++++++++++++---
2 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/domain.go b/domain.go
index f4ef35c..8086e28 100644
--- a/domain.go
+++ b/domain.go
@@ -312,11 +312,16 @@ type DomainAddressDIMM struct {
Base *uint64 `xml:"base,attr"`
}
+type DomainAddressISA struct {
+ Iobase *uint `xml:"iobase,attr"`
+}
+
type DomainAddress struct {
USB *DomainAddressUSB
PCI *DomainAddressPCI
Drive *DomainAddressDrive
DIMM *DomainAddressDIMM
+ ISA *DomainAddressISA
}
type DomainConsole struct {
@@ -403,6 +408,12 @@ type DomainMemBalloon struct {
Address *DomainAddress `xml:"address"`
}
+type DomainPanic struct {
+ XMLName xml.Name `xml:"panic"`
+ Model string `xml:"model,attr"`
+ Address *DomainAddress `xml:"address"`
+}
+
type DomainSoundCodec struct {
Type string `xml:"type,attr"`
}
@@ -486,6 +497,7 @@ type DomainDeviceList struct {
Videos []DomainVideo `xml:"video"`
Channels []DomainChannel `xml:"channel"`
MemBalloon *DomainMemBalloon `xml:"memballoon"`
+ Panics []DomainPanic `xml:"panic"`
Sounds []DomainSound `xml:"sound"`
RNGs []DomainRNG `xml:"rng"`
Hostdevs []DomainHostdev `xml:"hostdev"`
@@ -1058,6 +1070,16 @@ func (a *DomainAddressDIMM) MarshalXML(e *xml.Encoder, start xml.StartElement) e
return nil
}
+func (a *DomainAddressISA) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ start.Attr = append(start.Attr, xml.Attr{
+ xml.Name{Local: "type"}, "isa",
+ })
+ marshallUintAttr(&start, "iobase", a.Iobase, 16)
+ e.EncodeToken(start)
+ e.EncodeToken(start.End())
+ return nil
+}
+
func (a *DomainAddress) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if a.USB != nil {
return a.USB.MarshalXML(e, start)
@@ -1067,6 +1089,8 @@ func (a *DomainAddress) MarshalXML(e *xml.Encoder, start xml.StartElement) error
return a.Drive.MarshalXML(e, start)
} else if a.DIMM != nil {
return a.DIMM.MarshalXML(e, start)
+ } else if a.ISA != nil {
+ return a.ISA.MarshalXML(e, start)
} else {
return nil
}
@@ -1173,6 +1197,17 @@ func (a *DomainAddressDIMM) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
return nil
}
+func (a *DomainAddressISA) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ for _, attr := range start.Attr {
+ if attr.Name.Local == "iobase" {
+ if err := unmarshallUintAttr(attr.Value, &a.Iobase, 16); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}
+
func (a *DomainAddress) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
var typ string
d.Skip()
@@ -1198,6 +1233,9 @@ func (a *DomainAddress) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
} else if typ == "dimm" {
a.DIMM = &DomainAddressDIMM{}
return a.DIMM.UnmarshalXML(d, start)
+ } else if typ == "isa" {
+ a.ISA = &DomainAddressISA{}
+ return a.ISA.UnmarshalXML(d, start)
}
return nil
diff --git a/domain_test.go b/domain_test.go
index 1ad5125..31787a5 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -45,6 +45,10 @@ type DriveAddress struct {
Unit uint
}
+type ISAAddress struct {
+ Iobase uint
+}
+
var uhciIndex uint = 0
var uhciAddr = PCIAddress{0, 0, 1, 2}
@@ -53,6 +57,7 @@ var ifaceAddr = PCIAddress{0, 0, 4, 0}
var videoAddr = PCIAddress{0, 0, 5, 0}
var fsAddr = PCIAddress{0, 0, 6, 0}
var balloonAddr = PCIAddress{0, 0, 7, 0}
+var panicAddr = ISAAddress{0x505}
var duplexAddr = PCIAddress{0, 0, 8, 0}
var hostdevSCSI = DriveAddress{0, 0, 3, 0}
@@ -303,6 +308,19 @@ var domainTestData = []struct {
},
},
},
+ Panics: []DomainPanic{
+ DomainPanic{
+ Model: "hyperv",
+ },
+ DomainPanic{
+ Model: "isa",
+ Address: &DomainAddress{
+ ISA: &DomainAddressISA{
+ Iobase: &panicAddr.Iobase,
+ },
+ },
+ },
+ },
Consoles: []DomainConsole{
DomainConsole{
Type: "pty",
@@ -433,6 +451,10 @@ var domainTestData = []struct {
` <memballoon model="virtio">`,
` <address type="pci" domain="0x0" bus="0x0" slot="0x7" function="0x0"></address>`,
` </memballoon>`,
+ ` <panic model="hyperv"></panic>`,
+ ` <panic model="isa">`,
+ ` <address type="isa" iobase="0x505"></address>`,
+ ` </panic>`,
` <sound model="ich6">`,
` <codec type="duplex"></codec>`,
` <address type="pci" domain="0x0" bus="0x0" slot="0x8" function="0x0"></address>`,
@@ -1725,9 +1747,9 @@ var domainTestData = []struct {
/* Host Bootloader -- bhyve, Xen */
{
Object: &Domain{
- Type: "bhyve",
- Name: "test",
- Bootloader: "/usr/local/sbin/grub-bhyve",
+ Type: "bhyve",
+ Name: "test",
+ Bootloader: "/usr/local/sbin/grub-bhyve",
BootloaderArgs: "-r cd0 -m /tmp/test-device.map -M 1024M linuxguest",
},
Expected: []string{
--
2.7.4
7 years
[libvirt] PATCH go-xml : add virtualport support
by Karol Czeryna
Hi guys!
Working with terraform libvirt plugin I discovered lack of openvswitch support - but in libvirt-go there is no support for virtualport entry.. this patch adds virtualport support.
diff --git a/network.go b/network.go
index 10c4dfc..0f072ec 100644
--- a/network.go
+++ b/network.go
@@ -36,6 +36,16 @@ type NetworkBridge struct {
MACTableManager string `xml:"macTableManager,attr,omitempty"`
}
+type VirtualPortParameters struct {
+ InterfaceID string `xml:"interfaceid,attr,omitempty"`
+ ProfileID string `xml:"profileid,attr,omitempty"`
+}
+
+type VirtualPort struct {
+ Type string `xml:"type,attr,omitempty"`
+ Parameters []VirtualPortParameters `xml:"parameters,omitempty"`
+}
+
type NetworkDomain struct {
Name string `xml:"name,attr,omitempty"`
LocalOnly string `xml:"localOnly,attr,omitempty"`
@@ -152,6 +162,7 @@ type Network struct {
UUID string `xml:"uuid,omitempty"`
MAC *NetworkMAC `xml:"mac"`
Bridge *NetworkBridge `xml:"bridge"`
+ VirtualPort *VirtualPort `xml:"virtualport"`
Forward *NetworkForward `xml:"forward"`
Domain *NetworkDomain `xml:"domain"`
IPs []NetworkIP `xml:"ip"`
diff --git a/network_test.go b/network_test.go
index 3efb278..10cce66 100644
--- a/network_test.go
+++ b/network_test.go
@@ -65,6 +65,14 @@ var networkTestData = []struct {
Bridge: &NetworkBridge{
Name: "virbr0",
},
+ VirtualPort: &VirtualPort{
+ Type: "openvswitch",
+ Parameters: []VirtualPortParameters{
+ VirtualPortParameters{
+ InterfaceID: "09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f",
+ },
+ },
+ },
Forward: &NetworkForward{
Mode: "nat",
NAT: &NetworkForwardNAT{
@@ -175,6 +183,9 @@ var networkTestData = []struct {
`<network>`,
` <name>test</name>`,
` <bridge name="virbr0"></bridge>`,
+ ` <virtualport type="openvswitch">`,
+ ` <parameters interfaceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"></parameters>`,
+ ` </virtualport>`,
` <forward mode="nat">`,
` <nat>`,
` <address start="1.2.3.4" end="1.2.3.10"></address>`,
Best,
Karol
7 years
[libvirt] [PATCH go-xml] Support network backed serial interfaces
by Jeroen Simonetti
Adds network backing for a DomainChardevSource and
protocol selection for serial device of type tcp.
Signed-off-by: Jeroen Simonetti <jeroen(a)simonetti.nl>
---
domain.go | 26 +++++++++++++++++---------
domain_test.go | 26 +++++++++++++++++++++++---
2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/domain.go b/domain.go
index f4ef35c..47e9dc6 100644
--- a/domain.go
+++ b/domain.go
@@ -256,9 +256,12 @@ type DomainInterface struct {
}
type DomainChardevSource struct {
- Mode string `xml:"mode,attr,omitempty"`
- Path string `xml:"path,attr"`
- Append string `xml:"append,attr,omitempty"`
+ Mode string `xml:"mode,attr,omitempty"`
+ Path string `xml:"path,attr,omitempty"`
+ Append string `xml:"append,attr,omitempty"`
+ Host string `xml:"host,attr,omitempty"`
+ Service string `xml:"service,attr,omitempty"`
+ TLS string `xml:"tls,attr,omitempty"`
}
type DomainChardevTarget struct {
@@ -329,12 +332,17 @@ type DomainConsole struct {
}
type DomainSerial struct {
- XMLName xml.Name `xml:"serial"`
- Type string `xml:"type,attr"`
- Source *DomainChardevSource `xml:"source"`
- Target *DomainSerialTarget `xml:"target"`
- Alias *DomainAlias `xml:"alias"`
- Address *DomainAddress `xml:"address"`
+ XMLName xml.Name `xml:"serial"`
+ Type string `xml:"type,attr"`
+ Source *DomainChardevSource `xml:"source"`
+ Protocol *DomainSerialProtocol `xml:"protocol"`
+ Target *DomainSerialTarget `xml:"target"`
+ Alias *DomainAlias `xml:"alias"`
+ Address *DomainAddress `xml:"address"`
+}
+
+type DomainSerialProtocol struct {
+ Type string `xml:"type,attr"`
}
type DomainChannel struct {
diff --git a/domain_test.go b/domain_test.go
index 1ad5125..99d5022 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -330,6 +330,21 @@ var domainTestData = []struct {
Port: &serialPort,
},
},
+ DomainSerial{
+ Type: "tcp",
+ Source: &DomainChardevSource{
+ Mode: "bind",
+ Host: "127.0.0.1",
+ Service: "1234",
+ TLS: "yes",
+ },
+ Protocol: &DomainSerialProtocol{
+ Type: "telnet",
+ },
+ Target: &DomainSerialTarget{
+ Port: &serialPort,
+ },
+ },
},
Channels: []DomainChannel{
DomainChannel{
@@ -415,6 +430,11 @@ var domainTestData = []struct {
` <source path="/tmp/serial.log" append="off"></source>`,
` <target port="0"></target>`,
` </serial>`,
+ ` <serial type="tcp">`,
+ ` <source mode="bind" host="127.0.0.1" service="1234" tls="yes"></source>`,
+ ` <protocol type="telnet"></protocol>`,
+ ` <target port="0"></target>`,
+ ` </serial>`,
` <console type="pty">`,
` <target type="virtio" port="0"></target>`,
` </console>`,
@@ -1725,9 +1745,9 @@ var domainTestData = []struct {
/* Host Bootloader -- bhyve, Xen */
{
Object: &Domain{
- Type: "bhyve",
- Name: "test",
- Bootloader: "/usr/local/sbin/grub-bhyve",
+ Type: "bhyve",
+ Name: "test",
+ Bootloader: "/usr/local/sbin/grub-bhyve",
BootloaderArgs: "-r cd0 -m /tmp/test-device.map -M 1024M linuxguest",
},
Expected: []string{
--
2.15.0
7 years
[libvirt] [PATCH] virsh: fixing wrong datatype of 'set-lifcycle-action' command options.
by Julio Faracco
The 'set-lifcycle-action' is throwing a weird error after executing it with
the '--help' option. The command output is showing the options 'type' and
'action' are as optional, but they aren't. Both are required.
virsh # set-lifecycle-action --help
...
SYNOPSIS
set-lifecycle-action <domain> [--type <string>] [--action <string>] ...
...
OPTIONS
[--domain] <string> domain name, id or uuid
error: internal error: bad options in command: 'set-lifecycle-action'
After applying this patch, both arguments are required now.
virsh # set-lifecycle-action --help
...
SYNOPSIS
set-lifecycle-action <domain> <type> <action> [--config] ...
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1509870
Signed-off-by: Julio Faracco <jcfaracco(a)gmail.com>
---
tools/virsh-domain.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 42d5526..bf96f2e 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -5532,12 +5532,12 @@ static const vshCmdInfo info_setLifecycleAction[] = {
static const vshCmdOptDef opts_setLifecycleAction[] = {
VIRSH_COMMON_OPT_DOMAIN_FULL,
{.name = "type",
- .type = VSH_OT_STRING,
+ .type = VSH_OT_DATA,
.flags = VSH_OFLAG_REQ,
.help = N_("lifecycle type to modify")
},
{.name = "action",
- .type = VSH_OT_STRING,
+ .type = VSH_OT_DATA,
.flags = VSH_OFLAG_REQ,
.help = N_("lifecycle action to set")
},
--
2.7.4
7 years
[libvirt] [PATCH] qemu: don't goto cleanup when qemuDomainRemoveDevice failed at function qemuProcessUpdateDevices
by xinhua.Cao
Function qemuProcessUpdateDevices was called at qemuProcessReconnect
when we detach net device lively and killed libvirtd service at middle.
qemu detached the device but libvirtd don't save it at runDir. when
libvirtd restart, libvirtd will detach net device but qemu will return
fail because device was not found. then libvirtd qemuProcessReconnect
failed and goto error. libvirtd kill qemu. To avoid qemu is killed by
libvirtd, qemuDomainRemoveDevice will not return failed.
---
src/qemu/qemu_process.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 6d242b1..9f9393b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3234,7 +3234,7 @@ qemuProcessUpdateDevices(virQEMUDriverPtr driver,
if (!virStringListHasString(qemuDevices, *tmp) &&
virDomainDefFindDevice(vm->def, *tmp, &dev, false) == 0 &&
qemuDomainRemoveDevice(driver, vm, &dev) < 0) {
- goto cleanup;
+ VIR_WARN("failed to remove device %s at reconnect process", *tmp);
}
tmp++;
}
--
2.8.3
7 years
[libvirt] [PATCH 0/2] Add 'l2-cache-size' property to specify maximum size of the L2 table cache for qcow2 image
by Lin Ma
Lin Ma (2):
caps: Add capability for maximum size of the qcow2 L2 table cache
qemu: Add support for 'l2-cache-size' property of qcow2
docs/formatdomain.html.in | 11 +++++++
docs/schemas/domaincommon.rng | 5 ++++
src/conf/domain_conf.c | 11 +++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_capabilities.c | 5 ++++
src/qemu/qemu_capabilities.h | 1 +
src/qemu/qemu_command.c | 18 ++++++++++++
.../caps_2.10.0-gicv2.aarch64.xml | 1 +
.../caps_2.10.0-gicv3.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml | 1 +
.../caps_2.6.0-gicv2.aarch64.xml | 1 +
.../caps_2.6.0-gicv3.aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml | 1 +
tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml | 1 +
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 1 +
.../qemuxml2argv-disk-drive-l2-cache-size.args | 24 +++++++++++++++
.../qemuxml2argv-disk-drive-l2-cache-size.xml | 34 ++++++++++++++++++++++
tests/qemuxml2argvtest.c | 2 ++
.../qemuxml2xmlout-disk-drive-l2-cache-size.xml | 34 ++++++++++++++++++++++
tests/qemuxml2xmltest.c | 1 +
29 files changed, 164 insertions(+)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-l2-cache-size.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-drive-l2-cache-size.xml
create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-disk-drive-l2-cache-size.xml
--
2.9.2
7 years
[libvirt] [PATCH] qemuBuildDeviceAddressStr: Prefer default alias for PCI bus
by Michal Privoznik
https://bugzilla.redhat.com/show_bug.cgi?id=1434451
Just like in 9324f67a572f9b32 we need to put default pci-root
alias onto the command line instead of the one provided by user.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_command.c | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index eb72db33b..affad43e1 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -318,16 +318,25 @@ qemuBuildDeviceAddressStr(virBufferPtr buf,
if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI &&
cont->idx == info->addr.pci.bus) {
- contAlias = cont->info.alias;
contIsPHB = virDomainControllerIsPSeriesPHB(cont);
contTargetIndex = cont->opts.pciopts.targetIndex;
- if (!contAlias) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("Device alias was not set for PCI "
- "controller with index %u required "
- "for device at address %s"),
- info->addr.pci.bus, devStr);
- goto cleanup;
+
+ /* When domain has builtin pci-root controller we don't put it
+ * onto cmd line. Therefore we can't set its alias. In that
+ * case, use the default one. */
+ if (!qemuDomainIsPSeries(domainDef) &&
+ cont->model == VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT) {
+ contAlias = "pci.0";
+ } else {
+ contAlias = cont->info.alias;
+ if (!contAlias) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Device alias was not set for PCI "
+ "controller with index %u required "
+ "for device at address %s"),
+ info->addr.pci.bus, devStr);
+ goto cleanup;
+ }
}
break;
}
--
2.13.6
7 years