mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
qemu: Drop default channel path during migration
Migration to an older libvirt (pre v1.3.0-175-g7140807) is broken because older versions of libvirt generated different channel paths and they didn't drop the default paths when parsing domain XMLs. We'd get such a nice error message: internal error: process exited while connecting to monitor: 2016-07-08T15:28:02.665706Z qemu-kvm: -chardev socket, id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/ domain-3-nest/org.qemu.guest_agent.0,server,nowait: Failed to bind socket to /var/lib/libvirt/qemu/channel/target/domain-3-nest/ org.qemu.guest_agent.0: No such file or directory That said, we should not even format the default paths when generating a migratable XML. https://bugzilla.redhat.com/show_bug.cgi?id=1320470 Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
b1305a6b8f
commit
08d566a0cf
@ -2360,6 +2360,29 @@ qemuDomainDefaultNetModel(const virDomainDef *def,
|
||||
return "rtl8139";
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clear auto generated unix socket path, i.e., the one which starts with our
|
||||
* channel directory.
|
||||
*/
|
||||
static void
|
||||
qemuDomainChrDefDropDefaultPath(virDomainChrDefPtr chr,
|
||||
virQEMUDriverPtr driver)
|
||||
{
|
||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||
|
||||
if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
|
||||
chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO &&
|
||||
chr->source.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
|
||||
chr->source.data.nix.path &&
|
||||
STRPREFIX(chr->source.data.nix.path, cfg->channelTargetDir)) {
|
||||
VIR_FREE(chr->source.data.nix.path);
|
||||
}
|
||||
|
||||
virObjectUnref(cfg);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
|
||||
const virDomainDef *def,
|
||||
@ -2441,21 +2464,8 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
|
||||
|
||||
/* clear auto generated unix socket path for inactive definitions */
|
||||
if ((parseFlags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
|
||||
dev->type == VIR_DOMAIN_DEVICE_CHR &&
|
||||
dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
|
||||
dev->data.chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO &&
|
||||
dev->data.chr->source.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
|
||||
dev->data.chr->source.data.nix.path &&
|
||||
STRPREFIX(dev->data.chr->source.data.nix.path, cfg->channelTargetDir)) {
|
||||
/*
|
||||
* If the address is generated by us (starts with our
|
||||
* channel dir), we should not keep it in the persistent
|
||||
* XML. If libvirt is the one who generated it, users
|
||||
* shouldn't care about that. If they do, they are
|
||||
* supposed to set it themselves.
|
||||
*/
|
||||
VIR_FREE(dev->data.chr->source.data.nix.path);
|
||||
}
|
||||
dev->type == VIR_DOMAIN_DEVICE_CHR)
|
||||
qemuDomainChrDefDropDefaultPath(dev->data.chr, driver);
|
||||
|
||||
/* forbid capabilities mode hostdev in this kind of hypervisor */
|
||||
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
|
||||
@ -3270,7 +3280,8 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
|
||||
virDomainControllerDefFree(usb);
|
||||
}
|
||||
|
||||
|
||||
for (i = 0; i < def->nchannels; i++)
|
||||
qemuDomainChrDefDropDefaultPath(def->channels[i], driver);
|
||||
}
|
||||
|
||||
format:
|
||||
|
Loading…
Reference in New Issue
Block a user