//
// Loop through the IO workers shutting them down in two stages.
// First, clear AFS_WORKER_PROCESS_REQUESTS so that workers
- // stop processing requests. Second, call AFSShutdownWorkerThread()
+ // stop processing requests. Second, call AFSShutdownIOWorkerThread()
// to wake the workers and wait for them to exit.
//
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSWorkQueueContext *pWorker = &VolumeCB->VolumeWorkerContext;
+ AFSWorkQueueContext *pWorker = &VolumeCB->NonPagedVcb->VolumeWorkerContext;
HANDLE hThread;
AFSDeviceExt *pControlDeviceExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
PKSTART_ROUTINE pStartRoutine = NULL;
__Enter
{
- if( VolumeCB == AFSGlobalRoot)
+ if ( VolumeCB != AFSGlobalRoot)
{
- pStartRoutine = AFSPrimaryVolumeWorkerThread;
+ return STATUS_INVALID_PARAMETER;
}
- else
- {
- pStartRoutine = AFSVolumeWorkerThread;
- }
+ pStartRoutine = AFSPrimaryVolumeWorkerThread;
//
// Initialize the worker thread
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSWorkQueueContext *pWorker = &VolumeCB->VolumeWorkerContext;
+ AFSWorkQueueContext *pWorker = &VolumeCB->NonPagedVcb->VolumeWorkerContext;
- if( pWorker->WorkerThreadObject != NULL &&
- BooleanFlagOn( pWorker->State, AFS_WORKER_INITIALIZED))
- {
+ //
+ // Clear the 'keep processing' flag
+ //
- //
- // Clear the 'keep processing' flag
- //
+ ClearFlag( pWorker->State, AFS_WORKER_PROCESS_REQUESTS);
- ClearFlag( pWorker->State, AFS_WORKER_PROCESS_REQUESTS);
+ if( pWorker->WorkerThreadObject != NULL)
+ {
+ while ( BooleanFlagOn( pWorker->State, AFS_WORKER_INITIALIZED) )
+ {
- ntStatus = KeWaitForSingleObject( pWorker->WorkerThreadObject,
- Executive,
- KernelMode,
- FALSE,
- NULL);
+ ntStatus = KeWaitForSingleObject( pWorker->WorkerThreadObject,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
ObDereferenceObject( pWorker->WorkerThreadObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
- if( PoolContext->WorkerThreadObject != NULL &&
- BooleanFlagOn( PoolContext->State, AFS_WORKER_INITIALIZED))
+ if( PoolContext->WorkerThreadObject != NULL)
{
- //
- // Wake up the thread if it is a sleep
- //
+ while ( BooleanFlagOn( PoolContext->State, AFS_WORKER_INITIALIZED) )
+ {
- KeSetEvent( &pDeviceExt->Specific.Library.WorkerQueueHasItems,
- 0,
- FALSE);
+ //
+ // Wake up the thread if it is a sleep
+ //
- ntStatus = KeWaitForSingleObject( PoolContext->WorkerThreadObject,
- Executive,
- KernelMode,
- FALSE,
- NULL);
+ KeSetEvent( &pDeviceExt->Specific.Library.WorkerQueueHasItems,
+ 0,
+ FALSE);
+
+ ntStatus = KeWaitForSingleObject( PoolContext->WorkerThreadObject,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
ObDereferenceObject( PoolContext->WorkerThreadObject);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSLibraryDeviceObject->DeviceExtension;
- if( PoolContext->WorkerThreadObject != NULL &&
- BooleanFlagOn( PoolContext->State, AFS_WORKER_INITIALIZED))
+ if( PoolContext->WorkerThreadObject != NULL)
{
- //
- // Wake up the thread if it is a sleep
- //
+ while ( BooleanFlagOn( PoolContext->State, AFS_WORKER_INITIALIZED) )
+ {
- KeSetEvent( &pDeviceExt->Specific.Library.IOWorkerQueueHasItems,
- 0,
- FALSE);
+ //
+ // Wake up the thread if it is a sleep
+ //
- ntStatus = KeWaitForSingleObject( PoolContext->WorkerThreadObject,
- Executive,
- KernelMode,
- FALSE,
- NULL);
+ KeSetEvent( &pDeviceExt->Specific.Library.IOWorkerQueueHasItems,
+ 0,
+ FALSE);
+
+ ntStatus = KeWaitForSingleObject( PoolContext->WorkerThreadObject,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
ObDereferenceObject( PoolContext->WorkerThreadObject);
AFSPrimaryVolumeWorkerThread( IN PVOID Context)
{
+ UNREFERENCED_PARAMETER(Context);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSWorkQueueContext *pPoolContext = (AFSWorkQueueContext *)&AFSGlobalRoot->VolumeWorkerContext;
+ AFSWorkQueueContext *pPoolContext = (AFSWorkQueueContext *)&AFSGlobalRoot->NonPagedVcb->VolumeWorkerContext;
AFSDeviceExt *pControlDeviceExt = NULL;
AFSDeviceExt *pRDRDeviceExt = NULL;
LARGE_INTEGER DueTime;
LONG TimeOut;
KTIMER Timer;
- BOOLEAN bFoundOpenEntry = FALSE;
AFSObjectInfoCB *pCurrentObject = NULL, *pNextObject = NULL, *pCurrentChildObject = NULL;
AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
BOOLEAN bReleaseVolumeLock = FALSE;
AFSVolumeCB *pVolumeCB = NULL, *pNextVolume = NULL;
AFSFcb *pFcb = NULL;
- LONG lFileType;
LARGE_INTEGER liCurrentTime;
BOOLEAN bVolumeObject = FALSE;
BOOLEAN bFcbBusy = FALSE;
if( pVolumeCB->ObjectInfoListHead == NULL &&
pVolumeCB->DirectoryCB->DirOpenReferenceCount <= 0 &&
+ pVolumeCB->DirectoryCB->NameArrayReferenceCount <= 0 &&
pVolumeCB->VolumeReferenceCount == 1 &&
( pVolumeCB->RootFcb == NULL ||
pVolumeCB->RootFcb->OpenReferenceCount == 0) &&
AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread (pioctl) AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pCurrentObject->Specific.Directory.PIOCtlDirectoryCB);
+
AFSExFreePoolWithTag( pCurrentObject->Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryVolumeWorkerThread Deleting deleted object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting deleted object %p\n",
pCurrentObject);
AFSDeleteObjectInfo( pCurrentObject);
{
if( pCurrentDirEntry->DirOpenReferenceCount > 0 ||
+ pCurrentDirEntry->NameArrayReferenceCount > 0 ||
( pCurrentDirEntry->ObjectInformation->Fcb != NULL &&
pCurrentDirEntry->ObjectInformation->Fcb->OpenReferenceCount > 0) ||
liCurrentTime.QuadPart <= pCurrentDirEntry->ObjectInformation->LastAccessCount.QuadPart ||
{
if( pCurrentDirEntry->DirOpenReferenceCount > 0 ||
+ pCurrentDirEntry->NameArrayReferenceCount > 0 ||
( pCurrentDirEntry->ObjectInformation->Fcb != NULL &&
pCurrentDirEntry->ObjectInformation->Fcb->OpenReferenceCount > 0) ||
liCurrentTime.QuadPart <= pCurrentDirEntry->ObjectInformation->LastAccessCount.QuadPart ||
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryVolumeWorkerThread Deleting DE %wZ Object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting DE %wZ Object %p\n",
&pCurrentDirEntry->NameInformation.FileName,
pCurrentChildObject);
// with an invalidation call from the service during AFSCleanupFcb
//
- lCount = AFSObjectInfoIncrement( pCurrentChildObject);
+ lCount = AFSObjectInfoIncrement( pCurrentChildObject,
+ AFS_OBJECT_REFERENCE_WORKER);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread Increment count on object %p Cnt %d\n",
+ pCurrentChildObject,
+ lCount);
if( lCount == 1 &&
pCurrentChildObject->Fcb != NULL &&
TRUE);
}
- lCount = AFSObjectInfoDecrement( pCurrentChildObject);
+ lCount = AFSObjectInfoDecrement( pCurrentChildObject,
+ AFS_OBJECT_REFERENCE_WORKER);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread Decrement1 count on object %p Cnt %d\n",
+ pCurrentChildObject,
+ lCount);
AFSAcquireExcl( &pCurrentChildObject->NonPagedInfo->ObjectInfoLock,
TRUE);
AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->NonPaged, AFS_DIR_ENTRY_NP_TAG);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread (pioctl) AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB);
+
AFSExFreePoolWithTag( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB, AFS_DIR_ENTRY_TAG);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryVolumeWorkerThread Deleting object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting object %p\n",
pCurrentChildObject);
AFSDeleteObjectInfo( pCurrentChildObject);
else if( pCurrentObject->FileType == AFS_FILE_TYPE_FILE)
{
- lCount = AFSObjectInfoIncrement( pCurrentObject);
+ lCount = AFSObjectInfoIncrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_WORKER);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread Increment2 count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount);
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
}
}
- lCount = AFSObjectInfoDecrement( pCurrentObject);
+ lCount = AFSObjectInfoDecrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_WORKER);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPrimaryVolumeWorkerThread Decrement2 count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount);
if( !AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
FALSE))
KeCancelTimer( &Timer);
+ ClearFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPrimaryVolumeWorkerThread Exiting\n");
return;
}
-void
-AFSVolumeWorkerThread( IN PVOID Context)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSVolumeCB *pVolumeCB = (AFSVolumeCB * )Context;
- AFSWorkQueueContext *pPoolContext = (AFSWorkQueueContext *)&pVolumeCB->VolumeWorkerContext;
- AFSDeviceExt *pControlDeviceExt = NULL;
- AFSDeviceExt *pRDRDeviceExt = NULL;
- BOOLEAN exitThread = FALSE;
- LARGE_INTEGER DueTime;
- LONG TimeOut;
- KTIMER Timer;
- LONG lCount;
-
- pControlDeviceExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
-
- pRDRDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
-
- //
- // Initialize the timer for the worker thread
- //
-
- DueTime.QuadPart = -(5000);
-
- TimeOut = 5000;
-
- KeInitializeTimerEx( &Timer,
- SynchronizationTimer);
-
- KeSetTimerEx( &Timer,
- DueTime,
- TimeOut,
- NULL);
-
- //
- // Indicate that we are initialized and ready
- //
-
- KeSetEvent( &pPoolContext->WorkerThreadReady,
- 0,
- FALSE);
-
- //
- // Indicate we are initialized
- //
-
- SetFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
-
- while( BooleanFlagOn( pPoolContext->State, AFS_WORKER_PROCESS_REQUESTS))
- {
-
- ntStatus = KeWaitForSingleObject( &Timer,
- Executive,
- KernelMode,
- FALSE,
- NULL);
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSVolumeWorkerThread Wait for queue items failed Status %08lX\n", ntStatus);
- }
- else
- {
-
- //
- // If we are in shutdown mode and the dirty flag is clear then get out now
- //
-
- if( BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
- {
-
- break;
- }
- }
- } // worker thread loop
-
- KeCancelTimer( &Timer);
-
- lCount = InterlockedDecrement( &pControlDeviceExt->Specific.Control.VolumeWorkerThreadCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDeviceExt->Specific.Control.VolumeWorkerCloseEvent,
- 0,
- FALSE);
- }
-
- PsTerminateSystemThread( 0);
-
- return;
-}
-
NTSTATUS
AFSInsertWorkitem( IN AFSWorkItem *WorkItem)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertWorkitem Acquiring Control QueueLock lock %08lX EXCL %08lX\n",
+ "AFSInsertWorkitem Acquiring Control QueueLock lock %p EXCL %08lX\n",
&pDevExt->Specific.Library.QueueLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertWorkitem Inserting work item %08lX Count %08lX\n",
+ "AFSInsertWorkitem Inserting work item %p Count %d\n",
WorkItem,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertIOWorkitem Acquiring Control QueueLock lock %08lX EXCL %08lX\n",
+ "AFSInsertIOWorkitem Acquiring Control QueueLock lock %p EXCL %08lX\n",
&pDevExt->Specific.Library.IOQueueLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertWorkitem Inserting IO work item %08lX Count %08lX\n",
+ "AFSInsertWorkitem Inserting IO work item %p Count %d\n",
WorkItem,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertWorkitemAtHead Acquiring Control QueueLock lock %08lX EXCL %08lX\n",
+ "AFSInsertWorkitemAtHead Acquiring Control QueueLock lock %p EXCL %08lX\n",
&pDevExt->Specific.Library.QueueLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertWorkitemAtHead Inserting work item %08lX Count %08lX\n",
+ "AFSInsertWorkitemAtHead Inserting work item %p Count %d\n",
WorkItem,
lCount);
AFSRemoveWorkItem()
{
- NTSTATUS ntStatus = STATUS_SUCCESS;
AFSWorkItem *pWorkItem = NULL;
AFSDeviceExt *pDevExt = NULL;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRemoveWorkItem Acquiring Control QueueLock lock %08lX EXCL %08lX\n",
+ "AFSRemoveWorkItem Acquiring Control QueueLock lock %p EXCL %08lX\n",
&pDevExt->Specific.Library.QueueLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRemoveWorkItem Removing work item %08lX Count %08lX Thread %08lX\n",
+ "AFSRemoveWorkItem Removing work item %p Count %d Thread %08lX\n",
pWorkItem,
lCount,
PsGetCurrentThreadId());
AFSRemoveIOWorkItem()
{
- NTSTATUS ntStatus = STATUS_SUCCESS;
AFSWorkItem *pWorkItem = NULL;
AFSDeviceExt *pDevExt = NULL;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRemoveIOWorkItem Acquiring Control QueueLock lock %08lX EXCL %08lX\n",
+ "AFSRemoveIOWorkItem Acquiring Control QueueLock lock %p EXCL %08lX\n",
&pDevExt->Specific.Library.IOQueueLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRemoveWorkItem Removing work item %08lX Count %08lX Thread %08lX\n",
+ "AFSRemoveWorkItem Removing work item %p Count %d Thread %08lX\n",
pWorkItem,
lCount,
PsGetCurrentThreadId());
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDevExt = NULL;
BOOLEAN bWait = BooleanFlagOn( WorkItem->RequestFlags, AFS_SYNCHRONOUS_REQUEST);
//
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDevExt = NULL;
BOOLEAN bWait = BooleanFlagOn( WorkItem->RequestFlags, AFS_SYNCHRONOUS_REQUEST);
//
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDevExt = NULL;
BOOLEAN bWait = BooleanFlagOn( WorkItem->RequestFlags, AFS_SYNCHRONOUS_REQUEST);
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueueFlushExtents Increment count on Fcb %08lX Cnt %d\n",
+ "AFSQueueFlushExtents Increment count on Fcb %p Cnt %d\n",
Fcb,
lCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueueFlushExtents Workitem %08lX for FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSQueueFlushExtents Workitem %p for FID %08lX-%08lX-%08lX-%08lX\n",
pWorkItem,
Fcb->ObjectInformation->FileId.Cell,
Fcb->ObjectInformation->FileId.Volume,
lCount = InterlockedDecrement( &Fcb->Specific.File.QueuedFlushCount);
- ASSERT( lCount >= 0);
+ ASSERT( lCount >= 0);
if( lCount == 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueueGlobalRootEnumeration Workitem %08lX\n",
+ "AFSQueueGlobalRootEnumeration Workitem %p\n",
pWorkItem);
ntStatus = AFSQueueWorkerRequest( pWorkItem);
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueueStartIos Queuing IO Workitem %08lX\n",
+ "AFSQueueStartIos Queuing IO Workitem %p\n",
pWorkItem);
ntStatus = AFSQueueIOWorkerRequest( pWorkItem);
AFSDbgLogMsg( AFS_SUBSYSTEM_WORKER_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSQueueInvalidateObject Workitem %08lX\n",
+ "AFSQueueInvalidateObject Workitem %p\n",
pWorkItem);
ntStatus = AFSQueueWorkerRequest( pWorkItem);