From ca1b7cc8e4592de2ebd15f03eed83213115f811b Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Fri, 28 May 2010 13:00:58 -0400 Subject: [PATCH] macvtap: cannot support target device name Since the macvtap device needs active tear-down and the teardown logic is based on the interface name, it can happen that if for example 1 out of 3 interfaces was successfully created, that during the failure path the macvtap's target device name is used to tear down an interface that is doesn't own (owned by another VM). So, in this patch, the target interface name is reset so that there is no target interface name and the interface name is always cleared after a tear down. --- src/conf/domain_conf.c | 2 ++ src/qemu/qemu_conf.c | 1 + src/qemu/qemu_driver.c | 8 ++++++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index dfdb0d8629..312a6c0e0d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2207,6 +2207,8 @@ virDomainNetDefParseXML(virCapsPtr caps, def->data.direct.linkdev = dev; dev = NULL; + VIR_FREE(ifname); + break; case VIR_DOMAIN_NET_TYPE_USER: diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 66a949e6e4..33e6b38c5b 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1556,6 +1556,7 @@ qemudPhysIfaceConnect(virConnectPtr conn, rc = -1; delMacvtap(net->ifname, &net->data.direct.virtPortProfile); + VIR_FREE(net->ifname); } } } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ad7fb54b46..477a221ac0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3708,9 +3708,11 @@ static void qemudShutdownVMDaemon(struct qemud_driver *driver, def = vm->def; for (i = 0; i < def->nnets; i++) { virDomainNetDefPtr net = def->nets[i]; - if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) + if (net->type == VIR_DOMAIN_NET_TYPE_DIRECT) { delMacvtap(net->ifname, &net->data.direct.virtPortProfile); + VIR_FREE(net->ifname); + } } #endif @@ -8545,9 +8547,11 @@ qemudDomainDetachNetDevice(struct qemud_driver *driver, virNWFilterTearNWFilter(detach); #if WITH_MACVTAP - if (detach->type == VIR_DOMAIN_NET_TYPE_DIRECT) + if (detach->type == VIR_DOMAIN_NET_TYPE_DIRECT) { delMacvtap(detach->ifname, &detach->data.direct.virtPortProfile); + VIR_FREE(detach->ifname); + } #endif if ((driver->macFilter) && (detach->ifname != NULL)) {