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@xxxxxxxxxx> --- src/qemu/qemu_domain.c | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1b0279b..0ef593c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2264,6 +2264,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, @@ -2345,21 +2368,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 && @@ -3174,7 +3184,8 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, virDomainControllerDefFree(usb); } - + for (i = 0; i < def->nchannels; i++) + qemuDomainChrDefDropDefaultPath(def->channels[i], driver); } format: -- 2.9.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list