AFSDeleteDirEntry( pCurrentObject,
pCurrentDirEntry);
+ if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
+ pCurrentChildObject->Fcb != NULL &&
+ pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
+ {
+
+ //
+ // We must not hold pVolumeCB->ObjectInfoTree.TreeLock exclusive
+ // across an AFSCleanupFcb call since it can deadlock with an
+ // invalidation call from the service.
+ //
+
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
+
+ AFSCleanupFcb( pCurrentChildObject->Fcb,
+ TRUE);
+
+ AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+ }
+
if( pCurrentChildObject->ObjectReferenceCount <= 0)
{
if( pCurrentChildObject->Fcb != NULL)
{
-
- pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)&pCurrentChildObject->Fcb, NULL, (PVOID)pCurrentChildObject->Fcb);
-
- lFileType = pCurrentChildObject->FileType;
+
+ AFSRemoveFcb( &pCurrentChildObject->Fcb);
}
if( pCurrentChildObject->FileType == AFS_FILE_TYPE_DIRECTORY &&
pCurrentDirEntry = pNextDirEntry;
- if ( pFcb != NULL)
- {
-
- if( lFileType == AFS_FILE_TYPE_FILE)
- {
- //
- // We must not hold pVolumeCB->ObjectInfoTree.TreeLock exclusive
- // across an AFSCleanupFcb call since it can deadlock with an
- // invalidation call from the service.
- //
-
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
- //
- // Dropping the TreeLock permits the
- // pCurrentObject->ObjectReferenceCount to change
- //
-
- AFSCleanupFcb( pFcb,
- TRUE);
-
- AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
- }
-
- AFSRemoveFcb( &pFcb);
- }
}
pCurrentObject->Specific.Directory.DirectoryNodeListHead = NULL;
else if( pCurrentObject->FileType == AFS_FILE_TYPE_FILE)
{
- if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DELETED) &&
- pCurrentObject->ObjectReferenceCount <= 0 &&
- ( pCurrentObject->Fcb == NULL ||
- pCurrentObject->Fcb->OpenReferenceCount == 0))
- {
-
- pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)&pCurrentObject->Fcb, NULL, (PVOID)pCurrentObject->Fcb);
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
- if( pFcb != NULL)
- {
+ if( pCurrentObject->Fcb != NULL)
+ {
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
- //
- // Dropping the TreeLock permits the
- // pCurrentObject->ObjectReferenceCount to change
- //
+ AFSCleanupFcb( pCurrentObject->Fcb,
+ TRUE);
+ }
- AFSCleanupFcb( pFcb,
- TRUE);
+ if( !AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ FALSE))
+ {
- AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ bReleaseVolumeLock = FALSE;
- AFSRemoveFcb( &pFcb);
- }
+ break;
+ }
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DELETED) &&
+ pCurrentObject->ObjectReferenceCount <= 0 &&
+ ( pCurrentObject->Fcb == NULL ||
+ pCurrentObject->Fcb->OpenReferenceCount == 0))
+ {
- if( AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
- FALSE))
+ if( pCurrentObject->Fcb != NULL)
{
- AFSDeleteObjectInfo( pCurrentObject);
-
- AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
-
- pCurrentObject = pNextObject;
-
- continue;
+ AFSRemoveFcb( &pCurrentObject->Fcb);
}
- else
- {
-
- bReleaseVolumeLock = FALSE;
- break;
- }
+ AFSDeleteObjectInfo( pCurrentObject);
}
- else if( pCurrentObject->Fcb != NULL)
- {
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
- //
- // Dropping the TreeLock permits the
- // pCurrentObject->ObjectReferenceCount to change
- //
+ pCurrentObject = pNextObject;
- AFSCleanupFcb( pCurrentObject->Fcb,
- FALSE);
-
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
- }
+ continue;
}
pCurrentObject = pNextObject;