#define AFS_MAX_FCBS_TO_DROP 10
-static AFSExtent *ExtentFor( PLIST_ENTRY le, ULONG SkipList );
static AFSExtent *NextExtent( AFSExtent *Extent, ULONG SkipList );
static ULONG ExtentsMasks[AFS_NUM_EXTENT_LISTS] = AFS_EXTENTS_MASKS;
static VOID VerifyExtentsLists(AFSFcb *Fcb);
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLockForExtentsTrim Acuiring Fcb extents lock %08lX EXCL %08lX\n",
+ "AFSLockForExtentsTrim Acquiring Fcb extents lock %08lX EXCL %08lX\n",
&pNPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSLockForExtentsTrimNoWait Attempting to acquiring Fcb extent lock %08lX EXCL %08lX\n",
+ "AFSLockForExtentsTrimNoWait Attempting to acquire Fcb extent lock %08lX EXCL %08lX\n",
&pNPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
// Pull all the extents away from the FCB.
//
BOOLEAN
-AFSTearDownFcbExtents( IN AFSFcb *Fcb )
+AFSTearDownFcbExtents( IN AFSFcb *Fcb,
+ IN GUID *AuthGroup)
{
BOOLEAN bFoundExtents = FALSE;
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
BOOLEAN locked = FALSE;
NTSTATUS ntStatus;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ GUID *pAuthGroup = AuthGroup;
+ GUID stAuthGroup;
+ LONG lCount;
__Enter
{
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ pAuthGroup = &stAuthGroup;
+ }
+
//
// Ensure that no one is working with the extents and grab the
// lock
le = le->Flink;
AFSExFreePool( pEntry);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
AFS_REQUEST_FLAG_SYNCHRONOUS,
- &Fcb->AuthGroup,
+ pAuthGroup,
NULL,
&Fcb->ObjectInformation->FileId,
pRelease,
return retVal;
}
-//
-// Given an FCB and an Offset we look to see whether there extents to
-// Map them all. If there are then we return TRUE to fullymapped
-// and *FirstExtent points to the first extent to map the extent.
-// If not then we return FALSE, but we request the extents to be mapped.
-// Further *FirstExtent (if non null) is the last extent which doesn't
-// map the extent.
-//
-// Finally on the way *in* if *FirstExtent is non null it is where we start looking
-//
-
-NTSTATUS
-AFSRequestExtents( IN AFSFcb *Fcb,
- IN PLARGE_INTEGER Offset,
- IN ULONG Size,
- OUT BOOLEAN *FullyMapped)
-{
-
- AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSExtent *pExtent;
- AFSRequestExtentsCB request;
- AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
- AFSExtent *pFirstExtent;
- LARGE_INTEGER liAlignedOffset;
- ULONG ulAlignedLength = 0;
- LARGE_INTEGER liTimeOut;
- ULONGLONG ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
-
- //
- // Check our extents, then fire off a request if we need to.
- // We start off knowing nothing about where we will go.
- //
- pFirstExtent = NULL;
- pExtent = NULL;
-
- *FullyMapped = AFSDoExtentsMapRegion( Fcb, Offset, Size, &pFirstExtent, &pExtent );
-
- if (*FullyMapped)
- {
-
- ASSERT(AFSExtentContains(pFirstExtent, Offset));
- LARGE_INTEGER end = *Offset;
- end.QuadPart += (Size-1);
- ASSERT(AFSExtentContains(pExtent, &end));
-
- return STATUS_SUCCESS;
- }
-
- //
- // So we need to queue a request. Since we will be clearing the
- // ExtentsRequestComplete event we need to do with with the lock
- // EX
- //
-
- liTimeOut.QuadPart = -(50000000);
-
- while (TRUE)
- {
- if (!NT_SUCCESS( pNPFcb->Specific.File.ExtentsRequestStatus))
- {
-
- //
- // If this isn't the same process which caused the failure
- // then try to request them again
- //
-
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
- {
- ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus;
-
- break;
- }
-
- pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
- }
-
- ntStatus = KeWaitForSingleObject( &pNPFcb->Specific.File.ExtentsRequestComplete,
- Executive,
- KernelMode,
- FALSE,
- &liTimeOut);
- if (!NT_SUCCESS(ntStatus))
- {
-
- //
- // try again
- //
-
- continue;
- }
-
- //
- // Lock resource EX and look again
- //
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Acquiring Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSAcquireExcl( &pNPFcb->Specific.File.ExtentsResource, TRUE );
-
- if (!NT_SUCCESS( pNPFcb->Specific.File.ExtentsRequestStatus))
- {
-
- //
- // If this isn't the same process which caused the failure then try to request them again
- //
-
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
- {
- ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Releasing Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
-
- break;
- }
-
- pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
- }
-
- if( KeReadStateEvent( &pNPFcb->Specific.File.ExtentsRequestComplete) ||
- ntStatus == STATUS_TIMEOUT)
- {
-
- ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus;
-
- if( !NT_SUCCESS( ntStatus))
- {
-
- //
- // If this isn't the same process which caused the failure
- // then try to request them again
- //
-
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
- {
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Releasing Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
- }
- else
- {
-
- pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
-
- ntStatus = STATUS_SUCCESS;
- }
- }
-
- break;
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Releasing Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
- }
-
- if (!NT_SUCCESS(ntStatus))
- {
-
- return ntStatus;
- }
-
- __Enter
- {
- //
- // We have the lock Ex and there is no filling going on.
- // Check again to see whether things have moved since we last
- // checked. Since we haven't locked against pinning, we will
- // reset here.
- //
-
- pFirstExtent = NULL;
-
- *FullyMapped = AFSDoExtentsMapRegion(Fcb, Offset, Size, &pFirstExtent, &pExtent);
-
- if (*FullyMapped)
- {
-
- ASSERT(AFSExtentContains(pFirstExtent, Offset));
- LARGE_INTEGER end = *Offset;
- end.QuadPart += (Size-1);
- ASSERT(AFSExtentContains(pExtent, &end));
-
- try_return (ntStatus = STATUS_SUCCESS);
- }
-
- RtlZeroMemory( &request,
- sizeof( AFSRequestExtentsCB));
-
- //
- // Align the request
- //
-
- ulAlignedLength = Size;
-
- liAlignedOffset = *Offset;
-
- if( liAlignedOffset.QuadPart % pDevExt->Specific.RDR.CacheBlockSize != 0)
- {
-
- liAlignedOffset.QuadPart = (ULONGLONG)( (ULONGLONG)(liAlignedOffset.QuadPart / pDevExt->Specific.RDR.CacheBlockSize) * (ULONGLONG)pDevExt->Specific.RDR.CacheBlockSize);
-
- ulAlignedLength += (ULONG)(Offset->QuadPart - liAlignedOffset.QuadPart);
- }
-
- if( ulAlignedLength % pDevExt->Specific.RDR.CacheBlockSize != 0)
- {
-
- ulAlignedLength = (ULONG)(((ulAlignedLength / pDevExt->Specific.RDR.CacheBlockSize) + 1) * pDevExt->Specific.RDR.CacheBlockSize);
- }
-
- request.ByteOffset = liAlignedOffset;
- request.Length = ulAlignedLength;
-
- if( !AFSIsExtentRequestQueued( &Fcb->ObjectInformation->FileId,
- &request.ByteOffset,
- request.Length))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Request extents for fid %08lX-%08lX-%08lX-%08lX Offset %08lX Len %08lX Thread %08lX\n",
- Fcb->ObjectInformation->FileId.Cell,
- Fcb->ObjectInformation->FileId.Volume,
- Fcb->ObjectInformation->FileId.Vnode,
- Fcb->ObjectInformation->FileId.Unique,
- request.ByteOffset.LowPart,
- request.Length,
- PsGetCurrentThread());
-
- ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS,
- 0,
- &Fcb->AuthGroup,
- NULL,
- &Fcb->ObjectInformation->FileId,
- &request,
- sizeof( AFSRequestExtentsCB ),
- NULL,
- NULL);
-
- if( NT_SUCCESS( ntStatus))
- {
- KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
- }
- }
- else
- {
-
- KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
- }
-
-try_exit:
-
- if (NT_SUCCESS( ntStatus ))
- {
- KeQueryTickCount( &Fcb->Specific.File.LastExtentAccess );
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRequestExtents Releasing Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
- }
-
- return ntStatus;
-}
-
NTSTATUS
AFSRequestExtentsAsync( IN AFSFcb *Fcb,
+ IN AFSCcb *Ccb,
IN PLARGE_INTEGER Offset,
IN ULONG Size)
{
{
//
- // If this isn't the same process which caused the failure then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // then try to request them again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
+ if( RtlCompareMemory( &pNPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
- try_return( ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus);
- }
- pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+ ntStatus = pNPFcb->Specific.File.ExtentsRequestStatus;
+
+ pNPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+ RtlZeroMemory( &pNPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
}
//
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS,
0,
- &Fcb->AuthGroup,
+ &Ccb->AuthGroup,
NULL,
&Fcb->ObjectInformation->FileId,
&request,
NULL,
NULL);
+ if ( ntStatus == STATUS_ACCESS_DENIED)
+ {
+ GUID stAuthGroup;
+ DWORD ntStatus2;
+
+ ntStatus2 = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if ( NT_SUCCESS( ntStatus2) &&
+ RtlCompareMemory( &stAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) != sizeof( GUID))
+ {
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_REQUEST_FILE_EXTENTS,
+ 0,
+ &stAuthGroup,
+ NULL,
+ &Fcb->ObjectInformation->FileId,
+ &request,
+ sizeof( AFSRequestExtentsCB ),
+ NULL,
+ NULL);
+ }
+ }
+
if( NT_SUCCESS( ntStatus))
{
BOOLEAN bFoundExtent = FALSE;
LIST_ENTRY *pSkipEntries[AFS_NUM_EXTENT_LISTS] = { 0 };
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
//
// Grab the extents exclusive for the duration
InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, (LONG)(pExtent->Size/1024));
- InterlockedIncrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedIncrement( &Fcb->Specific.File.ExtentCount);
+
+ lCount = InterlockedIncrement( &pControlDevExt->Specific.Control.ExtentCount);
- if( InterlockedIncrement( &pControlDevExt->Specific.Control.ExtentCount) == 1)
+ if( lCount == 1)
{
KeClearEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent);
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
ULONGLONG ullIndex = 0;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
__Enter
{
pVolumeCB->ObjectInfoTree.TreeLock,
PsGetCurrentThread());
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
//
// Now locate the Object in this volume
// Reference the node so it won't be torn down
//
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessSetFileExtents Increment count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
}
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
if( pObjectInfo != NULL)
{
- InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessSetFileExtents Decrement count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
}
}
NTSTATUS ntStatus = STATUS_SUCCESS;
BOOLEAN bReleaseAll = FALSE;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
__Enter
{
FileExtents[*ExtentCount].Flags |= AFS_EXTENT_FLAG_DIRTY;
- InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
*DirtyExtents = TRUE;
}
//
AFSExFreePool( pExtent);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
BOOLEAN bLocatedEntry = FALSE;
AFSObjectInfoCB *pCurrentObject = NULL;
BOOLEAN bReleaseVolumeListLock = FALSE;
+ LONG lCount;
pRDRDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
pControlDeviceExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
pVolumeCB->ObjectInfoTree.TreeLock,
PsGetCurrentThread());
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
if( NULL == LastFcb)
{
// A hit a very palpable hit. Pin it
//
- InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSFindFcbToClean Increment count on Fcb %08lX Cnt %d\n",
pCurrentObject,
- pCurrentObject->ObjectReferenceCount);
+ lCount);
bLocatedEntry = TRUE;
AFSVolumeCB *pVolumeCB = NULL;
ULONGLONG ullIndex = 0;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
__Enter
{
pVolumeCB->ObjectInfoTree.TreeLock,
PsGetCurrentThread());
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
//
// Now locate the Object in this volume
// Reference the node so it won't be torn down
//
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessExtentFailure Increment count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
}
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = pFailureCB->FailureStatus;
+ RtlCopyMemory( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &pFailureCB->AuthGroup,
+ sizeof( GUID));
+
KeSetEvent( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
0,
FALSE);
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessExtentFailure Decrement count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
try_exit:
AFSObjectInfoCB *pObjectInfo = NULL;
BOOLEAN bLocked = FALSE;
BOOLEAN bDirtyExtents = FALSE;
+ GUID stAuthGroup;
+ LONG lCount;
__Enter
{
pVolumeCB->ObjectInfoTree.TreeLock,
PsGetCurrentThread());
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
//
// Now locate the Object in this volume
// Reference the node so it won't be torn down
//
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessReleaseFileExtents Increment count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
}
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
// Stash away the auth group
//
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( pFcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
RtlCopyMemory( &pFile->AuthGroup,
- &pFcb->AuthGroup,
+ &stAuthGroup,
sizeof( GUID));
//
if( pObjectInfo != NULL)
{
- InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSProcessReleaseFileExtents Decrement count on object %08lX Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount);
}
}
}
NTSTATUS
-AFSWaitForExtentMapping( AFSFcb *Fcb )
+AFSWaitForExtentMapping( AFSFcb *Fcb,
+ AFSCcb *Ccb)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
LARGE_INTEGER liTimeOut;
{
//
- // If this isn't the same process which caused the failure then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // then try to request them again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId)
+ if( RtlCompareMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
{
- try_return( ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus);
- }
- Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
- }
+ ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus;
- liTimeOut.QuadPart = -(50000000);
+ Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
- ntStatus = KeWaitForSingleObject( &Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+ RtlZeroMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
+ }
+
+ liTimeOut.QuadPart = -(1 * AFS_ONE_SECOND);
+
+ ntStatus = KeWaitForSingleObject( &Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
Executive,
KernelMode,
FALSE,
{
//
- // If this isn't the same process which caused the failure
- // and this isn't the System process, then try to request them again
+ // If this isn't the same authgroup which caused the failure
+ // or the System Process,
+ // then try to request the extents again
//
- if( Fcb->Specific.File.ExtentRequestProcessId == ullProcessId ||
- ullProcessId == 0x4)
+ if( RtlCompareMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ &Ccb->AuthGroup,
+ sizeof( GUID)) == sizeof( GUID) ||
+ ullProcessId == (ULONGLONG)AFSSysProcess)
{
- try_return( ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus);
- }
- Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+ ntStatus = Fcb->NPFcb->Specific.File.ExtentsRequestStatus;
+
+ Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+ RtlZeroMemory( &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID));
+
+ try_return( ntStatus);
+ }
}
if( ntStatus == STATUS_TIMEOUT)
}
NTSTATUS
-AFSFlushExtents( IN AFSFcb *Fcb)
+AFSFlushExtents( IN AFSFcb *Fcb,
+ IN GUID *AuthGroup)
{
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSExtent *pExtent, *pNextExtent;
LARGE_INTEGER liLastFlush;
AFSExtent *pDirtyListHead = NULL, *pDirtyListTail = NULL;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ GUID *pAuthGroup = AuthGroup;
+ GUID stAuthGroup;
+ LONG lCount;
ASSERT( Fcb->Header.NodeTypeCode == AFS_FILE_FCB);
__Enter
{
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ pAuthGroup = &stAuthGroup;
+ }
+
//
// Lock extents while we count and set up the array to send to
// the service
bExtentsLocked = TRUE;
- InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
+ lCount = InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
//
// Clear our queued flush event
pExtent->DirtyList.fLink = NULL;
pExtent->DirtyList.bLink = NULL;
- InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
//
// Clear the flag in advance of the write. If we do
AFSExFreePool( pExtent);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
AFS_REQUEST_FLAG_SYNCHRONOUS,
- &Fcb->AuthGroup,
+ pAuthGroup,
NULL,
&Fcb->ObjectInformation->FileId,
pRelease,
try_exit:
- if( InterlockedDecrement( &Fcb->Specific.File.QueuedFlushCount) == 0)
+ lCount = InterlockedDecrement( &Fcb->Specific.File.QueuedFlushCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pNPFcb->Specific.File.QueuedFlushEvent,
}
NTSTATUS
-AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb)
+AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
+ IN GUID *AuthGroup)
{
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSExtent *pExtent;
LARGE_INTEGER liLastFlush;
ULONG ulRemainingExtentLength = 0;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ GUID *pAuthGroup = AuthGroup;
+ GUID stAuthGroup;
+ LONG lCount;
ASSERT( Fcb->Header.NodeTypeCode == AFS_FILE_FCB);
__Enter
{
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ pAuthGroup = &stAuthGroup;
+ }
+
//
// Look for a start in the list to flush entries
//
pRelease->FileExtents[count].Flags |= AFS_EXTENT_FLAG_DIRTY;
- InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
}
AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
AFSExFreePool( pExtent);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
AFS_REQUEST_FLAG_SYNCHRONOUS,
- &Fcb->AuthGroup,
+ pAuthGroup,
NULL,
&Fcb->ObjectInformation->FileId,
pRelease,
return ntStatus;
}
+NTSTATUS
+AFSReleaseCleanExtents( IN AFSFcb *Fcb,
+ IN GUID *AuthGroup)
+{
+ AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
+ AFSExtent *pExtent;
+ LIST_ENTRY *le;
+ AFSReleaseExtentsCB *pRelease = NULL;
+ ULONG count = 0;
+ ULONG initialDirtyCount = 0;
+ BOOLEAN bExtentsLocked = FALSE;
+ ULONG total = 0;
+ ULONG sz = 0;
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ LARGE_INTEGER liLastFlush;
+ ULONG ulRemainingExtentLength = 0;
+ AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ GUID *pAuthGroup = AuthGroup;
+ GUID stAuthGroup;
+
+ ASSERT( Fcb->Header.NodeTypeCode == AFS_FILE_FCB);
+
+ //
+ // Save, then reset the flush time
+ //
+
+ liLastFlush = Fcb->Specific.File.LastServerFlush;
+
+ KeQueryTickCount( &Fcb->Specific.File.LastServerFlush);
+
+ __Enter
+ {
+
+ if( pAuthGroup == NULL ||
+ RtlCompareMemory( pAuthGroup,
+ &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ ntStatus = AFSRetrieveValidAuthGroup( Fcb,
+ NULL,
+ TRUE,
+ &stAuthGroup);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ pAuthGroup = &stAuthGroup;
+ }
+
+ //
+ // Look for a start in the list to flush entries
+ //
+
+ total = count;
+
+ sz = sizeof( AFSReleaseExtentsCB ) + (AFS_MAXIMUM_EXTENT_RELEASE_COUNT * sizeof ( AFSFileExtentCB ));
+
+ pRelease = (AFSReleaseExtentsCB*) AFSExAllocatePoolWithTag( NonPagedPool,
+ sz,
+ AFS_EXTENT_RELEASE_TAG);
+ if( NULL == pRelease)
+ {
+
+ try_return ( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
+ }
+
+ while( Fcb->Specific.File.ExtentLength > (LONG)ulRemainingExtentLength)
+ {
+
+ AFSLockForExtentsTrim( Fcb);
+
+ bExtentsLocked = TRUE;
+
+ pRelease->Flags = AFS_EXTENT_FLAG_RELEASE;
+
+ //
+ // Update the metadata for this call
+ //
+
+ pRelease->AllocationSize = Fcb->ObjectInformation->EndOfFile;
+ pRelease->CreateTime = Fcb->ObjectInformation->CreationTime;
+ pRelease->ChangeTime = Fcb->ObjectInformation->ChangeTime;
+ pRelease->LastAccessTime = Fcb->ObjectInformation->LastAccessTime;
+ pRelease->LastWriteTime = Fcb->ObjectInformation->LastWriteTime;
+
+ count = 0;
+
+ le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
+
+ while( count < AFS_MAXIMUM_EXTENT_RELEASE_COUNT &&
+ le != &Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST])
+ {
+
+ pExtent = ExtentFor( le, AFS_EXTENTS_LIST);
+
+ le = le->Flink;
+
+ if( pExtent->ActiveCount > 0 ||
+ BooleanFlagOn( pExtent->Flags, AFS_EXTENT_DIRTY))
+ {
+ continue;
+ }
+
+ pRelease->FileExtents[count].Flags = AFS_EXTENT_FLAG_RELEASE;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseCleanExtents Releasing extent %p fid %08lX-%08lX-%08lX-%08lX Offset %I64X Len %08lX\n",
+ pExtent,
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ pExtent->FileOffset.QuadPart,
+ pExtent->Size);
+
+ pRelease->FileExtents[count].Length = pExtent->Size;
+ pRelease->FileExtents[count].DirtyLength = pExtent->Size;
+ pRelease->FileExtents[count].DirtyOffset = 0;
+ pRelease->FileExtents[count].CacheOffset = pExtent->CacheOffset;
+ pRelease->FileExtents[count].FileOffset = pExtent->FileOffset;
+
+#if GEN_MD5
+ RtlCopyMemory( pRelease->FileExtents[count].MD5,
+ pExtent->MD5,
+ sizeof(pExtent->MD5));
+
+ pRelease->FileExtents[count].Flags |= AFS_EXTENT_FLAG_MD5_SET;
+#endif
+
+ //
+ // Need to pull this extent from the main list as well
+ //
+
+ for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i ++)
+ {
+ if (NULL != pExtent->Lists[i].Flink && !IsListEmpty(&pExtent->Lists[i]))
+ {
+ RemoveEntryList( &pExtent->Lists[i] );
+ }
+ }
+
+ InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pExtent->Size/1024)));
+
+ InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pExtent->Size/1024)));
+
+ AFSExFreePool( pExtent);
+
+ InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+
+ if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ {
+
+ KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
+ 0,
+ FALSE);
+ }
+
+ count ++;
+ }
+
+ //
+ // If we are done then get out
+ //
+
+ if( count == 0)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseCleanExtents No more dirty extents found\n");
+
+ break;
+ }
+
+ //
+ // Fire off the request synchronously
+ //
+
+ sz = sizeof( AFSReleaseExtentsCB ) + (count * sizeof ( AFSFileExtentCB ));
+
+ pRelease->ExtentCount = count;
+
+ //
+ // Drop the extents lock for the duration of the call to
+ // the network. We have pinned the extents so, even
+ // though we might get extents added during this period,
+ // but none will be removed. Hence we can carry on from
+ // le.
+ //
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseCleanExtents Releasing Fcb extents lock %08lX thread %08lX\n",
+ &pNPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource);
+ bExtentsLocked = FALSE;
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ pAuthGroup,
+ NULL,
+ &Fcb->ObjectInformation->FileId,
+ pRelease,
+ sz,
+ NULL,
+ NULL);
+
+ if( !NT_SUCCESS(ntStatus))
+ {
+
+ //
+ // Regardless of whether or not the AFSProcessRequest() succeeded, the extents
+ // were released (if AFS_EXTENT_FLAG_RELEASE was set). Log the error so it is known.
+ //
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSReleaseCleanExtents AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS failed fid %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ ntStatus);
+ }
+ }
+
+try_exit:
+
+ if (bExtentsLocked)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseCleanExtents Releasing Fcb extents lock %08lX thread %08lX\n",
+ &pNPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
+ }
+
+ if (pRelease)
+ {
+ AFSExFreePool( pRelease);
+ }
+ }
+
+ return ntStatus;
+}
+
VOID
AFSMarkDirty( IN AFSFcb *Fcb,
IN AFSExtent *StartExtent,
IN ULONG ExtentsCount,
- IN LARGE_INTEGER *StartingByte)
+ IN LARGE_INTEGER *StartingByte,
+ IN BOOLEAN DerefExtents)
{
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSExtent *pNextExtent, *pCurrentExtent = NULL;
ULONG ulCount = 0;
BOOLEAN bInsertTail = FALSE, bInsertHead = FALSE;
+ LONG lCount;
+ BOOLEAN bLocked = FALSE;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
&Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
- AFSAcquireShared( &Fcb->NPFcb->Specific.File.ExtentsResource, TRUE);
+ if( !ExIsResourceAcquiredLite( &Fcb->NPFcb->Specific.File.ExtentsResource))
+ {
+ AFSAcquireShared( &Fcb->NPFcb->Specific.File.ExtentsResource, TRUE);
+ bLocked = TRUE;
+ }
AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
TRUE);
// Up the dirty count
//
- InterlockedIncrement( &Fcb->Specific.File.ExtentsDirtyCount);
+ lCount = InterlockedIncrement( &Fcb->Specific.File.ExtentsDirtyCount);
}
else
{
pExtent,
pExtent->ActiveCount);
- ASSERT( pExtent->ActiveCount > 0);
-
- InterlockedDecrement( &pExtent->ActiveCount);
+ if( DerefExtents)
+ {
+ ASSERT( pExtent->ActiveCount > 0);
+ lCount = InterlockedDecrement( &pExtent->ActiveCount);
+ }
pExtent = pNextExtent;
&Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
- AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
+ if( bLocked)
+ {
+ AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
+ }
return;
}
// Helper functions
//
-static AFSExtent *ExtentFor(PLIST_ENTRY le, ULONG SkipList)
+AFSExtent *
+ExtentFor(PLIST_ENTRY le, ULONG SkipList)
{
return CONTAINING_RECORD( le, AFSExtent, Lists[SkipList] );
}
LARGE_INTEGER liAlignedOffset = {0,0};
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
__Enter
{
//
AFSExFreePool( pExtent);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
__Enter
{
//
AFSExFreePool( pExtent);
- InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
- if( InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount) == 0)
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
{
KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
AFSExtent *pExtent = StartExtent;
AFSExtent *pNextExtent;
ULONG ulCount = 0;
+ LONG lCount;
while( ulCount < ExtentsCount)
{
pNextExtent = NextExtent( pExtent, AFS_EXTENTS_LIST);
- InterlockedIncrement( &pExtent->ActiveCount);
+ lCount = InterlockedIncrement( &pExtent->ActiveCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_ACTIVE_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSReferenceActiveExtents Increment count on extent %08lX Cnt %d\n",
pExtent,
- pExtent->ActiveCount);
+ lCount);
pExtent = pNextExtent;
AFSExtent *pExtent = StartExtent;
AFSExtent *pNextExtent;
ULONG ulCount = 0;
+ LONG lCount;
while( ulCount < ExtentsCount)
{
pNextExtent = NextExtent( pExtent, AFS_EXTENTS_LIST);
+ ASSERT( pExtent->ActiveCount > 0);
+
+ lCount = InterlockedDecrement( &pExtent->ActiveCount);
+
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_ACTIVE_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSDereferenceActiveExtents Decrement count on extent %08lX Cnt %d\n",
pExtent,
- pExtent->ActiveCount);
-
- ASSERT( pExtent->ActiveCount > 0);
-
- InterlockedDecrement( &pExtent->ActiveCount);
+ lCount);
pExtent = pNextExtent;