#define AFS_MAX_FCBS_TO_DROP 10
-static AFSExtent *NextExtent( AFSExtent *Extent, ULONG SkipList );
static ULONG ExtentsMasks[AFS_NUM_EXTENT_LISTS] = AFS_EXTENTS_MASKS;
static VOID VerifyExtentsLists(AFSFcb *Fcb);
static AFSExtent *DirtyExtentFor(PLIST_ENTRY le);
VOID
AFSLockForExtentsTrim( IN AFSFcb *Fcb)
{
- NTSTATUS ntStatus;
- AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLockForExtentsTrim Acquiring Fcb extents lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
+ &Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
- AFSAcquireExcl( &pNPFcb->Specific.File.ExtentsResource, TRUE );
+ AFSAcquireExcl( &Fcb->NPFcb->Specific.File.ExtentsResource, TRUE );
return;
}
BOOLEAN
AFSLockForExtentsTrimNoWait( IN AFSFcb *Fcb)
{
- AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLockForExtentsTrimNoWait Attempting to acquire Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
+ &Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
- if (!AFSAcquireExcl( &pNPFcb->Specific.File.ExtentsResource, FALSE ))
+ if (!AFSAcquireExcl( &Fcb->NPFcb->Specific.File.ExtentsResource, FALSE ))
{
//
// Couldn't lock immediately
AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSLockForExtentsTrimNoWait Refused to wait for Fcb extent lock %08lX EXCL %08lX\n",
- &pNPFcb->Specific.File.ExtentsResource,
+ &Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
return FALSE;
return TRUE;
}
+
+static VOID
+AFSFreeExtent( IN AFSFcb *Fcb,
+ IN AFSExtent *pExtent)
+{
+ AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
+
+ 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)));
+
+ lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+
+ lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+
+ if( lCount == 0)
+ {
+
+ KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
+ 0,
+ FALSE);
+ }
+
+ AFSExFreePoolWithTag( pExtent, AFS_EXTENT_TAG);
+}
+
//
// AFSTearDownFcbExtents was originally written to
// remove all of the extents from an FCB. For that to happen
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
LIST_ENTRY *le, *leNext;
AFSExtent *pEntry;
- LONG lExtentCount = 0;
- ULONG ulReleaseCount = 0, ulProcessCount = 0;
+ LONG lExtentCount = 0, lProcessCount = 0;
+ ULONG ulReleaseCount = 0;
size_t sz;
AFSReleaseExtentsCB *pRelease = NULL;
BOOLEAN locked = FALSE;
for( le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink,
lExtentCount = 0;
lExtentCount < Fcb->Specific.File.ExtentCount;
- lExtentCount += ulProcessCount)
+ lExtentCount += lProcessCount)
{
RtlZeroMemory( pRelease,
sizeof( AFSReleaseExtentsCB ) +
(AFS_MAXIMUM_EXTENT_RELEASE_COUNT * sizeof ( AFSFileExtentCB )));
- for( ulProcessCount = 0, ulReleaseCount = 0;
- !IsListEmpty( le) && ulReleaseCount < AFS_MAXIMUM_EXTENT_RELEASE_COUNT;
- ulProcessCount++, le = leNext)
+ for( lProcessCount = 0, ulReleaseCount = 0;
+ !IsListEmpty( le) &&
+ ulReleaseCount < AFS_MAXIMUM_EXTENT_RELEASE_COUNT &&
+ lExtentCount + lProcessCount < Fcb->Specific.File.ExtentCount;
+ lProcessCount++, le = leNext)
{
leNext = le->Flink;
if( pEntry->ActiveCount == 0)
{
- ulReleaseCount++;
-
- pRelease->FileExtents[ulProcessCount].Flags = AFS_EXTENT_FLAG_RELEASE;
+ pRelease->FileExtents[ulReleaseCount].Flags = AFS_EXTENT_FLAG_RELEASE;
#if GEN_MD5
- RtlCopyMemory( pRelease->FileExtents[ulProcessCount].MD5,
+ RtlCopyMemory( pRelease->FileExtents[ulReleaseCount].MD5,
pEntry->MD5,
sizeof(pEntry->MD5));
- pRelease->FileExtents[ulProcessCount].Flags |= AFS_EXTENT_FLAG_MD5_SET;
+ pRelease->FileExtents[ulReleaseCount].Flags |= AFS_EXTENT_FLAG_MD5_SET;
#endif
if( BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
AFSRemoveEntryDirtyList( Fcb,
pEntry);
- pRelease->FileExtents[ulProcessCount].Flags |= AFS_EXTENT_FLAG_DIRTY;
+ pRelease->FileExtents[ulReleaseCount].Flags |= AFS_EXTENT_FLAG_DIRTY;
dirtyCount = InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
pEntry->FileOffset.LowPart,
pEntry->Size);
- pRelease->FileExtents[ulProcessCount].Length = pEntry->Size;
- pRelease->FileExtents[ulProcessCount].DirtyLength = pEntry->Size;
- pRelease->FileExtents[ulProcessCount].DirtyOffset = 0;
- pRelease->FileExtents[ulProcessCount].CacheOffset = pEntry->CacheOffset;
- pRelease->FileExtents[ulProcessCount].FileOffset = pEntry->FileOffset;
-
- InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pEntry->Size/1024)));
-
- InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pEntry->Size/1024)));
-
- RemoveEntryList( le);
-
- AFSExFreePool( pEntry);
+ pRelease->FileExtents[ulReleaseCount].Length = pEntry->Size;
+ pRelease->FileExtents[ulReleaseCount].DirtyLength = pEntry->Size;
+ pRelease->FileExtents[ulReleaseCount].DirtyOffset = 0;
+ pRelease->FileExtents[ulReleaseCount].CacheOffset = pEntry->CacheOffset;
+ pRelease->FileExtents[ulReleaseCount].FileOffset = pEntry->FileOffset;
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
+ ulReleaseCount++;
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pEntry);
}
}
// request would be a corruption.
//
- sz = sizeof( AFSReleaseExtentsCB ) + (ulProcessCount * sizeof ( AFSFileExtentCB ));
+ sz = sizeof( AFSReleaseExtentsCB ) + (lProcessCount * sizeof ( AFSFileExtentCB ));
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
AFS_REQUEST_FLAG_SYNCHRONOUS,
if (pRelease)
{
- AFSExFreePool( pRelease);
+ AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
}
}
}
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSDoExtentsMapRegion Acquiring Fcb extent lock %08lX SHARED %08lX\n",
- &Fcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSAcquireShared( &Fcb->NPFcb->Specific.File.ExtentsResource, TRUE );
+ ASSERT( ExIsResourceAcquiredLite( &Fcb->NPFcb->Specific.File.ExtentsResource ));
__try
{
try_exit:
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSDoExtentsMapRegion Releasing Fcb extent lock %08lX SHARED %08lX\n",
- &Fcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
-
*LastExtent = entry;
}
// Check if we are already mapped
//
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRequestExtentsAsync Acquiring Fcb extents lock %08lX SHARED %08lX\n",
+ &pNPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread());
+
+ AFSAcquireShared( &pNPFcb->Specific.File.ExtentsResource, TRUE );
+
bRegionMapped = AFSDoExtentsMapRegion( Fcb, Offset, Size, &pFirstExtent, &pExtent);
if( bRegionMapped)
{
+ KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
+ }
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRequestExtentsAsync Releasing Fcb extents lock %08lX SHARED %08lX\n",
+ &pNPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &pNPFcb->Specific.File.ExtentsResource );
+
+ if ( bRegionMapped)
+ {
+
try_return( ntStatus = STATUS_SUCCESS);
}
request.Length))
{
+ KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
+
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRequestExtentsAsync Request extents for fid %08lX-%08lX-%08lX-%08lX Offset %08lX Len %08lX Thread %08lX\n",
}
}
- if( NT_SUCCESS( ntStatus))
+ if( !NT_SUCCESS( ntStatus))
{
- KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
+ KeSetEvent( &pNPFcb->Specific.File.ExtentsRequestComplete,
+ 0,
+ FALSE);
}
}
- else
- {
-
- KeClearEvent( &pNPFcb->Specific.File.ExtentsRequestComplete );
- }
try_exit:
//
le = &pExtent->Lists[AFS_EXTENTS_LIST];
- /*
- //
- // Then the check the skip lists cursors
- //
- for (ULONG i = AFS_NUM_EXTENT_LISTS-1; i > AFS_EXTENTS_LIST; i--)
- {
- if (0 == (pFileExtents->FileOffset.LowPart & ExtentsMasks[i]))
- {
- //
- // Three options:
- // - empty list (pSkipEntries[i]->Flink == pSkipEntries[i]->Flink == fcb->lists[i]
- // - We are the last on the list (pSkipEntries[i]->Flink == fcb->lists[i])
- // - We are not the last on the list. In that case we have to be strictly less than
- // that extent.
- if (pSkipEntries[i]->Flink != &Fcb->Specific.File.ExtentsLists[i]) {
-
- AFSExtent *otherExtent = ExtentFor(pSkipEntries[i]->Flink, i);
- ASSERT(pFileExtents->FileOffset.QuadPart < otherExtent->FileOffset.QuadPart);
- }
- }
- }
- */
-
//
// setup pExtent if there is one
//
PsGetCurrentThread());
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessSetFileExtents Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessSetFileExtents Decrement count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
+
//
// Now locate the Object in this volume
//
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
ulExtentCount ++;
*ExtentCount = (*ExtentCount) + 1;
- //
- // And unpick
- //
- 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)));
-
- //
- // and free
- //
- AFSExFreePool( pExtent);
-
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
}
try_exit:
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFindFcbToClean Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
+
AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
bReleaseVolumeListLock = FALSE;
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFindFcbToClean Decrement count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
+
if( NULL == LastFcb)
{
// A hit a very palpable hit. Pin it
//
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
PsGetCurrentThread());
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessExtentFailure Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessExtentFailure Decrement count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
//
// Now locate the Object in this volume
//
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
PsGetCurrentThread());
lCount = InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessReleaseFileExtents Increment count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessReleaseFileExtents Decrement count on volume %08lX Cnt %d\n",
+ pVolumeCB,
+ lCount);
+
//
// Now locate the Object in this volume
//
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
Irp->AssociatedIrp.SystemBuffer != pResult)
{
- AFSExFreePool(pResult);
+ AFSExFreePoolWithTag(pResult, AFS_EXTENTS_RESULT_TAG);
}
if (NT_SUCCESS(ntStatus))
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
__Enter
{
+ lCount = InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
+
if( pAuthGroup == NULL ||
RtlCompareMemory( pAuthGroup,
&Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
bExtentsLocked = TRUE;
- lCount = InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
-
//
// Clear our queued flush event
//
pRelease->FileExtents[count].Flags |= AFS_EXTENT_FLAG_RELEASE;
- //
- // 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);
-
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
count ++;
ntStatus);
}
+
AFSLockForExtentsTrim( Fcb);
bExtentsLocked = TRUE;
lCount = InterlockedDecrement( &Fcb->Specific.File.QueuedFlushCount);
+ ASSERT( lCount >= 0);
+
if( lCount == 0)
{
if (pRelease)
{
- AFSExFreePool( pRelease);
+ AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
}
}
NTSTATUS
AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
- IN GUID *AuthGroup)
+ IN GUID *AuthGroup,
+ IN BOOLEAN bReleaseAll)
{
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
AFSExtent *pExtent;
try_return ( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
}
- if( Fcb->OpenHandleCount > 0)
+ if( Fcb->OpenHandleCount > 0 &&
+ !bReleaseAll)
{
//
// Don't release everything ...
//
- //
- // For now release everything
- //
-
- //ulRemainingExtentLength = 1500;
+ ulRemainingExtentLength = 1024;
}
while( Fcb->Specific.File.ExtentLength > (LONG)ulRemainingExtentLength)
AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
}
- //
- // 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);
-
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
count ++;
}
if (pRelease)
{
- AFSExFreePool( pRelease);
+ AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
}
}
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);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
count ++;
}
if (pRelease)
{
- AFSExFreePool( pRelease);
+ AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
}
}
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());
- if( !ExIsResourceAcquiredLite( &Fcb->NPFcb->Specific.File.ExtentsResource))
- {
- AFSAcquireShared( &Fcb->NPFcb->Specific.File.ExtentsResource, TRUE);
- bLocked = TRUE;
- }
+ ASSERT( ExIsResourceAcquiredLite( &pNPFcb->Specific.File.ExtentsResource));
AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
TRUE);
&Fcb->NPFcb->Specific.File.ExtentsResource,
PsGetCurrentThread());
- if( bLocked)
- {
- AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
- }
-
return;
}
AFSExtent *
ExtentFor(PLIST_ENTRY le, ULONG SkipList)
{
+
return CONTAINING_RECORD( le, AFSExtent, Lists[SkipList] );
}
-static AFSExtent *NextExtent(AFSExtent *Extent, ULONG SkipList)
+AFSExtent *
+NextExtent(AFSExtent *Extent, ULONG SkipList)
{
+
return ExtentFor(Extent->Lists[SkipList].Flink, SkipList);
}
static AFSExtent *DirtyExtentFor(PLIST_ENTRY le)
{
+
return CONTAINING_RECORD( le, AFSExtent, DirtyList );
}
AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
}
- for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i ++)
- {
- if (NULL != pExtent->Lists[i].Flink && !IsListEmpty(&pExtent->Lists[i]))
- {
- RemoveEntryList( &pExtent->Lists[i] );
- }
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSTrimExtents Releasing extent %p fid %08lX-%08lX-%08lX-%08lX Offset %I64X Len %08lX\n",
pExtent->FileOffset.QuadPart,
pExtent->Size);
- InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pExtent->Size/1024)));
-
- InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pExtent->Size/1024)));
-
ASSERT( pExtent->ActiveCount == 0);
- //
- // and free
- //
- AFSExFreePool( pExtent);
-
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
}
}
}
- for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i ++)
- {
- if (NULL != pExtent->Lists[i].Flink && !IsListEmpty(&pExtent->Lists[i]))
- {
- RemoveEntryList( &pExtent->Lists[i] );
- }
- }
-
AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSTrimSpecifiedExtents Releasing extent %p fid %08lX-%08lX-%08lX-%08lX Offset %I64X Len %08lX\n",
pExtent->FileOffset.QuadPart,
pExtent->Size);
- InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pExtent->Size/1024)));
-
- InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pExtent->Size/1024)));
-
ASSERT( pExtent->ActiveCount == 0);
- //
- // and free
- //
- AFSExFreePool( pExtent);
-
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
-
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
-
- if( lCount == 0)
- {
-
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
+ AFSFreeExtent( Fcb,
+ pExtent);
//
// Next extent we are looking for
if( pExtentBuffer != NULL)
{
- AFSExFreePool( pExtentBuffer);
+ AFSExFreePoolWithTag( pExtentBuffer, AFS_GENERIC_MEMORY_9_TAG);
}
}