
Of course: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 4b60839..edf7433 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -40,6 +40,8 @@ #include "qemu_cgroup.h" #include "locking/domain_lock.h" #include "network/bridge_driver.h" +#include "util/virnetdev.h" +#include "util/virnetdevbridge.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -1163,6 +1165,44 @@ static virDomainNetDefPtr qemuDomainFindNet(virDomainObjPtr vm, return NULL; } +int qemuDomainChangeNetBridge(virDomainNetDefPtr olddev, + virDomainNetDefPtr newdev) +{ + const char *oldbridge = olddev->data.bridge.brname; + const char *newbridge = newdev->data.bridge.brname; + + VIR_DEBUG("Change bridge for interface %s: %s -> %s", + olddev->ifname, oldbridge, newbridge); + + if (!virNetDevExists(newbridge)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("unable to remove port from bridge")); + return -1; + } + + if (oldbridge&& + virNetDevBridgeRemovePort(oldbridge, olddev->ifname)< 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + _("unable to remove port from bridge %s"), oldbridge); + return -1; + } + if (virNetDevBridgeAddPort(newbridge, newdev->ifname)< 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + _("unable to add port to bridge %s"), newbridge); + if (virNetDevBridgeAddPort(oldbridge, olddev->ifname)< 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + _("unable to recover former state by adding port to bridge %s"), oldbridge); + VIR_FREE(olddev->data.bridge.brname); + } + return -1; + } + VIR_FREE(olddev->data.bridge.brname); + olddev->data.bridge.brname = newdev->data.bridge.brname; + newdev->data.bridge.brname = NULL; + return 0; +} + + int qemuDomainChangeNetLinkState(struct qemud_driver *driver, virDomainObjPtr vm, virDomainNetDefPtr dev, @@ -1293,6 +1333,13 @@ int qemuDomainChangeNet(struct qemud_driver *driver, return -1; } + if (olddev->type == VIR_DOMAIN_NET_TYPE_BRIDGE +&& dev->type == VIR_DOMAIN_NET_TYPE_BRIDGE +&& STRNEQ_NULLABLE(olddev->data.bridge.brname, dev->data.bridge.brname)) { + if ((ret = qemuDomainChangeNetBridge(olddev, dev))< 0) + return ret; + } + if (olddev->linkstate != dev->linkstate) { if ((ret = qemuDomainChangeNetLinkState(driver, vm, olddev, dev->linkstate))< 0) return ret; diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 0310361..1e1f75c 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -80,6 +80,8 @@ int qemuDomainChangeNetLinkState(struct qemud_driver *driver, virDomainObjPtr vm, virDomainNetDefPtr dev, int linkstate); +int qemuDomainChangeNetBridge(virDomainNetDefPtr olddev, + virDomainNetDefPtr newdev); int qemuDomainDetachPciDiskDevice(struct qemud_driver *driver, virDomainObjPtr vm, virDomainDeviceDefPtr dev); On 26.01.2012 15:18, Eric Blake wrote:
I fixed the patch and added it to https://bugzilla.redhat.com/show_bug.cgi?id=784767. Thanks. It's easier to review if we don't have to click through the
On 01/26/2012 07:10 AM, Hendrik Schwartke wrote: link, so can you also send the updated patch to this list?