2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 18:07:40 +00:00

datapath-windows: Fix locking code in OvsGetNetdevCmdHandler().

We were acquiring locks twice, and forgotten to release a lock in an
error case.

Signed-off-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Nithin Raju 2014-10-29 15:18:18 -07:00 committed by Ben Pfaff
parent 541328f171
commit 30ffab6392

View File

@ -1201,7 +1201,6 @@ OvsGetExtInfoIoctl(POVS_VPORT_GET vportGet,
if (vport == NULL || (vport->ovsState != OVS_STATE_CONNECTED && if (vport == NULL || (vport->ovsState != OVS_STATE_CONNECTED &&
vport->ovsState != OVS_STATE_NIC_CREATED)) { vport->ovsState != OVS_STATE_NIC_CREATED)) {
NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState); NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
NdisReleaseSpinLock(gOvsCtrlLock);
if (vportGet->portNo) { if (vportGet->portNo) {
OVS_LOG_WARN("vport %u does not exist any more", vportGet->portNo); OVS_LOG_WARN("vport %u does not exist any more", vportGet->portNo);
} else { } else {
@ -1293,7 +1292,6 @@ OvsGetNetdevCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
NL_ERROR nlError = NL_ERROR_SUCCESS; NL_ERROR nlError = NL_ERROR_SUCCESS;
OVS_VPORT_GET vportGet; OVS_VPORT_GET vportGet;
OVS_VPORT_EXT_INFO info; OVS_VPORT_EXT_INFO info;
LOCK_STATE_EX lockState;
static const NL_POLICY ovsNetdevPolicy[] = { static const NL_POLICY ovsNetdevPolicy[] = {
[OVS_WIN_NETDEV_ATTR_NAME] = { .type = NL_A_STRING, [OVS_WIN_NETDEV_ATTR_NAME] = { .type = NL_A_STRING,
@ -1327,15 +1325,12 @@ OvsGetNetdevCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
RtlCopyMemory(&vportGet.name, NlAttrGet(netdevAttrs[OVS_VPORT_ATTR_NAME]), RtlCopyMemory(&vportGet.name, NlAttrGet(netdevAttrs[OVS_VPORT_ATTR_NAME]),
NlAttrGetSize(netdevAttrs[OVS_VPORT_ATTR_NAME])); NlAttrGetSize(netdevAttrs[OVS_VPORT_ATTR_NAME]));
NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState, 0);
status = OvsGetExtInfoIoctl(&vportGet, &info); status = OvsGetExtInfoIoctl(&vportGet, &info);
if (status == STATUS_DEVICE_DOES_NOT_EXIST) { if (status == STATUS_DEVICE_DOES_NOT_EXIST) {
nlError = NL_ERROR_NODEV; nlError = NL_ERROR_NODEV;
NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
OvsReleaseCtrlLock(); OvsReleaseCtrlLock();
goto cleanup; goto cleanup;
} }
NdisReleaseRWLock(gOvsSwitchContext->dispatchLock, &lockState);
status = CreateNetlinkMesgForNetdev(&info, msgIn, status = CreateNetlinkMesgForNetdev(&info, msgIn,
usrParamsCtx->outputBuffer, usrParamsCtx->outputLength, usrParamsCtx->outputBuffer, usrParamsCtx->outputLength,