try_return( ntStatus);
}
+ AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
if ( AFSIsVolumeFID( &InvalidateCB->FileID))
{
else
{
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
ullIndex,
(AFSBTreeEntry **)&pObjectInfo);
-
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
}
if( pObjectInfo != NULL)
lCount);
}
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+
if( !NT_SUCCESS( ntStatus) ||
pObjectInfo == NULL)
{
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
+
if( AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
FALSE))
{
- if( pCurrentObject->Fcb != NULL)
+ if ( pCurrentObject->ObjectReferenceCount == 0)
{
- AFSRemoveFcb( &pCurrentObject->Fcb);
- }
+ if( pCurrentObject->Fcb != NULL)
+ {
- if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB != NULL)
- {
+ AFSRemoveFcb( &pCurrentObject->Fcb);
+ }
- if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
+ if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB != NULL)
{
- AFSRemoveFcb( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
- }
+ if( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
+ {
- AFSDeleteObjectInfo( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
+ AFSRemoveFcb( &pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+ }
- ExDeleteResourceLite( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock);
+ AFSDeleteObjectInfo( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
- AFSExFreePool( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged);
+ ExDeleteResourceLite( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged->Lock);
- AFSExFreePool( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB);
- }
+ AFSExFreePool( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged);
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryVolumeWorkerThread Deleting deleted object %08lX\n",
- pCurrentObject);
+ AFSExFreePool( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB);
+ }
- AFSDeleteObjectInfo( pCurrentObject);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread Deleting deleted object %08lX\n",
+ pCurrentObject);
+
+ AFSDeleteObjectInfo( pCurrentObject);
+ }
AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
+
AFSCleanupFcb( pFcb,
TRUE);
pCurrentObject->FileId.Vnode,
pCurrentObject->FileId.Unique);
-
//
// Clear our enumerated flag on this object so we retrieve info again on next access
//
ClearFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
AFSReleaseResource( pCurrentObject->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
}
else
{
break;
}
-
- AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
}
else
{
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
+
AFSCleanupFcb( pFcb,
TRUE);
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
+
AFSCleanupFcb( pCurrentObject->Fcb,
FALSE);