// The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
//
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ AFSObjectInfoIncrement( pObjectInfo);
ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
pDirCB);
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( pObjectInfo->ObjectReferenceCount <= 0)
{
SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
}
+
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
}
AFSReleaseResource( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
// The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSPerformObjectInvalidate( pObjectInfo,
AFS_INVALIDATE_DATA_VERSION);
// lock hierarchy.
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
if ( !NT_SUCCESS( AFSQueueInvalidateObject( pObjectInfo,
AFS_INVALIDATE_DATA_VERSION)))
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
}
}
else
if( bAllocatedFcb)
{
+ AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pObjectInfo->Fcb);
+
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
+ AFSAcquireExcl( &pParentObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pParentObject->Fcb);
+
+ AFSReleaseResource( &pParentObject->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
+ AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pObjectInfo->Fcb);
+
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
if( bAllocatedFcb)
{
+ AFSAcquireExcl( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pObjectInfo->Fcb);
+
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
+ AFSAcquireExcl( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+
+ AFSReleaseResource( &pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
// Need to tear down this Fcb since it is not in the tree for the worker thread
//
+ AFSAcquireExcl( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);
+
+ AFSReleaseResource( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
}
*Fcb = NULL;
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// A hit a very palpable hit. Pin it
//
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
pFcb->ObjectInformation = pObjectInfo;
+ AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
//
// Swap the allocated FCB into the ObjectInformation structure if it
// does not already have one.
&pObjectInfo->Fcb->NPFcb->Resource,
PsGetCurrentThread());
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
TRUE);
try_return( ntStatus = STATUS_REPARSE);
}
+ AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitFcb Initialized Fcb %08lX Name %wZ\n",
RtlZeroMemory( pNonPagedObject,
sizeof( AFSNonPagedObjectInfoCB));
+ ExInitializeResourceLite( &pNonPagedObject->ObjectInfoLock);
+
ExInitializeResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
pVolumeCB->NonPagedVcb = pNonPagedVcb;
if( pNonPagedObject != NULL)
{
- ExDeleteResourceLite( &pNonPagedObject->DirectoryNodeHdrLock);
+ ExDeleteResourceLite( &pNonPagedObject->ObjectInfoLock);
AFSExFreePoolWithTag( pNonPagedObject, AFS_NP_OBJECT_INFO_TAG);
}
if( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
{
+ AFSAcquireExcl( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+
+ AFSReleaseResource( &VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
}
AFSDeleteObjectInfo( VolumeCB->ObjectInformation.Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
if( VolumeCB->ObjectInformation.NonPagedInfo != NULL)
{
+ ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
ExDeleteResourceLite( &VolumeCB->ObjectInformation.NonPagedInfo->DirectoryNodeHdrLock);
AFSExFreePoolWithTag( VolumeCB->ObjectInformation.NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
FileName);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pObjectInfoCB != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pCurrentObject )
{
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pCurrentObject)
{
- lCount = InterlockedDecrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pNextObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pNextObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pCurrentObject )
{
- lCount = InterlockedDecrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Increment the open reference and handle on the node
//
- lCount = InterlockedIncrement( &pDirNode->ObjectInformation->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
if( ParentObjectInfo != NULL)
{
- lCount = InterlockedIncrement( &ParentObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( ParentObjectInfo);
}
//
return pObjectInfo;
}
+LONG
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo)
+{
+
+ LONG lCount;
+
+ AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount);
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+LONG
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo)
+{
+
+ LONG lCount;
+
+ AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+
+
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
{
if( ObjectInfo->ParentObjectInformation != NULL)
{
- lCount = InterlockedDecrement( &ObjectInfo->ParentObjectInformation->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation);
}
if( bAcquiredTreeLock)
AFSReleaseFid( &ObjectInfo->FileId);
}
+ ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
AFSExFreePoolWithTag( ObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
pObjectInfo = &pVolumeCB->ObjectInformation;
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
}
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
pObjectInfo = pDirectoryEntry->ObjectInformation;
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
if( pVolumeCB != NULL)
{
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
}
if( pNameArray != NULL)
if( ObjectInfo != NULL)
{
- InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
+
+ AFSObjectInfoDecrement( ObjectInfo);
}
}
AFSDeleteDirEntry( pParentObjectInfo,
pDirEntry);
+ AFSAcquireShared( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( pCurrentObject->ObjectReferenceCount <= 0)
{
ClearFlag( pCurrentObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
}
}
+
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
}
else
{
ASSERT( DirEntry->ObjectInformation->ObjectReferenceCount > 0);
- lCount = InterlockedDecrement( &DirEntry->ObjectInformation->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( DirEntry->ObjectInformation);
if( lCount <= 0)
{
AFS_TRACE_LEVEL_VERBOSE,
"AFSDeleteDirEntry Decrement count on object %08lX Cnt %d\n",
DirEntry->ObjectInformation,
- DirEntry->ObjectInformation->ObjectReferenceCount);
+ lCount);
ExDeleteResourceLite( &DirEntry->NonPaged->Lock);
pNextVolume = (AFSVolumeCB *)pVolumeCB->ListEntry.fLink;
+ AFSAcquireShared( &pVolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( pVolumeCB->ObjectInfoListHead == NULL &&
pVolumeCB->DirectoryCB->OpenReferenceCount == 0 &&
pVolumeCB->VolumeReferenceCount == 1 &&
AFSRemoveRootFcb( pVolumeCB->RootFcb);
}
+ AFSReleaseResource( &pVolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
AFSRemoveVolume( pVolumeCB);
}
else
{
+ AFSReleaseResource( &pVolumeCB->ObjectInformation.NonPagedInfo->ObjectInfoLock);
+
AFSReleaseResource( pVolumeCB->VolumeLock);
}
FALSE))
{
+ AFSAcquireExcl( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if ( pCurrentObject->ObjectReferenceCount <= 0 &&
( pCurrentObject->Fcb == NULL ||
pCurrentObject->Fcb->OpenReferenceCount == 0 &&
if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB != NULL)
{
+ AFSAcquireExcl( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+ AFSReleaseResource( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
+
AFSDeleteObjectInfo( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
ExDeleteResourceLite( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock);
AFSExFreePoolWithTag( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
}
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPrimaryVolumeWorkerThread Deleting deleted object %08lX\n",
AFSDeleteObjectInfo( pCurrentObject);
}
+ else
+ {
+
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
+ }
AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
AFSDeleteDirEntry( pCurrentObject,
pCurrentDirEntry);
+
+ //
+ // Acquire ObjectInfoLock shared here so as not to deadlock
+ // with an invalidation call from the service during AFSCleanupFcb
+ //
+
+ AFSAcquireShared( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
pCurrentChildObject->Fcb != NULL &&
pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
TRUE);
}
+ AFSReleaseResource( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock);
+
+ AFSAcquireExcl( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
( pCurrentChildObject->Fcb == NULL ||
pCurrentChildObject->Fcb->OpenReferenceCount == 0 &&
pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB != NULL)
{
+ AFSAcquireExcl( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
AFSRemoveFcb( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+ AFSReleaseResource( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
+
AFSDeleteObjectInfo( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
ExDeleteResourceLite( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock);
AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
}
+ AFSReleaseResource( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPrimaryVolumeWorkerThread Deleting object %08lX\n",
AFSDeleteObjectInfo( pCurrentChildObject);
}
+ else
+ {
+
+ AFSReleaseResource( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock);
+ }
pCurrentDirEntry = pNextDirEntry;
break;
}
+ AFSAcquireExcl( &pCurrentObject->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DELETED) &&
pCurrentObject->ObjectReferenceCount <= 0 &&
( pCurrentObject->Fcb == NULL ||
AFSRemoveFcb( &pCurrentObject->Fcb);
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
+
AFSDeleteObjectInfo( pCurrentObject);
}
+ else
+ {
+
+ AFSReleaseResource( &pCurrentObject->NonPagedInfo->ObjectInfoLock);
+ }
AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
AFSAllocateObjectInfo( IN AFSObjectInfoCB *ParentObjectInfo,
IN ULONGLONG HashIndex);
+LONG
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo);
+
+LONG
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo);
+
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo);
ERESOURCE DirectoryNodeHdrLock;
+ ERESOURCE ObjectInfoLock;
+
} AFSNonPagedObjectInfoCB;
typedef struct _AFS_OBJECT_INFORMATION_CB