IN PEXCEPTION_POINTERS ExceptPtrs)
{
+ UNREFERENCED_PARAMETER(Code);
PEXCEPTION_RECORD ExceptRec;
PCONTEXT Context;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSReleaseResource Releasing lock %08lX Thread %08lX\n",
+ "AFSReleaseResource Releasing lock %p Thread %08lX\n",
Resource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSConvertToShared Converting lock %08lX Thread %08lX\n",
+ "AFSConvertToShared Converting lock %p Thread %08lX\n",
Resource,
PsGetCurrentThread());
IN ULONG Length)
{
- NTSTATUS Status = STATUS_SUCCESS;
void *pAddress = NULL;
if( Irp->MdlAddress != NULL)
void *
AFSLockUserBuffer( IN void *UserBuffer,
IN ULONG BufferLength,
- OUT MDL ** Mdl)
+ OUT MDL ** Mdl)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- void *pMappedBuffer = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
KAPC stApcState;
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
- PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSCompleteRequest( Irp,
ntStatus);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirectoryCB *pDirNode = NULL;
ULONG ulEntryLength = 0;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfoCB = NULL;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
LONG lCount;
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+ "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
pObjectInfoCB,
lCount);
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n");
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+ "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
pObjectInfoCB,
lCount);
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n");
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
AFSDirectoryCB *pDirNode = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ulEntryLength = 0;
- AFSDirEnumEntry *pDirEnumCB = NULL;
- AFSFileID stTargetFileID;
- AFSFcb *pVcb = NULL;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfoCB = NULL;
BOOLEAN bAllocatedObjectCB = FALSE;
ULONGLONG ullIndex = 0;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry initialized object %08lX Parent Object %08lX for %wZ\n",
+ "AFSInitDirEntry initialized object %p Parent Object %p for %wZ\n",
pObjectInfoCB,
ParentObjectInfo,
FileName);
}
- lCount = AFSObjectInfoIncrement( pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry Increment count on object %08lX Cnt %d\n",
+ "AFSInitDirEntry Increment count on object %p Cnt %d\n",
pObjectInfoCB,
lCount);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
if( pDirNode != NULL)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pDirNode);
+
AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
pDirNode = NULL;
if( pObjectInfoCB != NULL)
{
- lCount = AFSObjectInfoDecrement( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry Decrement count on object %08lX Cnt %d\n",
+ "AFSInitDirEntry Decrement count on object %p Cnt %d\n",
pObjectInfoCB,
lCount);
ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
}
}
}
IN AFSDirectoryCB *DirEntry)
{
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirEnumEntry *pDirEntry = NULL;
UNICODE_STRING uniTargetName;
IN AFSDirectoryCB *DirEntry)
{
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirEnumEntry *pDirEntry = NULL;
UNICODE_STRING uniTargetName;
pDirEntry->FileType == AFS_FILE_TYPE_INVALID)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSValidateSymLink Invalid type Status %08lX\n",
+ STATUS_OBJECT_NAME_NOT_FOUND);
+
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
NTSTATUS ntStatus = STATUS_SUCCESS;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
(*ppObjectInfo)->FileId.Unique,
Reason);
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
+ &(*ppObjectInfo)->ParentFileId);
+ }
+
if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
(*ppObjectInfo)->FileType == AFS_FILE_TYPE_DFSLINK ||
(*ppObjectInfo)->FileType == AFS_FILE_TYPE_MOUNTPOINT)
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
-
- if( Reason == AFS_INVALIDATE_CREDS)
+ if ( pParentObjectInfo != NULL)
{
- ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
- }
- if( Reason == AFS_INVALIDATE_DATA_VERSION ||
- Reason == AFS_INVALIDATE_FLUSHED)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
- }
- else
- {
- ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
- }
+ ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+
+ if( Reason == AFS_INVALIDATE_CREDS)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
+ }
+
+ if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+ Reason == AFS_INVALIDATE_FLUSHED)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
+ }
+ else
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ }
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_MODIFIED);
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ NULL,
+ ulFilter,
+ FILE_ACTION_MODIFIED);
+ }
try_return( ntStatus);
}
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique);
- if( (*ppObjectInfo)->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
- (*ppObjectInfo)->ParentObjectInformation->FileId.Cell,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Volume,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Vnode,
- (*ppObjectInfo)->ParentObjectInformation->FileId.Unique);
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique);
- SetFlag( (*ppObjectInfo)->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- (*ppObjectInfo)->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- (*ppObjectInfo)->ParentObjectInformation->Expiration.QuadPart = 0;
- }
+ pParentObjectInfo->Expiration.QuadPart = 0;
- if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
- }
- else
- {
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- }
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+ }
+ else
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+ }
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_REMOVED);
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ NULL,
+ ulFilter,
+ FILE_ACTION_REMOVED);
+ }
if( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
Reason)))
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique);
- AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
TRUE);
__try
SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+ AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
//
// Clear out the extents
ulFilter,
FILE_ACTION_MODIFIED);
}
- else
+ else if ( pParentObjectInfo != NULL)
{
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
NULL,
ulFilter,
FILE_ACTION_MODIFIED);
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
return ntStatus;
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFcb *pDcb = NULL, *pFcb = NULL, *pNextFcb = NULL;
AFSVolumeCB *pVolumeCB = NULL;
- AFSFcb *pTargetDcb = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
- AFSDirectoryCB *pCurrentDirEntry = NULL;
- BOOLEAN bIsChild = FALSE;
ULONGLONG ullIndex = 0;
AFSObjectInfoCB *pObjectInfo = NULL;
LONG lCount;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
+ "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
&pDevExt->Specific.RDR.VolumeTreeLock,
PsGetCurrentThread());
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Increment count on volume %08lX Cnt %d\n",
+ "AFSInvalidateCache Increment count on volume %p Cnt %d\n",
pVolumeCB,
lCount);
}
ntStatus = AFSInvalidateVolume( pVolumeCB,
InvalidateCB->Reason);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
try_return( ntStatus);
}
else
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
-
ullIndex = AFSCreateLowIndex( &InvalidateCB->FileID);
ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
// Reference the node so it won't be torn down
//
- lCount = AFSObjectInfoIncrement( pObjectInfo);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Increment count on object %08lX Cnt %d\n",
+ "AFSInvalidateCache Increment count on object %p Cnt %d\n",
pObjectInfo,
lCount);
}
if( pObjectInfo != NULL)
{
- lCount = AFSObjectInfoDecrement( pObjectInfo);
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Decrement count on object %08lX Cnt %d\n",
+ "AFSInvalidateCache Decrement count on object %p Cnt %d\n",
pObjectInfo,
lCount);
}
+
+ if ( pVolumeCB != NULL)
+ {
+
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Decrement count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
+ }
}
return ntStatus;
BOOLEAN bIsChild = FALSE;
AFSFcb *pCurrentFcb = Fcb;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
while( pCurrentFcb != NULL)
{
- if( pCurrentFcb->ObjectInformation->ParentObjectInformation == Dcb->ObjectInformation)
+ if( BooleanFlagOn( pCurrentFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pCurrentFcb->ObjectInformation->ParentFileId, &Dcb->ObjectInformation->FileId))
{
bIsChild = TRUE;
break;
}
- pCurrentFcb = pCurrentFcb->ObjectInformation->ParentObjectInformation->Fcb;
+ pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
+ &pCurrentFcb->ObjectInformation->ParentFileId);
+
+ if ( pParentObjectInfo != NULL)
+ {
+
+ pCurrentFcb = pParentObjectInfo->Fcb;
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+ else
+ {
+
+ pCurrentFcb = NULL;
+ }
}
return bIsChild;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSubstituteSysName Acquiring SysName lock %08lX SHARED %08lX\n",
+ "AFSSubstituteSysName Acquiring SysName lock %p SHARED %08lX\n",
pSysNameLock,
PsGetCurrentThread());
if( pSysName == NULL)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSSubstituteSysName No sysname %wZ Status %08lX\n",
+ &ComponentName,
+ STATUS_OBJECT_NAME_NOT_FOUND);
+
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
AFSObjectInfoCB *pCurrentObject = NULL;
AFSObjectInfoCB *pNextObject = NULL;
LONG lCount;
- AFSFcb *pFcb = NULL;
- ULONG ulFilter = 0;
__Enter
{
if ( pCurrentObject )
{
- lCount = AFSObjectInfoIncrement( pCurrentObject);
+ lCount = AFSObjectInfoIncrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pCurrentObject,
lCount);
if ( pCurrentObject)
{
- lCount = AFSObjectInfoDecrement( pCurrentObject);
+ lCount = AFSObjectInfoDecrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolumeObjects Decrement count on object %08lX Cnt %d\n",
+ "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
pCurrentObject,
lCount);
}
// Reference the node so it won't be torn down
//
- lCount = AFSObjectInfoIncrement( pCurrentObject);
+ lCount = AFSObjectInfoIncrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pCurrentObject,
lCount);
}
// Reference the node so it won't be torn down
//
- lCount = AFSObjectInfoIncrement( pNextObject);
+ lCount = AFSObjectInfoIncrement( pNextObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolumeObjects Increment count on object %08lX Cnt %d\n",
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pNextObject,
lCount);
}
if ( pCurrentObject )
{
- lCount = AFSObjectInfoDecrement( pCurrentObject);
+ lCount = AFSObjectInfoDecrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolumeObjects Decrement count on object %08lX Cnt %d\n",
+ "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
pCurrentObject,
lCount);
}
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %08lX SHARED %08lX\n",
+ "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %p SHARED %08lX\n",
&pRDRDeviceExt->Specific.RDR.VolumeListLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %08lX SHARED %08lX\n",
+ "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %p SHARED %08lX\n",
pVolumeCB->ObjectInfoTree.TreeLock,
PsGetCurrentThread());
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
}
while( pVolumeCB != NULL)
if ( pNextVolumeCB)
{
- lCount = InterlockedIncrement( &pNextVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pNextVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
}
AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Decrement count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
pVolumeCB = pNextVolumeCB;
}
case AFS_FILE_TYPE_SYMLINK:
{
- ASSERT( pDirEnumEntry->TargetNameLength > 0);
-
//
// Update the metadata for the entry
//
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique);
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
__try
SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
if ( bPurgeExtents)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->Resource,
PsGetCurrentThread());
pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
if ( pCCFileObject != NULL)
(PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
}
else
case AFS_FILE_TYPE_DIRECTORY:
{
- AFSFcb *pCurrentFcb = NULL;
- AFSDirectoryCB *pCurrentDirEntry = NULL;
-
//
// For a directory or root entry flush the content of
// the directory enumeration.
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
ULONGLONG ullIndex = 0;
AFSVolumeCB *pVolumeCB = NULL;
- AFSFcb *pFcb = NULL;
- AFSObjectInfoCB *pCurrentObject = NULL;
LONG lCount;
__Enter
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
+ "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
&pDevExt->Specific.RDR.VolumeTreeLock,
PsGetCurrentThread());
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetVolumeState Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount);
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
InterlockedOr( (LONG *)&(pVolumeCB->Flags), AFS_VOLUME_FLAGS_OFFLINE);
}
-
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- pCurrentObject = pVolumeCB->ObjectInfoListHead;;
-
- while( pCurrentObject != NULL)
- {
-
- if( VolumeStatus->Online)
- {
-
- ClearFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
-
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_VERIFY);
-
- pCurrentObject->DataVersion.QuadPart = (ULONGLONG)-1;
- }
- else
- {
-
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
- }
-
- pFcb = pCurrentObject->Fcb;
-
- if( pFcb != NULL &&
- !(VolumeStatus->Online) &&
- pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetVolumeState Marking volume offline and canceling extents Volume Cell %08lX Volume %08lX\n",
- VolumeStatus->FileID.Cell,
- VolumeStatus->FileID.Volume);
-
- //
- // Clear out the extents
- //
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Acquiring Fcb extents lock %08lX EXCL %08lX\n",
- &pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSAcquireExcl( &pFcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
-
- pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_CANCELLED;
-
- KeSetEvent( &pFcb->NPFcb->Specific.File.ExtentsRequestComplete,
- 0,
- FALSE);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Releasing Fcb extents lock %08lX EXCL %08lX\n",
- &pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource);
-
- //
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
-
- AFSTearDownFcbExtents( pFcb,
- NULL);
- }
-
- pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
- }
-
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
- }
- else
- {
-
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
}
}
AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
BOOLEAN bAcquiredLock = FALSE;
AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
- AFSFcb *pFcb = NULL;
__Enter
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %08lX for dir FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %d for dir FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfo->Specific.Directory.DirectoryNodeCount,
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
//
if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED) &&
- pCurrentDirEntry->OpenReferenceCount == 0)
+ pCurrentDirEntry->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %08lX\n",
+ "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %d\n",
pCurrentDirEntry,
- pCurrentDirEntry->OpenReferenceCount);
+ pCurrentDirEntry->DirOpenReferenceCount);
//
// We pull the short name from the parent tree since it could change below
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %08lX\n",
+ "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %d\n",
pCurrentDirEntry,
- pCurrentDirEntry->OpenReferenceCount);
+ pCurrentDirEntry->DirOpenReferenceCount);
- if( pCurrentDirEntry->OpenReferenceCount == 0)
+ if( pCurrentDirEntry->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
pObjectInfo->Links = DirEnumEntry->Links;
- if( DirEnumEntry->TargetNameLength > 0)
+ if( DirEnumEntry->TargetNameLength > 0 &&
+ ( DirEntry->NameInformation.TargetName.Length != DirEnumEntry->TargetNameLength ||
+ DirEntry->ObjectInformation->DataVersion.QuadPart != DirEnumEntry->DataVersion.QuadPart))
{
//
AFSReleaseResource( &DirEntry->NonPaged->Lock);
}
- else if( DirEntry->NameInformation.TargetName.Length > 0)
+ else if( DirEntry->NameInformation.TargetName.Length > 0 &&
+ DirEntry->ObjectInformation->DataVersion.QuadPart != DirEnumEntry->DataVersion.QuadPart)
{
AFSAcquireExcl( &DirEntry->NonPaged->Lock,
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSValidateEntry Acquiring Fcb lock %p EXCL %08lX\n",
&pCurrentFcb->NPFcb->Resource,
PsGetCurrentThread());
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ //
+ // Release Fcb->Resource to avoid Trend Micro deadlock
+ //
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
+
__try
{
SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
}
else
{
if( pObjectInfo->Fcb != NULL)
{
- FILE_OBJECT *pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+ FILE_OBJECT *pCCFileObject;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
CcSetFileSizes( pCCFileObject,
(PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
}
break;
case AFS_FILE_TYPE_DIRECTORY:
{
- AFSDirectoryCB *pCurrentDirEntry = NULL;
-
if( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
PsGetCurrentThread());
UNICODE_STRING uniShareName;
ULONG ulEntryLength = 0;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
__Enter
{
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeSpecialShareNameList (srvsvc) Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
-
- pObjectInfoCB->ObjectReferenceCount = 1;
+ "AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount);
- pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
ulEntryLength = sizeof( AFSDirectoryCB) +
uniShareName.Length;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList (srvsvc) AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeSpecialShareNameList (ipc$) Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
-
- pObjectInfoCB->ObjectReferenceCount = 1;
+ "AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount);
- pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
ulEntryLength = sizeof( AFSDirectoryCB) +
uniShareName.Length;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList (ipc$) AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
- if( pCurrentDirEntry->OpenReferenceCount == 0)
+ if( pCurrentDirEntry->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
PsGetCurrentThread());
pNameArray->LinkCount = 0;
- lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray Increment count on %wZ DE %p Cnt %d\n",
+ "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+ pNameArray,
&DirectoryCB->NameInformation.FileName,
DirectoryCB,
lCount);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSNameArrayCB *pCurrentElement = NULL;
- UNICODE_STRING uniComponentName, uniRemainingPath;
- AFSObjectInfoCB *pCurrentObject = NULL;
- ULONG ulTotalCount = 0;
- ULONG ulIndex = 0;
- USHORT usLength = 0;
LONG lCount;
__Enter
pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray Increment count on volume %wZ DE %p Cnt %d\n",
+ "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
+ NameArray,
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
- UNICODE_STRING uniComponentName, uniRemainingPath;
- AFSObjectInfoCB *pObjectInfo = NULL;
- ULONG ulTotalCount = 0;
- ULONG ulIndex = 0;
- USHORT usLength = 0;
LONG lCount;
__Enter
SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
}
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray Increment count on %wZ DE %p Cnt %d\n",
+ "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+ NameArray,
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
pCurrentElement = &NameArray->ElementArray[ lElement];
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray Decrement count on %wZ DE %p Cnt %d\n",
+ "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+ NameArray,
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
+
+ ASSERT( lCount >= 0);
}
AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
&DirectoryCB->NameInformation.FileName,
DirectoryCB->ObjectInformation->FileType);
- if( NameArray->Count == NameArray->MaxElementCount)
+ if( NameArray->Count == (LONG) NameArray->MaxElementCount)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
lCount = InterlockedIncrement( &NameArray->Count);
- lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement Increment count on %wZ DE %p Cnt %d\n",
+ "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+ NameArray,
&DirectoryCB->NameInformation.FileName,
DirectoryCB,
lCount);
+ ASSERT( lCount > 0);
+
pCurrentElement->DirectoryCB = DirectoryCB;
pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
try_return( pCurrentElement);
}
- lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry Decrement count on %wZ DE %p Cnt %d\n",
+ "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+ NameArray,
&NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
NameArray->CurrentEntry->DirectoryCB,
lCount);
+ ASSERT( lCount >= 0);
+
NameArray->CurrentEntry->DirectoryCB = NULL;
lCount = InterlockedDecrement( &NameArray->Count);
pCurrentElement = &NameArray->ElementArray[ lElement];
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray Decrement count on %wZ DE %p Cnt %d\n",
+ "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
+ NameArray,
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
+
+ ASSERT( lCount >= 0);
}
RtlZeroMemory( NameArray,
NameArray->LinkCount = 0;
- lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
+ lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray Increment count on %wZ DE %p Cnt %d\n",
+ "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
+ NameArray,
&DirectoryCB->NameInformation.FileName,
DirectoryCB,
lCount);
IN AFSVolumeCB *VolumeCB)
{
+ UNREFERENCED_PARAMETER(ProcessId);
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
}
NTSTATUS
-AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
+AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
__Enter
{
- pObjectInfoCB = AFSAllocateObjectInfo( ObjectInfo,
+ pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
0);
if( pObjectInfoCB == NULL)
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitPIOCtlDirectoryCB Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
-
- pObjectInfoCB->ObjectReferenceCount = 1;
+ "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount);
- pObjectInfoCB->FileType = AFS_FILE_TYPE_PIOCTL;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode);
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
pDirNode->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pDirNode->NameInformation.FileName,
TRUE);
- if ( InterlockedCompareExchangePointer( (PVOID *)&ObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
+ if ( InterlockedCompareExchangePointer( (PVOID *)&ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %08lX pFcb %08lX\n",
- ObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
+ "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %p pFcb %p\n",
+ ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
pDirNode);
- //
- // Increment the open reference and handle on the node
- //
-
- lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitPIOCtlDirectoryCB Increment count on Object %08lX Cnt %d\n",
- pDirNode->ObjectInformation,
- lCount);
-
try_return( ntStatus = STATUS_REPARSE);
}
if ( pDirNode != NULL)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pDirNode);
+
AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
}
if ( pObjectInfoCB != NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount);
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
}
}
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
- UNICODE_STRING uniFullPathName;
+ AFSDirEnumEntry *pDirEntry = NULL;
+ UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
// Increment the ref count on the volume and dir entry for correct processing below
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_FILE_ATTRS;
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Increment count on volume %08lX Cnt %d\n",
+ "AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
- lCount = InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&uniParsedName,
pNameArray,
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL,
- &pVolumeCB,
- &pParentDirEntry,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &NewVolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
- {
+ //
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
+ //
- //
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
- //
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
- if( pVolumeCB != NULL)
- {
+ pVolumeCB = pNewVolumeCB;
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
- lCount = InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- lCount);
- }
- else
- {
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- lCount = InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- lCount);
- }
- }
+ pParentDirEntry = pNewParentDirEntry;
- pVolumeCB = NULL;
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
try_return( ntStatus);
}
FileInfo->ChangeTime = pDirectoryEntry->ObjectInformation->ChangeTime;
- //
- // Remove the reference made above
- //
-
- lCount = InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- lCount);
-
try_exit:
if( pDirEntry != NULL)
AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
+ if( pDirectoryEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on volume %08lX Cnt %d\n",
+ "AFSRetrieveFileAttributes Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
- pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
-
- pObjectInfo->ParentObjectInformation = ParentObjectInfo;
-
if( ParentObjectInfo != NULL)
{
- lCount = AFSObjectInfoIncrement( ParentObjectInfo);
+
+ pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+
+ pObjectInfo->ParentFileId = ParentObjectInfo->FileId;
+
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ lCount = AFSObjectInfoIncrement( ParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
+ ParentObjectInfo,
+ lCount);
}
//
if( HashIndex != 0)
{
+ ASSERT( ParentObjectInfo);
+
//
// Insert the entry into the object tree and list
//
}
LONG
-AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo)
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason)
{
LONG lCount;
}
}
+ InterlockedIncrement( &ObjectInfo->ObjectReferences[ Reason]);
+
AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
return lCount;
}
LONG
-AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo)
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason)
{
- LONG lCount;
+ LONG lCount, lCount2;
AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
TRUE);
lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
}
+ lCount2 = InterlockedDecrement( &ObjectInfo->ObjectReferences[ Reason]);
+
+ ASSERT( lCount2 >= 0);
+
AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
return lCount;
}
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
+ IN AFSFileID *FileId)
+{
+ DWORD ntStatus = STATUS_SUCCESS;
+ ULONGLONG ullIndex;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+
+ if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
+ {
+
+ pObjectInfo = &VolumeCB->ObjectInformation;
+ }
+ else
+ {
+
+ AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
+
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ }
+
+ if ( NT_SUCCESS( ntStatus)) {
+
+ AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+ }
+
+ return pObjectInfo;
+}
+
+void
+AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
+{
+
+ AFSObjectInfoDecrement( *ppObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+ *ppObjectInfo = NULL;
+}
void
-AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
+AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
BOOLEAN bAcquiredTreeLock = FALSE;
+ AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo);
+ BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
+ AFSFileID FileId;
LONG lCount;
- if( !ExIsResourceAcquiredExclusiveLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
{
- ASSERT( !ExIsResourceAcquiredLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+ //
+ // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+ // embedded in the VolumeCB.
+ //
+
+ ASSERT( TRUE);
+
+ return;
+ }
+
+ ASSERT( pObjectInfo->ObjectReferenceCount == 0);
- AFSAcquireExcl( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ (*ppObjectInfo) = NULL;
+
+ if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
+ {
+
+ ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+
+ AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
TRUE);
bAcquiredTreeLock = TRUE;
}
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
//
// Remove it from the tree and list if it was inserted
//
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
{
- AFSRemoveHashEntry( &ObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &ObjectInfo->TreeEntry);
+ AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
}
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
{
- if( ObjectInfo->ListEntry.fLink == NULL)
+ if( pObjectInfo->ListEntry.fLink == NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)ObjectInfo->ListEntry.bLink;
+ pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
- if( ObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
+ if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+ pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
}
}
else
{
- ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.fLink))->ListEntry.bLink = ObjectInfo->ListEntry.bLink;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
}
- if( ObjectInfo->ListEntry.bLink == NULL)
+ if( pObjectInfo->ListEntry.bLink == NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)ObjectInfo->ListEntry.fLink;
+ pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
- if( ObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+ if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+ pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
}
}
else
{
- ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.bLink))->ListEntry.fLink = ObjectInfo->ListEntry.fLink;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
}
}
- if( ObjectInfo->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation);
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ lCount);
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
if( bAcquiredTreeLock)
{
- AFSReleaseResource( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+ AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
}
- //
- // Release the fid in the service
- //
-
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE))
+ if( bHeldInService)
{
- AFSReleaseFid( &ObjectInfo->FileId);
+ FileId = pObjectInfo->FileId;
}
- ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( ObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( ObjectInfo, AFS_OBJECT_INFO_TAG);
+ //
+ // Release the fid in the service
+ //
+
+ if( bHeldInService)
+ {
+
+ AFSReleaseFid( &FileId);
+ }
return;
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
- UNICODE_STRING uniFullPathName;
+ AFSDirEnumEntry *pDirEntry = NULL;
+ UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
pParentDirEntry = AFSGlobalRoot->DirectoryCB;
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_EVAL_ROOT;
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Increment count on volume %08lX Cnt %d\n",
+ "AFSEvaluateRootEntry Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
- lCount = InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&uniParsedName,
pNameArray,
0,
- &pVolumeCB,
- &pParentDirEntry,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &VolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
- {
+ //
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
+ //
- //
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
- //
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
- if( pVolumeCB != NULL)
- {
+ pVolumeCB = pNewVolumeCB;
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- lCount = InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- lCount);
- }
- else
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount);
- lCount = InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ pParentDirEntry = pNewParentDirEntry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- lCount);
- }
- }
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
pVolumeCB = NULL;
//
// Pass back the target dir entry for this request
+ // The caller must release the DirOpenReferenceCount
//
*TargetDirEntry = pDirectoryEntry;
+ pDirectoryEntry = NULL;
+
try_exit:
+ if( pDirectoryEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
if( pDirEntry != NULL)
{
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry2 Decrement count on volume %08lX Cnt %d\n",
+ "AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
!BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- AFSAcquireExcl( &Fcb->NPFcb->Resource,
- TRUE);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread());
+
+ AFSAcquireShared( &Fcb->NPFcb->Resource,
+ TRUE);
if( Fcb->OpenReferenceCount > 0)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
__try
{
SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread());
+
AFSReleaseResource( &Fcb->NPFcb->Resource);
//
(AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
{
- if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush))
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ if ( AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource, ForceFlush))
{
__try
ntStatus);
}
- AFSReleaseResource( &Fcb->NPFcb->Resource);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
if( Fcb->OpenReferenceCount <= 0)
{
PIRP pIrp = NULL;
KEVENT kEvent;
PIO_STACK_LOCATION pIoStackLocation = NULL;
- AFSDeviceExt *pRdrDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
DEVICE_OBJECT *pTargetDeviceObject = NULL;
FILE_OBJECT *pCacheFileObject = NULL;
IN PVOID Context)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(DeviceObject);
KEVENT *pEvent = (KEVENT *)Context;
KeSetEvent( pEvent,
IN AFSCcb *Ccb)
{
+ UNREFERENCED_PARAMETER(Fcb);
if( Ccb->FileUnwindInfo.FileAttributes != (ULONG)-1)
{
Ccb->DirectoryCB->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
pCurrentDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
}
- if( ulCount != ObjectInfo->Specific.Directory.DirectoryNodeCount)
+ if( ulCount != (ULONG) ObjectInfo->Specific.Directory.DirectoryNodeCount)
{
AFSPrint("AFSValidateDirList Count off Calc: %d Stored: %d\n",
ntStatus = AFSInitVolume( NULL,
&LibraryInit->GlobalRootFid,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT,
&AFSGlobalRoot);
if( !NT_SUCCESS( ntStatus))
"AFSInitializeLibrary AFSInitRootFcb failure %08lX\n",
ntStatus);
- lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( AFSGlobalRoot,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
+ AFSGlobalRoot,
+ lCount);
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
AFSInitVolumeWorker( AFSGlobalRoot);
- lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( AFSGlobalRoot,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
+ AFSGlobalRoot,
+ lCount);
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirectoryCB *pDirNode = NULL, *pLastDirNode = NULL;
+ LONG lCount;
__Enter
{
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
...)
{
+ UNREFERENCED_PARAMETER(Subsystem);
+ UNREFERENCED_PARAMETER(Level);
NTSTATUS ntStatus = STATUS_SUCCESS;
va_list va_args;
char chDebugBuffer[ 256];
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFcb *pFcb = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfo = NULL;
ULONGLONG ullIndex = 0;
UNICODE_STRING uniFullPathName, uniRemainingPath, uniComponentName, uniParsedName;
AFSNameArrayHdr *pNameArray = NULL;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
LONG lCount;
__Enter
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on volume %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
pObjectInfo = &pVolumeCB->ObjectInformation;
- lCount = AFSObjectInfoIncrement( pObjectInfo);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
}
else
{
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
-
ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
// Reference the node so it won't be torn down
//
- lCount = AFSObjectInfoIncrement( pObjectInfo);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on object %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
pObjectInfo,
lCount);
}
// Increment the ref count on the volume and dir entry for correct processing below
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on volume %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
- lCount = InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
&uniParsedName,
pNameArray,
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
- AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
- &pVolumeCB,
- &pParentDirEntry,
+ AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &NewVolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
- {
+ //
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
+ //
- //
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
- //
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
- if( pVolumeCB != NULL)
- {
+ pVolumeCB = pNewVolumeCB;
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
- lCount = InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- lCount);
- }
- else
- {
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount);
- lCount = InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ pParentDirEntry = pNewParentDirEntry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- lCount);
- }
- }
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
pVolumeCB = NULL;
try_return( ntStatus);
}
- //
- // Remove the reference made above
- //
-
- lCount = InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
-
pObjectInfo = pDirectoryEntry->ObjectInformation;
- lCount = AFSObjectInfoIncrement( pObjectInfo);
-
- if( pVolumeCB != NULL)
- {
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
}
//
try_exit:
+ if( pDirectoryEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
if( pObjectInfo != NULL)
{
- lCount = AFSObjectInfoDecrement( pObjectInfo);
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
+ }
+
+ if( pVolumeCB != NULL)
+ {
+
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement4 count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
}
if( pNameArray != NULL)
if( pDirEntry != NULL)
{
- lCount = InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCheckSymlinkAccess Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
}
AFSReleaseResource( ParentDirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSCheckSymlinkAccess Failed to locate entry %wZ\n",
- ComponentName);
+ "AFSCheckSymlinkAccess Failed to locate entry %wZ ntStatus %08X\n",
+ ComponentName,
+ STATUS_OBJECT_NAME_NOT_FOUND);
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
- lCount = InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCheckSymlinkAccess Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ NULL,
+ lCount);
+
+ ASSERT( lCount >= 0);
try_exit:
OUT UNICODE_STRING *ParentPath)
{
- USHORT usIndex = 0;
-
*ParentPath = *FullFileName;
//
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- IO_STATUS_BLOCK stIoStatus;
LIST_ENTRY *le;
AFSExtent *pEntry;
ULONG ulProcessCount = 0;
ULONG ulCount = 0;
+ LONG lCount;
__Enter
{
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSPerformObjectInvalidate Acquiring Fcb extents lock %08lX SHARED %08lX\n",
+ "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
&ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
if ( ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount == 0)
{
- if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
- {
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ bExtentsLocked = FALSE;
- bExtentsLocked = FALSE;
+ if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
+ {
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
else
{
- __try
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
- bExtentsLocked = FALSE;
+ bLocked = FALSE;
+
+ __try
+ {
if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
!CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
}
else
{
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+
+ bExtentsLocked = FALSE;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
+
//
// Must build a list of non-dirty ranges from the beginning of the file
// to the end. There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
ulByteRangeCount == 0)
{
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
-
- bExtentsLocked = FALSE;
-
for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
{
// This could deadlock but we do not have much choice.
//
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+ bExtentsLocked = TRUE;
+
le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
ulProcessCount = 0;
ObjectInfo->FileId.Unique,
ntStatus);
}
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
}
}
}
- if( ObjectInfo != NULL)
- {
+ //
+ // Destroy the reference passed in by the caller to AFSInvalidateObject
+ // or AFSQueueInvalidateObject
+ //
- AFSObjectInfoDecrement( ObjectInfo);
- }
+ lCount = AFSObjectInfoDecrement( ObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
+ ObjectInfo,
+ lCount);
}
return ntStatus;