The original version of the virtualport merging patch added in a call
to virNetDevVPortProfileCheckComplete() (which might fail) after the
use count for newly allocated device was incremented. If that function
did fail, the use count would be wrong which, in the worst case, would
make that physical device unusable until libvirtd was restarted.
This followup patch (which I will squash into the original before
pushing), increases the scope of the device pointer, and delays
incrementing the use count until we are *really* assured of success.
---
src/network/bridge_driver.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 2bbfd3b..9e4f79a 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -2748,6 +2748,7 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
virNetworkDefPtr netdef;
virPortGroupDefPtr portgroup;
virNetDevVPortProfilePtr virtport = NULL;
+ virNetworkForwardIfDefPtr dev = NULL;
unsigned int num_virt_fns = 0;
char **vfname = NULL;
int ii;
@@ -2911,8 +2912,6 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
netdef->name);
goto cleanup;
} else {
- virNetworkForwardIfDefPtr dev = NULL;
-
/* pick an interface from the pool */
/* PASSTHROUGH mode, and PRIVATE Mode + 802.1Qbh both require
@@ -2995,16 +2994,18 @@ networkAllocateActualDevice(virDomainNetDefPtr iface)
virReportOOMError();
goto cleanup;
}
- /* we are now assured of success, so mark the allocation */
- dev->usageCount++;
- VIR_DEBUG("Using physical device %s, usageCount %d",
- dev->dev, dev->usageCount);
}
}
if (virNetDevVPortProfileCheckComplete(virtport) < 0)
goto cleanup;
+ if (dev) {
+ /* we are now assured of success, so mark the allocation */
+ dev->usageCount++;
+ VIR_DEBUG("Using physical device %s, usageCount %d",
+ dev->dev, dev->usageCount);
+ }
ret = 0;
cleanup:
for (ii = 0; ii < num_virt_fns; ii++)
--
1.7.11.2