
On Tue, Mar 15, 2011 at 08:27:18PM -0600, Eric Blake wrote:
With only a single caller to these two monitor commands, I didn't need to wrap a new WithFds version, but just change the command itself.
* src/qemu/qemu_monitor.h (qemuMonitorAddNetdev) (qemuMonitorAddHostNetwork): Add parameters. * src/qemu/qemu_monitor.c (qemuMonitorAddNetdev) (qemuMonitorAddHostNetwork): Add support for fd passing. * src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Use it to simplify code. ---
v2: new patch
src/qemu/qemu_hotplug.c | 57 ++++++--------------------------------------- src/qemu/qemu_monitor.c | 59 +++++++++++++++++++++++++++++++++++++++------- src/qemu/qemu_monitor.h | 8 ++++- 3 files changed, 64 insertions(+), 60 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 87fbb9a..9d7435c 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -611,63 +611,39 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, if (tapfd != -1) { if (virAsprintf(&tapfd_name, "fd-%s", net->info.alias) < 0) goto no_memory; - - qemuDomainObjEnterMonitorWithDriver(driver, vm); - if (qemuMonitorSendFileHandle(priv->mon, tapfd_name, tapfd) < 0) { - qemuDomainObjExitMonitorWithDriver(driver, vm); - goto cleanup; - } - qemuDomainObjExitMonitorWithDriver(driver, vm); - - if (!virDomainObjIsActive(vm)) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("guest unexpectedly quit")); - goto cleanup; - } }
if (vhostfd != -1) { if (virAsprintf(&vhostfd_name, "vhostfd-%s", net->info.alias) < 0) goto no_memory; - - qemuDomainObjEnterMonitorWithDriver(driver, vm); - if (qemuMonitorSendFileHandle(priv->mon, vhostfd_name, vhostfd) < 0) { - qemuDomainObjExitMonitorWithDriver(driver, vm); - goto try_tapfd_close; - } - qemuDomainObjExitMonitorWithDriver(driver, vm); - - if (!virDomainObjIsActive(vm)) { - qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("guest unexpectedly quit")); - goto cleanup; - } }
if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { if (!(netstr = qemuBuildHostNetStr(net, ',', -1, tapfd_name, vhostfd_name))) - goto try_tapfd_close; + goto cleanup; } else { if (!(netstr = qemuBuildHostNetStr(net, ' ', vlan, tapfd_name, vhostfd_name))) - goto try_tapfd_close; + goto cleanup; }
qemuDomainObjEnterMonitorWithDriver(driver, vm); if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) && qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { - if (qemuMonitorAddNetdev(priv->mon, netstr) < 0) { + if (qemuMonitorAddNetdev(priv->mon, netstr, tapfd, tapfd_name, + vhostfd, vhostfd_name) < 0) { qemuDomainObjExitMonitorWithDriver(driver, vm); qemuAuditNet(vm, NULL, net, "attach", false); - goto try_tapfd_close; + goto cleanup; } } else { - if (qemuMonitorAddHostNetwork(priv->mon, netstr) < 0) { + if (qemuMonitorAddHostNetwork(priv->mon, netstr, tapfd, tapfd_name, + vhostfd, vhostfd_name) < 0) { qemuDomainObjExitMonitorWithDriver(driver, vm); qemuAuditNet(vm, NULL, net, "attach", false); - goto try_tapfd_close; + goto cleanup; } } qemuDomainObjExitMonitorWithDriver(driver, vm); @@ -765,23 +741,6 @@ try_remove: } goto cleanup;
-try_tapfd_close: - if (!virDomainObjIsActive(vm)) - goto cleanup; - - if (tapfd_name || vhostfd_name) { - qemuDomainObjEnterMonitorWithDriver(driver, vm); - if (tapfd_name && - qemuMonitorCloseFileHandle(priv->mon, tapfd_name) < 0) - VIR_WARN("Failed to close tapfd with '%s'", tapfd_name); - if (vhostfd_name && - qemuMonitorCloseFileHandle(priv->mon, vhostfd_name) < 0) - VIR_WARN("Failed to close vhostfd with '%s'", vhostfd_name); - qemuDomainObjExitMonitorWithDriver(driver, vm); - } - - goto cleanup; - no_memory: virReportOOMError(); goto cleanup; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 074b0b2..65bebe3 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1819,11 +1819,15 @@ int qemuMonitorCloseFileHandle(qemuMonitorPtr mon,
int qemuMonitorAddHostNetwork(qemuMonitorPtr mon, - const char *netstr) + const char *netstr, + int tapfd, const char *tapfd_name, + int vhostfd, const char *vhostfd_name) { - int ret; - VIR_DEBUG("mon=%p netstr=%s", - mon, netstr); + int ret = -1; + VIR_DEBUG("mon=%p netstr=%s tapfd=%d tapfd_name=%s " + "vhostfd=%d vhostfd_name=%s", + mon, netstr, tapfd, NULLSTR(tapfd_name), + vhostfd, NULLSTR(vhostfd_name));
if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1831,10 +1835,27 @@ int qemuMonitorAddHostNetwork(qemuMonitorPtr mon, return -1; }
+ if (tapfd >= 0 && qemuMonitorSendFileHandle(mon, tapfd_name, tapfd) < 0) + return -1; + if (vhostfd >= 0 && + qemuMonitorSendFileHandle(mon, vhostfd_name, vhostfd) < 0) { + vhostfd = -1; + goto cleanup; + } + if (mon->json) ret = qemuMonitorJSONAddHostNetwork(mon, netstr); else ret = qemuMonitorTextAddHostNetwork(mon, netstr); + +cleanup: + if (ret < 0) { + if (tapfd >= 0 && qemuMonitorCloseFileHandle(mon, tapfd_name) < 0) + VIR_WARN("failed to close device handle '%s'", tapfd_name); + if (vhostfd >= 0 && qemuMonitorCloseFileHandle(mon, vhostfd_name) < 0) + VIR_WARN("failed to close device handle '%s'", vhostfd_name); + } + return ret; }
@@ -1862,11 +1883,15 @@ int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon,
int qemuMonitorAddNetdev(qemuMonitorPtr mon, - const char *netdevstr) + const char *netdevstr, + int tapfd, const char *tapfd_name, + int vhostfd, const char *vhostfd_name) { - int ret; - VIR_DEBUG("mon=%p netdevstr=%s", - mon, netdevstr); + int ret = -1; + VIR_DEBUG("mon=%p netdevstr=%s tapfd=%d tapfd_name=%s " + "vhostfd=%d vhostfd_name=%s", + mon, netdevstr, tapfd, NULLSTR(tapfd_name), + vhostfd, NULLSTR(vhostfd_name));
if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1874,14 +1899,30 @@ int qemuMonitorAddNetdev(qemuMonitorPtr mon, return -1; }
+ if (tapfd >= 0 && qemuMonitorSendFileHandle(mon, tapfd_name, tapfd) < 0) + return -1; + if (vhostfd >= 0 && + qemuMonitorSendFileHandle(mon, vhostfd_name, vhostfd) < 0) { + vhostfd = -1; + goto cleanup; + } + if (mon->json) ret = qemuMonitorJSONAddNetdev(mon, netdevstr); else ret = qemuMonitorTextAddNetdev(mon, netdevstr); + +cleanup: + if (ret < 0) { + if (tapfd >= 0 && qemuMonitorCloseFileHandle(mon, tapfd_name) < 0) + VIR_WARN("failed to close device handle '%s'", tapfd_name); + if (vhostfd >= 0 && qemuMonitorCloseFileHandle(mon, vhostfd_name) < 0) + VIR_WARN("failed to close device handle '%s'", vhostfd_name); + } + return ret; }
- int qemuMonitorRemoveNetdev(qemuMonitorPtr mon, const char *alias) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index a20ff8e..e933af1 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -352,14 +352,18 @@ int qemuMonitorCloseFileHandle(qemuMonitorPtr mon, * sendable item here */ int qemuMonitorAddHostNetwork(qemuMonitorPtr mon, - const char *netstr); + const char *netstr, + int tapfd, const char *tapfd_name, + int vhostfd, const char *vhostfd_name);
int qemuMonitorRemoveHostNetwork(qemuMonitorPtr mon, int vlan, const char *netname);
int qemuMonitorAddNetdev(qemuMonitorPtr mon, - const char *netdevstr); + const char *netdevstr, + int tapfd, const char *tapfd_name, + int vhostfd, const char *vhostfd_name);
int qemuMonitorRemoveNetdev(qemuMonitorPtr mon, const char *alias);
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 :|