[libvirt] [PATCH v2] Generate unique socket file

It's possible to have more than one unnamed virtio-serial unix channel. We need to generate a unique name for each channel. Currently, we use ".../unknown.sock" for all of them. Better practice would be to specify an explicit target path name; however, in the absence of that, we need uniqueness in the names we generate internally. Before the changes we'd get /var/lib/libvirt/qemu/channel/target/unknown.sock for each instance of <channel type='unix'> <source mode='bind'/> <target type='virtio'/> </channel> Now, we get vioser-00-00-01.sock, vioser-00-00-02.sock, etc. Changes from v1: new socket name Signed-off-by: Scott Garfinkle <seg@us.ibm.com> --- src/qemu/qemu_domain.c | 24 +++++++++++++++------- .../qemuxml2argv-channel-virtio-unix.args | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 78e75f1..7a9958d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7178,18 +7178,28 @@ int qemuDomainPrepareChannel(virDomainChrDefPtr channel, const char *domainChannelTargetDir) { - if (channel->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && - channel->source->type == VIR_DOMAIN_CHR_TYPE_UNIX && - !channel->source->data.nix.path) { + if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO || + channel->source->type != VIR_DOMAIN_CHR_TYPE_UNIX || + channel->source->data.nix.path) + return 0; + + if (channel->target.name) { if (virAsprintf(&channel->source->data.nix.path, "%s/%s", domainChannelTargetDir, - channel->target.name ? channel->target.name - : "unknown.sock") < 0) + channel->target.name) < 0) + return -1; + } else { // Generate a unique name + if (virAsprintf(&channel->source->data.nix.path, + "%s/vioser-%02d-%02d-%02d.sock", + domainChannelTargetDir, + channel->info.addr.vioserial.controller, + channel->info.addr.vioserial.bus, + channel->info.addr.vioserial.port) < 0) return -1; - - channel->source->data.nix.listen = true; } + channel->source->data.nix.listen = true; + return 0; } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args index 2b72965..8e0452a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args @@ -29,7 +29,7 @@ path=/tmp/channel/domain--1-QEMUGuest1/org.qemu.guest_agent.0,server,nowait \ -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,\ id=channel0,name=org.qemu.guest_agent.0 \ -chardev socket,id=charchannel1,\ -path=/tmp/channel/domain--1-QEMUGuest1/unknown.sock,server,nowait \ +path=/tmp/channel/domain--1-QEMUGuest1/vioser-00-00-02.sock,server,nowait \ -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel1,\ id=channel1 \ -chardev socket,id=charchannel2,path=/tmp/channel/domain--1-QEMUGuest1/ble,\ -- 1.8.3.1

On Tue, Jul 25, 2017 at 09:33:50AM -0500, Scott Garfinkle wrote:
It's possible to have more than one unnamed virtio-serial unix channel. We need to generate a unique name for each channel. Currently, we use ".../unknown.sock" for all of them. Better practice would be to specify an explicit target path name; however, in the absence of that, we need uniqueness in the names we generate internally.
Before the changes we'd get /var/lib/libvirt/qemu/channel/target/unknown.sock for each instance of <channel type='unix'> <source mode='bind'/> <target type='virtio'/> </channel>
Now, we get vioser-00-00-01.sock, vioser-00-00-02.sock, etc.
Changes from v1: new socket name
Signed-off-by: Scott Garfinkle <seg@us.ibm.com>
--- src/qemu/qemu_domain.c | 24 +++++++++++++++------- .../qemuxml2argv-channel-virtio-unix.args | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 78e75f1..7a9958d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7178,18 +7178,28 @@ int qemuDomainPrepareChannel(virDomainChrDefPtr channel, const char *domainChannelTargetDir) { - if (channel->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && - channel->source->type == VIR_DOMAIN_CHR_TYPE_UNIX && - !channel->source->data.nix.path) { + if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO || + channel->source->type != VIR_DOMAIN_CHR_TYPE_UNIX || + channel->source->data.nix.path) + return 0; +
Apart from the indentation right here, it looks fine. I'll fix this up and push it in a while. Reviewed-by: Martin Kletzander <mkletzan@redhat.com>

On Tue, Jul 25, 2017 at 09:33:50AM -0500, Scott Garfinkle wrote:
It's possible to have more than one unnamed virtio-serial unix channel. We need to generate a unique name for each channel. Currently, we use ".../unknown.sock" for all of them. Better practice would be to specify an explicit target path name; however, in the absence of that, we need uniqueness in the names we generate internally.
Before the changes we'd get /var/lib/libvirt/qemu/channel/target/unknown.sock for each instance of <channel type='unix'> <source mode='bind'/> <target type='virtio'/> </channel>
Now, we get vioser-00-00-01.sock, vioser-00-00-02.sock, etc.
Changes from v1: new socket name
Signed-off-by: Scott Garfinkle <seg@us.ibm.com>
--- src/qemu/qemu_domain.c | 24 +++++++++++++++------- .../qemuxml2argv-channel-virtio-unix.args | 2 +- 2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 78e75f1..7a9958d 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7178,18 +7178,28 @@ int qemuDomainPrepareChannel(virDomainChrDefPtr channel, const char *domainChannelTargetDir) { - if (channel->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO && - channel->source->type == VIR_DOMAIN_CHR_TYPE_UNIX && - !channel->source->data.nix.path) { + if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO || + channel->source->type != VIR_DOMAIN_CHR_TYPE_UNIX || + channel->source->data.nix.path) + return 0; + + if (channel->target.name) { if (virAsprintf(&channel->source->data.nix.path, "%s/%s", domainChannelTargetDir, - channel->target.name ? channel->target.name - : "unknown.sock") < 0) + channel->target.name) < 0) + return -1; + } else { // Generate a unique name
We don't allow this type of comment, since this patch is already pushed, I'll fix it. Pavel
+ if (virAsprintf(&channel->source->data.nix.path, + "%s/vioser-%02d-%02d-%02d.sock", + domainChannelTargetDir, + channel->info.addr.vioserial.controller, + channel->info.addr.vioserial.bus, + channel->info.addr.vioserial.port) < 0) return -1; - - channel->source->data.nix.listen = true; }
+ channel->source->data.nix.listen = true; + return 0; }
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args index 2b72965..8e0452a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-channel-virtio-unix.args @@ -29,7 +29,7 @@ path=/tmp/channel/domain--1-QEMUGuest1/org.qemu.guest_agent.0,server,nowait \ -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,\ id=channel0,name=org.qemu.guest_agent.0 \ -chardev socket,id=charchannel1,\ -path=/tmp/channel/domain--1-QEMUGuest1/unknown.sock,server,nowait \ +path=/tmp/channel/domain--1-QEMUGuest1/vioser-00-00-02.sock,server,nowait \ -device virtserialport,bus=virtio-serial0.0,nr=2,chardev=charchannel1,\ id=channel1 \ -chardev socket,id=charchannel2,path=/tmp/channel/domain--1-QEMUGuest1/ble,\ -- 1.8.3.1
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
participants (3)
-
Martin Kletzander
-
Pavel Hrdina
-
Scott Garfinkle