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);