AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
BOOLEAN bReleaseVolumeLock = FALSE;
AFSVolumeCB *pVolumeCB = NULL, *pNextVolume = NULL;
+ AFSFcb *pFcb = NULL;
+ LONG lFileType;
LARGE_INTEGER liCurrentTime;
BOOLEAN bVolumeObject = FALSE;
LONG lCount;
if( pCurrentObject->Fcb != NULL)
{
- //
- // Acquire and drop the Fcb resource to synchronize
- // with a potentially active AFSCleanup() which sets
- // the OpenReferenceCount to zero while holding the
- // resource.
- //
-
- AFSAcquireExcl( &pCurrentObject->Fcb->NPFcb->Resource,
- TRUE);
-
- AFSReleaseResource( &pCurrentObject->Fcb->NPFcb->Resource);
-
AFSRemoveFcb( &pCurrentObject->Fcb);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryWorker Deleting deleted object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting deleted object %08lX\n",
pCurrentObject);
AFSDeleteObjectInfo( pCurrentObject);
pCurrentChildObject = pCurrentDirEntry->ObjectInformation;
+ pFcb = NULL;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryWorker Deleting DE %wZ Object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting DE %wZ Object %08lX\n",
&pCurrentDirEntry->NameInformation.FileName,
pCurrentChildObject);
if( pCurrentChildObject->Fcb != NULL)
{
- if( pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
- {
-
- AFSCleanupFcb( pCurrentChildObject->Fcb,
- TRUE);
- }
+ pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)&pCurrentChildObject->Fcb, NULL, (PVOID)pCurrentChildObject->Fcb);
- //
- // Acquire and drop the Fcb resource to synchronize
- // with a potentially active AFSCleanup() which sets
- // the OpenReferenceCount to zero while holding the
- // resource.
- //
-
- AFSAcquireExcl( &pCurrentChildObject->Fcb->NPFcb->Resource,
- TRUE);
-
- AFSReleaseResource( &pCurrentChildObject->Fcb->NPFcb->Resource);
-
- AFSRemoveFcb( &pCurrentChildObject->Fcb);
+ lFileType = pCurrentChildObject->FileType;
}
if( pCurrentChildObject->FileType == AFS_FILE_TYPE_DIRECTORY &&
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryWorker Deleting object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting object %08lX\n",
pCurrentChildObject);
AFSDeleteObjectInfo( pCurrentChildObject);
}
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);
+
+ AFSCleanupFcb( pFcb,
+ TRUE);
+
+ AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+ }
+
+ AFSRemoveFcb( &pFcb);
+ }
}
pCurrentObject->Specific.Directory.DirectoryNodeListHead = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryWorker Reset count to 0 on parent FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSPrimaryVolumeWorkerThread Reset count to 0 on parent FID %08lX-%08lX-%08lX-%08lX\n",
pCurrentObject->FileId.Cell,
pCurrentObject->FileId.Volume,
pCurrentObject->FileId.Vnode,
pCurrentObject->Fcb->OpenReferenceCount == 0))
{
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
- if( AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
- FALSE))
- {
-
- if( pCurrentObject->Fcb != NULL)
- {
-
- AFSCleanupFcb( pCurrentObject->Fcb,
- TRUE);
-
- //
- // Acquire and drop the Fcb resource to synchronize
- // with a potentially active AFSCleanup() which sets
- // the OpenReferenceCount to zero while holding the
- // resource.
- //
-
- AFSAcquireExcl( &pCurrentObject->Fcb->NPFcb->Resource,
- TRUE);
-
- AFSReleaseResource( &pCurrentObject->Fcb->NPFcb->Resource);
-
- AFSRemoveFcb( &pCurrentObject->Fcb);
- }
-
- AFSDeleteObjectInfo( pCurrentObject);
-
- AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
-
- pCurrentObject = pNextObject;
+ pFcb = (AFSFcb *) InterlockedCompareExchangePointer( (PVOID *)&pCurrentObject->Fcb, NULL, (PVOID)pCurrentObject->Fcb);
- continue;
- }
- else
+ if( pFcb != NULL)
{
- bReleaseVolumeLock = FALSE;
+ AFSCleanupFcb( pFcb,
+ TRUE);
- break;
+ AFSRemoveFcb( &pFcb);
}
- }
- else if( pCurrentObject->Fcb != NULL)
- {
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
FALSE))
{
- AFSCleanupFcb( pCurrentObject->Fcb,
- FALSE);
+ AFSDeleteObjectInfo( pCurrentObject);
AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
break;
}
}
+ else if( pCurrentObject->Fcb != NULL)
+ {
+
+ AFSCleanupFcb( pCurrentObject->Fcb,
+ FALSE);
+ }
}
pCurrentObject = pNextObject;