qemu: Don't bother user with libvirt-internal paths

If user defines a virtio channel with UNIX socket backend and doesn't
care about the path for the socket (e.g. qemu-agent channel), we still
generate it into the persistent XML.  Moreover when then user renames
the domain, due to its persistent socket path saved into the per-domain
directory, it will not start.  So let's forget about old generated paths
and also stop putting them into the persistent definition.

https://bugzilla.redhat.com/show_bug.cgi?id=1278068

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2016-01-06 17:35:04 +01:00
parent 5f7df34611
commit 7140807917
4 changed files with 36 additions and 11 deletions

View File

@ -10510,6 +10510,23 @@ qemuBuildCommandLine(virConnectPtr conn,
goto error; goto error;
} }
/*
* TODO: Refactor so that we generate this (and onther
* things) somewhere else then where we are building the
* command line.
*/
if (channel->source.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
!channel->source.data.nix.path) {
if (virAsprintf(&channel->source.data.nix.path,
"%s/domain-%s/%s",
cfg->channelTargetDir, def->name,
channel->target.name ? channel->target.name
: "unknown.sock") < 0)
goto error;
channel->source.data.nix.listen = true;
}
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) && if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) &&
channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) { channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
/* spicevmc was originally introduced via a -device /* spicevmc was originally introduced via a -device

View File

@ -1329,20 +1329,21 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
ARCH_IS_S390(def->os.arch)) ARCH_IS_S390(def->os.arch))
dev->data.controller->model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI; dev->data.controller->model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI;
/* auto generate unix socket path */ /* clear auto generated unix socket path */
if (dev->type == VIR_DOMAIN_DEVICE_CHR && if (dev->type == VIR_DOMAIN_DEVICE_CHR &&
dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL && dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
dev->data.chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && 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.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
!dev->data.chr->source.data.nix.path) { dev->data.chr->source.data.nix.path &&
if (virAsprintf(&dev->data.chr->source.data.nix.path, STRPREFIX(dev->data.chr->source.data.nix.path, cfg->channelTargetDir)) {
"%s/domain-%s/%s", /*
cfg->channelTargetDir, def->name, * If the address is generated by us (starts with our
dev->data.chr->target.name ? dev->data.chr->target.name * channel dir), we should not keep it in the persistent
: "unknown.sock") < 0) * XML. If libvirt is the one who generated it, users
goto cleanup; * shouldn't care about that.  If they do, they are
* supposed to set it themselves.
dev->data.chr->source.data.nix.listen = true; */
VIR_FREE(dev->data.chr->source.data.nix.path);
} }
/* forbid capabilities mode hostdev in this kind of hypervisor */ /* forbid capabilities mode hostdev in this kind of hypervisor */

View File

@ -33,4 +33,7 @@ nowait \
id=channel1 \ id=channel1 \
-chardev socket,id=charchannel2,path=/tmp/domain-QEMUGuest1/ble,server,nowait \ -chardev socket,id=charchannel2,path=/tmp/domain-QEMUGuest1/ble,server,nowait \
-device virtserialport,bus=virtio-serial0.0,nr=3,chardev=charchannel2,\ -device virtserialport,bus=virtio-serial0.0,nr=3,chardev=charchannel2,\
id=channel2,name=ble id=channel2,name=ble \
-chardev socket,id=charchannel3,path=/tmp/domain-QEMUGuest1/fdsa,server,nowait \
-device virtserialport,bus=virtio-serial0.0,nr=4,chardev=charchannel3,\
id=channel3,name=fdsa

View File

@ -32,6 +32,10 @@
<channel type='unix'> <channel type='unix'>
<target type='virtio' name='ble'/> <target type='virtio' name='ble'/>
</channel> </channel>
<channel type='unix'>
<source path='/tmp/domain-oldname/fdsa'/>
<target type='virtio' name='fdsa'/>
</channel>
<memballoon model='none'/> <memballoon model='none'/>
</devices> </devices>
</domain> </domain>