[libvirt] [PATCH v2] qemu: Remove duplicated code in qemuBuildSerialChrDeviceStr()
Laine Stump
laine at laine.org
Thu Jun 22 20:03:16 UTC 2017
On 06/22/2017 06:08 AM, Andrea Bolognani wrote:
> The call to qemuBuildDeviceAddressStr() happens no matter
> what, so we can move it to the outer possible scope inside
> the function.
>
> We can also move the call to virBufferAsprintf() after all
> the checks have been performed, where it makes more sense.
>
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>
> ---
> src/qemu/qemu_command.c | 22 +++++++---------------
> 1 file changed, 7 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index c53ab97..5118541 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -10292,14 +10292,8 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
> serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
> virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
> serial->info.alias);
> - if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
> - goto error;
> }
> } else {
> - virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
> - virDomainChrSerialTargetTypeToString(serial->targetType),
> - serial->info.alias, serial->info.alias);
> -
> switch (serial->targetType) {
> case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB:
> if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_SERIAL)) {
> @@ -10314,9 +10308,6 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
> _("usb-serial requires address of usb type"));
> goto error;
> }
> -
> - if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
> - goto error;
> break;
>
> case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA:
> @@ -10326,9 +10317,6 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
> _("isa-serial requires address of isa type"));
> goto error;
> }
> -
> - if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
> - goto error;
> break;
>
> case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI:
> @@ -10344,13 +10332,17 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
> _("pci-serial requires address of pci type"));
> goto error;
> }
> -
> - if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
> - goto error;
> break;
> }
> +
> + virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s",
> + virDomainChrSerialTargetTypeToString(serial->targetType),
> + serial->info.alias, serial->info.alias);
> }
>
> + if (qemuBuildDeviceAddressStr(&cmd, def, &serial->info, qemuCaps) < 0)
> + goto error;
> +
I haven't looked at the caller of qemuBuildSerialChrDeviceStr() with a
fine-toothed comb, but this patch does change the code a bit. In
particular, previously if qemuDomainIsPSeries(def) was true, but either
one of these was false:
serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL
serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO
then it would return an empty string in *deviceStr. But now it will
instead return an address string, without the
"spapr-vty,chardev=charBLAH" at the beginning. So can we guarantee that
the above two conditions are always true for PSeries?
I guess in both the "before" and "after" cases, the result would be a
failure (with before, we would end up with a "-device" with nothing
following it, and now we would have "-device" with an address string but
none of the preceding stuff describing the address).
(Similarly, before this patch, if serial->targetType wasn't one of
VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE(USB|ISA|PCI) then *deviceStr would
contain "(null),chardev=charBLAH,id=BLAH" with no address, but now it
will have an address as well as the nonsensical preamble. (yes, I'm
being ridiculous in this case :-P))
In the end, ACK to your patch since you haven't made the behavior any
worse (and have eliminated a bunch of duplicated code, but I do think
that either the checks on deviceType and info.type should be removed as
pointless, or that they should trigger a failure directly rather than
just creating a bad commandline.
> if (virBufferCheckError(&cmd) < 0)
> goto error;
>
>
More information about the libvir-list
mailing list