if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_ERROR,
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n"));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
FileName));
}
+ //
+ // This reference count is either stored into the return DirectoryCB
+ // or released before function exit.
+ //
+
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_DIRENTRY);
pObjectInfoCB,
lCount));
- if( bAllocatedObjectCB)
+ if( bAllocatedObjectCB &&
+ lCount == 0)
{
- ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
-
AFSDeleteObjectInfo( &pObjectInfoCB);
}
}
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pDirNode->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
}
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
+ AFS_OBJECT_REFERENCE_PIOCTL);
AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
{
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
+ AFS_OBJECT_REFERENCE_PIOCTL);
AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
pObjectInfoCB,
lCount));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
}
}
}
AFSObjectInfoCB *pObjectInfo = NULL;
LONG lCount;
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
{
else
{
- AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- ullIndex = AFSCreateLowIndex( FileId);
-
ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
ullIndex,
(AFSBTreeEntry **)&pObjectInfo);
-
- AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
}
if ( NT_SUCCESS( ntStatus)) {
lCount));
}
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
return pObjectInfo;
}
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
-
BOOLEAN bAcquiredTreeLock = FALSE;
AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSVolumeCB * pVolume = NULL;
BOOLEAN bHeldInService;
AFSObjectInfoCB * pParentObjectInfo = NULL;
AFSFileID FileId;
LONG lCount;
- if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ __Enter
{
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ {
- //
- // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
- // embedded in the VolumeCB.
- //
-
- ASSERT( FALSE);
-
- return;
- }
+ //
+ // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+ // embedded in the VolumeCB.
+ //
- pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
- NULL,
- *ppObjectInfo);
+ ASSERT( FALSE);
- if ( pObjectInfo == NULL)
- {
+ return;
+ }
- return;
- }
+ pVolume = (*ppObjectInfo)->VolumeCB;
- ASSERT( *ppObjectInfo == NULL);
+ if( !ExIsResourceAcquiredExclusiveLite( pVolume->ObjectInfoTree.TreeLock))
+ {
- ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+ ASSERT( !ExIsResourceAcquiredLite( pVolume->ObjectInfoTree.TreeLock));
- bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+ AFSAcquireExcl( pVolume->ObjectInfoTree.TreeLock,
+ TRUE);
- if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
- {
+ bAcquiredTreeLock = TRUE;
+ }
- ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+ for ( lCount = 0; lCount < AFS_OBJECT_REFERENCE_MAX; lCount++)
+ {
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ ASSERT( (*ppObjectInfo)->ObjectReferences[ lCount] >= 0);
+ }
- bAcquiredTreeLock = TRUE;
- }
+ ASSERT( (*ppObjectInfo)->ObjectReferenceCount == 0);
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
- {
+ pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+ NULL,
+ *ppObjectInfo);
- pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
- &pObjectInfo->ParentFileId);
- }
+ if ( pObjectInfo == NULL)
+ {
- //
- // Remove it from the tree and list if it was inserted
- //
+ try_return( NOTHING);
+ }
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
- {
+ ASSERT( *ppObjectInfo == NULL);
- AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &pObjectInfo->TreeEntry);
- }
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
- {
+ pParentObjectInfo = AFSFindObjectInfo( pVolume,
+ &pObjectInfo->ParentFileId);
+ if( pParentObjectInfo != NULL)
+ {
- if( pObjectInfo->ListEntry.fLink == NULL)
- {
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
- pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+ lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
- if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ lCount));
- pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
}
- else
+
+ //
+ // Remove it from the tree and list if it was inserted
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
{
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
+ AFSRemoveHashEntry( &pVolume->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
}
- if( pObjectInfo->ListEntry.bLink == NULL)
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
{
- pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
+ if( pObjectInfo->ListEntry.fLink == NULL)
+ {
+
+ pVolume->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+
+ if( pVolume->ObjectInfoListTail != NULL)
+ {
- if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+ pVolume->ObjectInfoListTail->ListEntry.fLink = NULL;
+ }
+ }
+ else
{
- pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
}
- }
- else
- {
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
- }
- }
+ if( pObjectInfo->ListEntry.bLink == NULL)
+ {
- if( pParentObjectInfo != NULL)
- {
+ pVolume->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+ if( pVolume->ObjectInfoListHead != NULL)
+ {
- lCount = AFSObjectInfoDecrement( pParentObjectInfo,
- AFS_OBJECT_REFERENCE_CHILD);
+ pVolume->ObjectInfoListHead->ListEntry.bLink = NULL;
+ }
+ }
+ else
+ {
- AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
- pParentObjectInfo,
- lCount));
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
+ }
+ }
- AFSReleaseObjectInfo( &pParentObjectInfo);
- }
+ bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
- if( bAcquiredTreeLock)
- {
+ if( bHeldInService)
+ {
- AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
- }
+ FileId = pObjectInfo->FileId;
+ }
- if( bHeldInService)
- {
+ ASSERT( pObjectInfo->ObjectReferenceCount == 0);
- FileId = pObjectInfo->FileId;
- }
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+try_exit:
- //
- // Release the fid in the service
- //
+ if( bAcquiredTreeLock)
+ {
- if( bHeldInService)
- {
+ AFSReleaseResource( pVolume->ObjectInfoTree.TreeLock);
+ }
- AFSReleaseFid( &FileId);
+ //
+ // Release the fid in the service
+ //
+
+ if( bHeldInService)
+ {
+
+ AFSReleaseFid( &FileId);
+ }
}
return;
AFSGlobalDotDirEntry->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
AFSGlobalDotDotDirEntry->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
pDirNode->ObjectInformation,
lCount));
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);