AFSVolumeCB *pVolumeCB = NULL;
AFSFileID stTargetFileID;
LONG lCount;
+ BOOLEAN bReleaseVolumeLock = FALSE;
__Enter
{
try_return( ntStatus);
}
- }
- else
- {
//
- // Check if this volume has been deleted or taken offline
+ // pVolumeCB->VolumeLock held exclusive and
+ // pVolumeCB->VolumeReferenceCount has been incremented
+ // pVolumeCB->RootFcb == NULL
//
- if( BooleanFlagOn( pVolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE))
- {
-
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
- try_return( ntStatus = STATUS_FILE_IS_OFFLINE);
- }
+ bReleaseVolumeLock = TRUE;
+ }
+ else
+ {
//
- // Just to ensure that things don't get torn down AND we don't create a
- // deadlock with invalidation
+ // AFSInitVolume returns with a VolumeReferenceCount
+ // obtain one to match
//
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
- AFSAcquireExcl( pVolumeCB->VolumeLock,
- TRUE);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSBuildMountPointTarget Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
}
if( pVolumeCB->RootFcb == NULL)
{
+ if ( bReleaseVolumeLock == FALSE)
+ {
+
+ AFSAcquireExcl( pVolumeCB->VolumeLock,
+ TRUE);
+
+ bReleaseVolumeLock = TRUE;
+ }
+
//
// Initialize the root fcb for this volume
//
if( !NT_SUCCESS( ntStatus))
{
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+
AFSReleaseResource( pVolumeCB->VolumeLock);
try_return( ntStatus);
AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
}
+ if ( bReleaseVolumeLock == TRUE)
+ {
+
+ AFSReleaseResource( pVolumeCB->VolumeLock);
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSBuildMountPointTarget Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
pVolumeCB->ObjectInformation.FileId.Vnode,
pVolumeCB->ObjectInformation.FileId.Unique);
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBuildMountPointTarget Increment count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
-
*TargetVolumeCB = pVolumeCB;
try_exit:
ULONGLONG ullIndex = 0;
AFSVolumeCB *pVolumeCB = NULL;
LONG lCount;
+ BOOLEAN bReleaseVolumeLock = FALSE;
__Enter
{
try_return( ntStatus);
}
+
+ //
+ // pVolumeCB->VolumeLock is held exclusive
+ // pVolumeCB->VolumeReferenceCount has been incremented
+ // pVolumeCB->RootFcb == NULL
+ //
+
+ bReleaseVolumeLock = TRUE;
}
else
{
//
- // Just to ensure that things don't get torn down AND we don't create a
- // deadlock with invalidation
+ // AFSInitVolume returns with a VolumeReferenceCount
+ // obtain one to match
//
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
- AFSAcquireExcl( pVolumeCB->VolumeLock,
- TRUE);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSBuildRootVolume Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
}
if( pVolumeCB->RootFcb == NULL)
{
+ if ( bReleaseVolumeLock == FALSE)
+ {
+
+ AFSAcquireExcl( pVolumeCB->VolumeLock,
+ TRUE);
+
+ bReleaseVolumeLock = TRUE;
+ }
+
//
// Initialize the root fcb for this volume
//
if( !NT_SUCCESS( ntStatus))
{
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+
AFSReleaseResource( pVolumeCB->VolumeLock);
try_return( ntStatus);
AFSReleaseResource( &pVolumeCB->RootFcb->NPFcb->Resource);
}
+ if ( bReleaseVolumeLock == TRUE)
+ {
+
+ AFSReleaseResource( pVolumeCB->VolumeLock);
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSBuildRootVolume Evaluated target of %wZ FID %08lX-%08lX-%08lX-%08lX as root volume\n",
pVolumeCB->ObjectInformation.FileId.Vnode,
pVolumeCB->ObjectInformation.FileId.Unique);
- lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSReleaseResource( pVolumeCB->VolumeLock);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBuildRootVolume Increment count on volume %08lX Cnt %d\n",
- pVolumeCB,
- lCount);
-
*TargetVolumeCB = pVolumeCB;
try_exit: