UNICODE_STRING uniRelativeName;
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
BOOLEAN bReleaseParentDir = FALSE, bReleaseDir = FALSE;
ULONG ulParseFlags = 0;
// We have a reference on the root volume
//
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_PARSE_NAME;
+
bReleaseVolume = TRUE;
//
pNameArray,
ulNameProcessingFlags,
&pVolumeCB,
+ &VolumeReferenceReason,
&pParentDirectoryCB,
&pDirectoryCB,
&uniComponentName);
ntStatus);
//
- // We released any root volume locks in the above on failure
+ // We released any root volume locks in AFSLocateNameEntry on failure
+ // other than STATUS_OBJECT_NAME_NOT_FOUND
//
bReleaseVolume = FALSE;
bReleaseParentDir = FALSE;
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
try_return( ntStatus);
}
if( bReleaseVolume)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
+ "AFSCommonCreate Decrement count on Volume %08lX Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pVolumeCB)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// The Volume list may move under our feet. Lock it.
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pVolumeCB)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pVolumeCB)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_EXTENTS);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
NTSTATUS
AFSInitVolume( IN GUID *AuthGroup,
IN AFSFileID *RootFid,
+ IN LONG VolumeReferenceReason,
OUT AFSVolumeCB **VolumeCB)
{
// So we don't lock with an invalidation call ...
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitVolume Increment count on volume %p Cnt %d\n",
+ "AFSInitVolume Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
AFSReleaseResource( pDeviceExt->Specific.RDR.VolumeTree.TreeLock);
pVolumeCB->ObjectInfoTree.TreeLock = &pNonPagedVcb->ObjectInfoTreeLock;
- //
- // Bias our reference by 1
- //
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitVolume Initializing count (2) on volume %p\n",
- pVolumeCB);
-
- pVolumeCB->VolumeReferenceCount = 2;
+ "AFSInitVolume Initializing volume %p Reason %u count %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount);
AFSAcquireExcl( pVolumeCB->VolumeLock,
TRUE);
pVolumeCB->DirectoryCB->ObjectInformation = &pVolumeCB->ObjectInformation;
+ //
+ // The ObjectInformation VolumeCB pointer does not obtain
+ // a reference count.
+ //
+
pVolumeCB->DirectoryCB->ObjectInformation->VolumeCB = pVolumeCB;
//
__Enter
{
+ ASSERT( VolumeCB->VolumeReferenceCount == 0);
+
//
// Remove the volume from the tree and list
// Don't process the list information for reserved entries
return ntStatus;
}
+LONG
+AFSVolumeIncrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason)
+{
+
+ LONG lCount;
+
+ lCount = InterlockedIncrement( &VolumeCB->VolumeReferenceCount);
+
+ InterlockedIncrement( &VolumeCB->VolumeReferences[ Reason]);
+
+ return lCount;
+}
+
+LONG
+AFSVolumeDecrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason)
+{
+
+ LONG lCount;
+
+ lCount = InterlockedDecrement( &VolumeCB->VolumeReferences[ Reason]);
+
+ ASSERT( lCount >= 0);
+
+ lCount = InterlockedDecrement( &VolumeCB->VolumeReferenceCount);
+
+ ASSERT( lCount >= 0);
+
+ return lCount;
+}
//
// Function: AFSInitRootFcb
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
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,
if ( pNextVolumeCB)
{
- lCount = InterlockedIncrement( &pNextVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pNextVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
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,
if( pVolumeCB != NULL)
{
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
// 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 %p Cnt %d\n",
+ "AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
pNameArray,
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL,
&pVolumeCB,
+ &VolumeReferenceReason,
&pParentDirEntry,
&pDirectoryEntry,
NULL);
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement count on volume %p Cnt %d\n",
+ "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
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 %p Cnt %d\n",
+ "AFSRetrieveFileAttributes Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
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 %p Cnt %d\n",
+ "AFSEvaluateRootEntry Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
pNameArray,
0,
&pVolumeCB,
+ &VolumeReferenceReason,
&pParentDirEntry,
&pDirectoryEntry,
NULL);
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement count on volume %p Cnt %d\n",
+ "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement2 count on volume %p Cnt %d\n",
+ "AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
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 Increment count on volume %p Cnt %d\n",
+ "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
AFSGlobalRoot,
lCount);
AFSInitVolumeWorker( AFSGlobalRoot);
- lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( AFSGlobalRoot,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfo = NULL;
ULONGLONG ullIndex = 0;
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 %p Cnt %d\n",
+ "AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
"AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
pObjectInfo,
lCount);
-
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %p Cnt %d\n",
- pVolumeCB,
- lCount);
}
else
{
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement2 count on volume %p Cnt %d\n",
- pVolumeCB,
- lCount);
-
ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
// 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 Increment2 count on volume %p Cnt %d\n",
+ "AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
&pVolumeCB,
+ &VolumeReferenceReason,
&pParentDirEntry,
&pDirectoryEntry,
NULL);
if( pVolumeCB != NULL)
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement3 count on volume %p Cnt %d\n",
+ "AFSGetObjectStatus Decrement3 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
+ VolumeReferenceReason,
lCount);
}
"AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
pObjectInfo,
lCount);
-
- if( pVolumeCB != NULL)
- {
-
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement4 count on volume %p Cnt %d\n",
- pVolumeCB,
- lCount);
- }
}
//
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)
{
IN AFSNameArrayHdr *NameArray,
IN ULONG Flags,
IN OUT AFSVolumeCB **VolumeCB,
+ IN OUT LONG *pVolumeReferenceReason,
IN OUT AFSDirectoryCB **ParentDirectoryCB,
OUT AFSDirectoryCB **DirectoryCB,
OUT PUNICODE_STRING ComponentName)
AFSObjectInfoCB *pParentObjectInfo = NULL;
AFSVolumeCB *pCurrentVolume = *VolumeCB;
BOOLEAN bReleaseCurrentVolume = TRUE;
+ LONG VolumeReferenceReason = *pVolumeReferenceReason;
BOOLEAN bSubstitutedName = FALSE;
LONG lCount;
while( TRUE)
{
- ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+ ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
ASSERT( pDirEntry->DirOpenReferenceCount > 0);
pCurrentObject->FileId.Vnode,
pCurrentObject->FileId.Unique);
- lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pCurrentVolume,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Decrement count on volume %p Cnt %d\n",
+ "AFSLocateNameEntry Decrement count on volume %p Reason %u Cnt %d\n",
pCurrentVolume,
+ VolumeReferenceReason,
lCount);
pCurrentVolume = AFSGlobalRoot;
- lCount = InterlockedIncrement( &pCurrentVolume->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_LOCATE_NAME;
+
+ lCount = AFSVolumeIncrement( pCurrentVolume,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Increment count on volume %p Cnt %d\n",
+ "AFSLocateNameEntry Increment count on volume %p Reason %u Cnt %d\n",
pCurrentVolume,
+ VolumeReferenceReason,
lCount);
}
// Also decrement the ref count on the volume
//
- ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+ ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
- lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pCurrentVolume,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Decrement2 count on volume %p Cnt %d\n",
+ "AFSLocateNameEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
pCurrentVolume,
+ VolumeReferenceReason,
lCount);
+ bReleaseCurrentVolume = FALSE;
+
ntStatus = AFSBuildMountPointTarget( AuthGroup,
pDirEntry,
&pCurrentVolume);
pCurrentObject->FileId.Unique,
ntStatus);
- //
- // We already decremented the current volume above
- //
-
- bReleaseCurrentVolume = FALSE;
-
try_return( ntStatus);
}
- ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+ ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
+
+ bReleaseCurrentVolume = TRUE;
+
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_MOUNTPT;
//
// We want to restart processing here on the new parent ...
if( bReleaseCurrentVolume)
{
- ASSERT( pCurrentVolume->VolumeReferenceCount > 1);
+ ASSERT( pCurrentVolume->VolumeReferenceCount > 0);
- lCount = InterlockedDecrement( &pCurrentVolume->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pCurrentVolume,
+ VolumeReferenceReason);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLocateNameEntry Decrement3 count on volume %p Cnt %d\n",
+ "AFSLocateNameEntry Decrement3 count on volume %p Reason %u Cnt %d\n",
pCurrentVolume,
+ VolumeReferenceReason,
lCount);
+
+ bReleaseCurrentVolume = FALSE;
}
if( RootPathName->Buffer != uniFullPathName.Buffer)
AFSExFreePoolWithTag( uniSearchName.Buffer, 0);
}
+
+ if ( bReleaseCurrentVolume) {
+
+ *pVolumeReferenceReason = VolumeReferenceReason;
+ }
}
return ntStatus;
// Increment our volume reference count
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_PARSE_NAME);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Increment our reference on the volume
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_PARSE_NAME);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( *VolumeCB != NULL)
{
- ASSERT( (*VolumeCB)->VolumeReferenceCount > 1);
+ ASSERT( (*VolumeCB)->VolumeReferenceCount > 0);
}
if( ntStatus != STATUS_SUCCESS)
&pDirEnumEntry->FileId,
&pVolumeCB);
+ //
+ // On success returns with a volume reference count held
+ //
+
if( !NT_SUCCESS( ntStatus))
{
try_return( ntStatus);
NULL,
lCount);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_BUILD_ROOT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCheckCellName Increment count on volume %p Cnt %d\n",
+ "AFSCheckCellName Decrement count on volume %p Cnt %d\n",
pVolumeCB,
lCount);
}
ntStatus = AFSInitVolume( AuthGroup,
&stTargetFileID,
+ AFS_VOLUME_REFERENCE_MOUNTPT,
&pVolumeCB);
if( !NT_SUCCESS( ntStatus))
// obtain one to match
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_MOUNTPT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( !NT_SUCCESS( ntStatus))
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_MOUNTPT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
ntStatus = AFSInitVolume( AuthGroup,
FileId,
+ AFS_VOLUME_REFERENCE_BUILD_ROOT,
&pVolumeCB);
if( !NT_SUCCESS( ntStatus))
// obtain one to match
//
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_BUILD_ROOT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( !NT_SUCCESS( ntStatus))
{
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_BUILD_ROOT);
AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pVolumeCB->ObjectInfoListHead == NULL &&
pVolumeCB->DirectoryCB->DirOpenReferenceCount <= 0 &&
pVolumeCB->DirectoryCB->NameArrayReferenceCount <= 0 &&
- pVolumeCB->VolumeReferenceCount == 1 &&
+ pVolumeCB->VolumeReferenceCount == 0 &&
( pVolumeCB->RootFcb == NULL ||
pVolumeCB->RootFcb->OpenReferenceCount == 0) &&
pVolumeCB->ObjectInformation.ObjectReferenceCount <= 0)
NTSTATUS
AFSInitVolume( IN GUID *AuthGroup,
IN AFSFileID *RootFid,
+ IN LONG VolumeReferenceReason,
OUT AFSVolumeCB **VolumeCB);
NTSTATUS
AFSRemoveVolume( IN AFSVolumeCB *VolumeCB);
+LONG
+AFSVolumeIncrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason);
+
+LONG
+AFSVolumeDecrement( IN AFSVolumeCB *VolumeCB,
+ IN LONG Reason);
+
NTSTATUS
AFSInitRootFcb( IN ULONGLONG ProcessID,
IN AFSVolumeCB *VolumeCB);
IN AFSNameArrayHdr *NameArray,
IN ULONG Flags,
IN OUT AFSVolumeCB **VolumeCB,
+ IN OUT LONG *pVolumeReferenceReason,
IN OUT AFSDirectoryCB **ParentDirectoryCB,
OUT AFSDirectoryCB **DirectoryCB,
OUT PUNICODE_STRING ComponentName);
#define AFS_OBJECT_REFERENCE_MAX 8
//
+// Volume reference count reasons
+//
+
+#define AFS_VOLUME_REFERENCE_INVALID 0
+#define AFS_VOLUME_REFERENCE_EXTENTS 1
+#define AFS_VOLUME_REFERENCE_GLOBAL_ROOT 2
+#define AFS_VOLUME_REFERENCE_INVALIDATE 3
+#define AFS_VOLUME_REFERENCE_FILE_ATTRS 4
+#define AFS_VOLUME_REFERENCE_EVAL_ROOT 5
+#define AFS_VOLUME_REFERENCE_GET_OBJECT 6
+#define AFS_VOLUME_REFERENCE_MOUNTPT 7
+#define AFS_VOLUME_REFERENCE_BUILD_ROOT 8
+#define AFS_VOLUME_REFERENCE_LOCATE_NAME 9
+#define AFS_VOLUME_REFERENCE_PARSE_NAME 10
+#define AFS_VOLUME_REFERENCE_MAX 12
+
+//
// Define one second in terms of 100 nS units
//
LONG VolumeReferenceCount;
+ LONG VolumeReferences[ AFS_VOLUME_REFERENCE_MAX];
+
//
// Object information tree
//