AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSWorkerThread Wait for queue items failed Status %08lX\n", ntStatus);
+
+ ntStatus = STATUS_SUCCESS;
}
else
{
pWorkItem = AFSRemoveWorkItem();
- if( pWorkItem != NULL)
+ if( pWorkItem == NULL)
+ {
+
+ ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.WorkerQueueHasItems,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
+ else
{
freeWorkItem = TRUE;
ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG);
}
+
+ ntStatus = STATUS_SUCCESS;
}
}
-
- ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.WorkerQueueHasItems,
- Executive,
- KernelMode,
- FALSE,
- NULL);
-
} // worker thread loop
ClearFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSIOWorkerThread Wait for queue items failed Status %08lX\n", ntStatus);
+
+ ntStatus = STATUS_SUCCESS;
}
else
{
pWorkItem = AFSRemoveIOWorkItem();
- if( pWorkItem != NULL)
+ if( pWorkItem == NULL)
+ {
+
+ ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.IOWorkerQueueHasItems,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
+ else
{
freeWorkItem = TRUE;
ExFreePoolWithTag( pWorkItem, AFS_WORK_ITEM_TAG);
}
+
+ ntStatus = STATUS_SUCCESS;
}
}
-
- ntStatus = KeWaitForSingleObject( &pLibraryDevExt->Specific.Library.IOWorkerQueueHasItems,
- Executive,
- KernelMode,
- FALSE,
- NULL);
-
} // worker thread loop
ClearFlag( pPoolContext->State, AFS_WORKER_INITIALIZED);
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;
continue;
}
- if( pVolumeCB->ObjectInfoListHead == NULL &&
- pVolumeCB != AFSGlobalRoot)
+ if( pVolumeCB->ObjectInfoListHead == NULL)
{
AFSReleaseResource( pVolumeCB->VolumeLock);
pVolumeCB->VolumeReferenceCount == 1 &&
( pVolumeCB->RootFcb == NULL ||
pVolumeCB->RootFcb->OpenReferenceCount == 0) &&
- pVolumeCB->ObjectInformation.ObjectReferenceCount == 0)
+ pVolumeCB->ObjectInformation.ObjectReferenceCount <= 0)
{
if( pVolumeCB->RootFcb != NULL)
//
if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DELETED) &&
- pCurrentObject->ObjectReferenceCount == 0 &&
+ pCurrentObject->ObjectReferenceCount <= 0 &&
( pCurrentObject->Fcb == NULL ||
pCurrentObject->Fcb->OpenReferenceCount == 0) &&
pCurrentObject->Specific.Directory.DirectoryNodeListHead == 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)
{
- //
- // Acquire and drop the Fcb resource to synchronize
- // with a potentially active AFSCleanup() which sets
- // the OpenReferenceCount to zero while holding the
- // resource.
- //
+ if( pCurrentObject->Fcb != NULL)
+ {
- AFSAcquireExcl( &pCurrentObject->Fcb->NPFcb->Resource,
- TRUE);
+ AFSRemoveFcb( &pCurrentObject->Fcb);
+ }
- AFSReleaseResource( &pCurrentObject->Fcb->NPFcb->Resource);
+ 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,
- "AFSPrimaryWorker Deleting deleted object %08lX\n",
- pCurrentObject);
-
- AFSDeleteObjectInfo( pCurrentObject);
-
AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
pCurrentObject = pNextObject;
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);
AFSDeleteDirEntry( pCurrentObject,
pCurrentDirEntry);
- if( pCurrentChildObject->ObjectReferenceCount == 0)
+ if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
+ pCurrentChildObject->Fcb != NULL &&
+ pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
{
- if( pCurrentChildObject->Fcb != NULL)
- {
+ //
+ // We must not hold pVolumeCB->ObjectInfoTree.TreeLock exclusive
+ // across an AFSCleanupFcb call since it can deadlock with an
+ // invalidation call from the service.
+ //
- if( pCurrentChildObject->FileType == AFS_FILE_TYPE_FILE)
- {
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
- AFSCleanupFcb( pCurrentChildObject->Fcb,
- TRUE);
- }
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
- //
- // Acquire and drop the Fcb resource to synchronize
- // with a potentially active AFSCleanup() which sets
- // the OpenReferenceCount to zero while holding the
- // resource.
- //
+ AFSCleanupFcb( pCurrentChildObject->Fcb,
+ TRUE);
- AFSAcquireExcl( &pCurrentChildObject->Fcb->NPFcb->Resource,
- TRUE);
+ AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+ }
- AFSReleaseResource( &pCurrentChildObject->Fcb->NPFcb->Resource);
+ if( pCurrentChildObject->ObjectReferenceCount <= 0 &&
+ ( pCurrentChildObject->Fcb == NULL ||
+ pCurrentChildObject->Fcb->OpenReferenceCount == 0 &&
+ pCurrentChildObject->Fcb->Specific.File.ExtentCount == 0))
+ {
- AFSRemoveFcb( pCurrentChildObject->Fcb);
+ if( pCurrentChildObject->Fcb != NULL)
+ {
+
+ AFSRemoveFcb( &pCurrentChildObject->Fcb);
}
if( pCurrentChildObject->FileType == AFS_FILE_TYPE_DIRECTORY &&
if( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb != NULL)
{
- AFSRemoveFcb( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
+ AFSRemoveFcb( &pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb);
}
AFSDeleteObjectInfo( pCurrentChildObject->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation);
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPrimaryWorker Deleting object %08lX\n",
+ "AFSPrimaryVolumeWorkerThread Deleting object %08lX\n",
pCurrentChildObject);
AFSDeleteObjectInfo( pCurrentChildObject);
}
pCurrentDirEntry = pNextDirEntry;
+
}
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->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
{
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))
- {
-
- 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);
- }
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
- AFSDeleteObjectInfo( pCurrentObject);
+ if( pCurrentObject->Fcb != NULL)
+ {
- AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
+ //
+ // Dropping the TreeLock permits the
+ // pCurrentObject->ObjectReferenceCount to change
+ //
- pCurrentObject = pNextObject;
+ AFSCleanupFcb( pCurrentObject->Fcb,
+ TRUE);
+ }
- continue;
- }
- else
- {
+ if( !AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ FALSE))
+ {
- bReleaseVolumeLock = FALSE;
+ bReleaseVolumeLock = FALSE;
- break;
- }
+ break;
}
- else if( pCurrentObject->Fcb != NULL)
- {
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ if( BooleanFlagOn( pCurrentObject->Flags, AFS_OBJECT_FLAGS_DELETED) &&
+ pCurrentObject->ObjectReferenceCount <= 0 &&
+ ( pCurrentObject->Fcb == NULL ||
+ pCurrentObject->Fcb->OpenReferenceCount == 0 &&
+ pCurrentObject->Fcb->Specific.File.ExtentCount == 0))
+ {
- if( AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
- FALSE))
+ if( pCurrentObject->Fcb != NULL)
{
- AFSCleanupFcb( pCurrentObject->Fcb,
- FALSE);
-
- AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
+ AFSRemoveFcb( &pCurrentObject->Fcb);
+ }
- pCurrentObject = pNextObject;
+ AFSDeleteObjectInfo( pCurrentObject);
+ }
- continue;
- }
- else
- {
+ AFSConvertToShared( pVolumeCB->ObjectInfoTree.TreeLock);
- bReleaseVolumeLock = FALSE;
+ pCurrentObject = pNextObject;
- break;
- }
- }
+ continue;
}
pCurrentObject = pNextObject;
pWorkItem->RequestType = AFS_WORK_FLUSH_FCB;
- RtlCopyMemory( &pWorkItem->AuthGroup,
- AuthGroup,
- sizeof( GUID));
+ if ( AuthGroup == NULL)
+ {
+
+ RtlZeroMemory( &pWorkItem->AuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &pWorkItem->AuthGroup);
+ }
+ else
+ {
+ RtlCopyMemory( &pWorkItem->AuthGroup,
+ AuthGroup,
+ sizeof( GUID));
+ }
pWorkItem->Specific.Fcb.Fcb = Fcb;
"AFSQueueFlushExtents Failed to queue request Status %08lX\n", ntStatus);
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueFlushExtents\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;
"AFSQueueAsyncRead Failed to queue request Status %08lX\n", ntStatus);
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueAsyncRead\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;
"AFSQueueAsyncWrite Failed to queue request Status %08lX\n", ntStatus);
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueAsyncWrite\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;
ntStatus);
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueGlobalRootEnumeration\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;
}
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueStartIos\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;
ntStatus);
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSQueueInvalidateObject\n");
+
+ AFSDumpTraceFilesFnc();
}
return ntStatus;