NTSTATUS SrvTreeRemoveFile( PLWIO_SRV_TREE pTree, USHORT fid ) { NTSTATUS ntStatus = 0; BOOLEAN bInLock = FALSE; PLWIO_SRV_FILE pFile = NULL; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &pTree->mutex); pFile = pTree->lruFile[ fid % SRV_LRU_CAPACITY ]; if (pFile && (pFile->fid == fid)) { pTree->lruFile[ fid % SRV_LRU_CAPACITY ] = NULL; } ntStatus = LwRtlRBTreeRemove( pTree->pFileCollection, &fid); BAIL_ON_NT_STATUS(ntStatus); pTree->ulNumOpenFiles--; cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &pTree->mutex); return ntStatus; error: goto cleanup; }
NTSTATUS SrvFinderCloseSearchSpace( IN HANDLE hFinderRepository, IN USHORT usSearchId ) { NTSTATUS ntStatus = 0; PSRV_FINDER_REPOSITORY pFinderRepository = NULL; BOOLEAN bInLock = FALSE; pFinderRepository = (PSRV_FINDER_REPOSITORY)hFinderRepository; LWIO_LOCK_MUTEX(bInLock, &pFinderRepository->mutex); ntStatus = LwRtlRBTreeRemove( pFinderRepository->pSearchSpaceCollection, &usSearchId); BAIL_ON_NT_STATUS(ntStatus); cleanup: LWIO_UNLOCK_MUTEX(bInLock, &pFinderRepository->mutex); return ntStatus; error: goto cleanup; }
NTSTATUS SrvElementsUnregisterResource( ULONG ulResourceId, /* IN */ PSRV_RESOURCE* ppResource /* OUT OPTIONAL*/ ) { NTSTATUS ntStatus = STATUS_SUCCESS; BOOLEAN bInLock = FALSE; PSRV_RESOURCE pResource = NULL; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &gSrvElements.resources.mutex); if (ppResource) { ntStatus = LwRtlRBTreeFind( gSrvElements.resources.pResources, &ulResourceId, (PVOID*)&pResource); BAIL_ON_NT_STATUS(ntStatus); } ntStatus = LwRtlRBTreeRemove( gSrvElements.resources.pResources, &ulResourceId); BAIL_ON_NT_STATUS(ntStatus); if (ppResource) { *ppResource = pResource; } cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &gSrvElements.resources.mutex); return ntStatus; error: if (ppResource) { *ppResource = NULL; } goto cleanup; }
NTSTATUS SrvTreeRemoveAsyncState( PLWIO_SRV_TREE pTree, ULONG64 ullAsyncId ) { NTSTATUS ntStatus = STATUS_SUCCESS; BOOLEAN bInLock = FALSE; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &pTree->mutex); ntStatus = LwRtlRBTreeRemove( pTree->pAsyncStateCollection, &ullAsyncId); LWIO_UNLOCK_RWMUTEX(bInLock, &pTree->mutex); return ntStatus; }
NTSTATUS SrvTree2RemoveFile( PLWIO_SRV_TREE_2 pTree, PLWIO_SRV_FILE_2 pFile ) { NTSTATUS ntStatus = 0; BOOLEAN bInLock = FALSE; PLWIO_SRV_FILE_2 pCachedFile = NULL; PSMB2_FID pFid = &pFile->fid; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &pTree->mutex); if (SrvFile2IsInParent(pFile)) { pCachedFile = pTree->lruFile[ pFid->ullVolatileId % SRV_LRU_CAPACITY ]; if (pCachedFile && (pCachedFile->fid.ullPersistentId == pFid->ullPersistentId) && (pCachedFile->fid.ullVolatileId == pFid->ullVolatileId)) { pTree->lruFile[ pFid->ullVolatileId % SRV_LRU_CAPACITY ] = NULL; } // removal automatically releases reference ntStatus = LwRtlRBTreeRemove(pTree->pFileCollection, pFid); BAIL_ON_NT_STATUS(ntStatus); SrvFile2ClearInParent(pFile); pTree->ulNumOpenFiles--; } cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &pTree->mutex); return ntStatus; error: goto cleanup; }
NTSTATUS SrvSession2RemoveTree( PLWIO_SRV_SESSION_2 pSession, ULONG ulTid ) { NTSTATUS ntStatus = 0; BOOLEAN bInLock = FALSE; PLWIO_SRV_TREE_2 pTree = NULL; LWIO_LOCK_RWMUTEX_EXCLUSIVE(bInLock, &pSession->mutex); ntStatus = SrvSession2UpdateLastActivityTime_inlock(pSession); BAIL_ON_NT_STATUS(ntStatus); pTree = pSession->lruTree[ ulTid % SRV_LRU_CAPACITY ]; if (pTree && (pTree->ulTid == ulTid)) { pSession->lruTree[ ulTid % SRV_LRU_CAPACITY ] = NULL; } ntStatus = LwRtlRBTreeRemove( pSession->pTreeCollection, &ulTid); BAIL_ON_NT_STATUS(ntStatus); cleanup: LWIO_UNLOCK_RWMUTEX(bInLock, &pSession->mutex); return ntStatus; error: goto cleanup; }