[ovs-dev] [PATCH 2/3 v2] datapath-windws: fix locking code in OvsGetNetdevCmdHandler()
Nithin Raju
nithin at vmware.com
Thu Oct 30 20:14:44 UTC 2014
We were acquiring locks twice, and forgotten to release a lock in an
error case.
Signed-off-by: Nithin Raju <nithin at vmware.com>
---
datapath-windows/ovsext/Vport.c | 13 ++++++++-----
1 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index b28336b..430ae77 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -1179,6 +1179,14 @@ OvsConvertIfCountedStrToAnsiStr(PIF_COUNTED_STRING wStr,
}
+/*
+ * --------------------------------------------------------------------------
+ * Utility function that populates a 'OVS_VPORT_EXT_INFO' structure for the
+ * specified vport.
+ *
+ * Assumes that 'gOvsCtrlLock' is held.
+ * --------------------------------------------------------------------------
+ */
NTSTATUS
OvsGetExtInfoIoctl(POVS_VPORT_GET vportGet,
POVS_VPORT_EXT_INFO extInfo)
@@ -1201,7 +1209,6 @@ OvsGetExtInfoIoctl(POVS_VPORT_GET vportGet,
if (vport == NULL || (vport->ovsState != OVS_STATE_CONNECTED &&
vport->ovsState != OVS_STATE_NIC_CREATED)) {
NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
- NdisReleaseSpinLock(gOvsCtrlLock);
if (vportGet->portNo) {
OVS_LOG_WARN("vport %u does not exist any more", vportGet->portNo);
} else {
@@ -1293,7 +1300,6 @@ OvsGetNetdevCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
NL_ERROR nlError = NL_ERROR_SUCCESS;
OVS_VPORT_GET vportGet;
OVS_VPORT_EXT_INFO info;
- LOCK_STATE_EX lockState;
static const NL_POLICY ovsNetdevPolicy[] = {
[OVS_WIN_NETDEV_ATTR_NAME] = { .type = NL_A_STRING,
@@ -1327,15 +1333,12 @@ OvsGetNetdevCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
RtlCopyMemory(&vportGet.name, NlAttrGet(netdevAttrs[OVS_VPORT_ATTR_NAME]),
NlAttrGetSize(netdevAttrs[OVS_VPORT_ATTR_NAME]));
- NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0);
status = OvsGetExtInfoIoctl(&vportGet, &info);
if (status == STATUS_DEVICE_DOES_NOT_EXIST) {
nlError = NL_ERROR_NODEV;
- NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
OvsReleaseCtrlLock();
goto cleanup;
}
- NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
status = CreateNetlinkMesgForNetdev(&info, msgIn,
usrParamsCtx->outputBuffer, usrParamsCtx->outputLength,
--
1.7.4.1
More information about the dev
mailing list