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:
Jiri Denemark 2016-07-08 17:25:03 +02:00
parent b1305a6b8f
commit 08d566a0cf

View File

@ -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: