[libvirt] [PATCHv2 1/3] qemu: simplify monitor fd error handling

Daniel P. Berrange berrange at redhat.com
Mon Mar 21 16:29:35 UTC 2011


On Tue, Mar 15, 2011 at 08:27:16PM -0600, Eric Blake wrote:
> qemu_monitor was already returning -1 and setting errno to EINVAL
> on any attempt to send an fd without a unix socket, but this was
> a silent failure in the case of qemuDomainAttachHostPciDevice.
> Meanwhile, qemuDomainAttachNetDevice was doing some sanity checking
> for a better error message; it's better to consolidate that to a
> central point in the API.
> 
> * src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Move sanity
> checking...
> * src/qemu/qemu_monitor.c (qemuMonitorSendFileHandle): ...into
> central location.
> Suggested by Chris Wright.
> ---
> 
> v2: new patch
> 
> Note that this changes the behavior of qemuDomainAttachHostPciDevice
> even though that function is not directly patched, but hopefully for
> the better.
> 
>  src/qemu/qemu_hotplug.c |   16 ----------------
>  src/qemu/qemu_monitor.c |   13 +++++++++++++
>  2 files changed, 13 insertions(+), 16 deletions(-)
> 
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index e4ba526..20d94e4 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -568,28 +568,12 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
> 
>      if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
>          net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> -        if (priv->monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
> -            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                            _("network device type '%s' cannot be attached: "
> -                              "qemu is not using a unix socket monitor"),
> -                            virDomainNetTypeToString(net->type));
> -            return -1;
> -        }
> -
>          if ((tapfd = qemuNetworkIfaceConnect(vm->def, conn, driver, net,
>                                               qemuCaps)) < 0)
>              return -1;
>          if (qemuOpenVhostNet(vm->def, net, qemuCaps, &vhostfd) < 0)
>              goto cleanup;
>      } else if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) {
> -        if (priv->monConfig->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
> -            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                            _("network device type '%s' cannot be attached: "
> -                            "qemu is not using a unix socket monitor"),
> -                            virDomainNetTypeToString(net->type));
> -            return -1;
> -        }
> -
>          if ((tapfd = qemuPhysIfaceConnect(vm->def, conn, driver, net,
>                                            qemuCaps,
>                                            VIR_VM_OP_CREATE)) < 0)
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index da38096..fb875fc 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -1776,6 +1776,19 @@ int qemuMonitorSendFileHandle(qemuMonitorPtr mon,
>          return -1;
>      }
> 
> +    if (fd < 0) {
> +        qemuReportError(VIR_ERR_INVALID_ARG, "%s",
> +                        _("fd must be valid"));
> +        return -1;
> +    }
> +
> +    if (!mon->hasSendFD) {
> +        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                        _("qemu is not using a unix socket monitor, "
> +                          "cannot send fd %s"), fdname);
> +        return -1;
> +    }
> +
>      if (mon->json)
>          ret = qemuMonitorJSONSendFileHandle(mon, fdname, fd);
>      else

ACK

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list