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;
+ LONG lFcbExtentCount;
+ ULONG ulReleaseCount = 0;
size_t sz;
AFSReleaseExtentsCB *pRelease = NULL;
BOOLEAN locked = FALSE;
TRUE);
for( le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink,
- lExtentCount = 0;
- lExtentCount < Fcb->Specific.File.ExtentCount;
- lExtentCount += ulProcessCount)
+ lExtentCount = 0,
+ lFcbExtentCount = Fcb->Specific.File.ExtentCount;
+ lExtentCount < lFcbExtentCount;
+ 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 < lFcbExtentCount;
+ 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;
+ 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;
- InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pEntry->Size/1024)));
-
- InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pEntry->Size/1024)));
-
- for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i ++)
- {
- if (NULL != pEntry->Lists[i].Flink && !IsListEmpty(&pEntry->Lists[i]))
- {
- RemoveEntryList( &pEntry->Lists[i] );
- }
- }
-
- AFSExFreePool( pEntry);
-
- 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);
+ }
+ }
+}
+
+VOID
+AFSDeleteFcbExtents( IN AFSFcb *Fcb)
+{
+ AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
+ LIST_ENTRY *le, *leNext;
+ AFSExtent *pEntry;
+ LONG lExtentCount = 0, lProcessCount = 0;
+ LONG lFcbExtentCount;
+ size_t sz;
+ BOOLEAN locked = FALSE;
+ NTSTATUS ntStatus;
+ AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
+ LONG lCount;
+
+ __Enter
+ {
+
+ //
+ // Ensure that no one is working with the extents and grab the
+ // lock
+ //
+
+ AFSLockForExtentsTrim( Fcb );
+
+ locked = TRUE;
+
+ if (0 == Fcb->Specific.File.ExtentCount)
+ {
+ try_return ( ntStatus = STATUS_SUCCESS);
+ }
+
+ sz = sizeof( AFSReleaseExtentsCB ) + (AFS_MAXIMUM_EXTENT_RELEASE_COUNT * sizeof ( AFSFileExtentCB ));
+
+ AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
+ TRUE);
+
+ for( le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink,
+ lExtentCount = 0,
+ lFcbExtentCount = Fcb->Specific.File.ExtentCount;
+ lExtentCount < lFcbExtentCount;
+ lExtentCount += lProcessCount)
+ {
+
+ for( lProcessCount = 0;
+ !IsListEmpty( le) &&
+ lExtentCount + lProcessCount < lFcbExtentCount;
+ lProcessCount++, le = leNext)
+ {
+
+ leNext = le->Flink;
+
+ pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+
+ if( BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
+ {
+
+ LONG dirtyCount;
+
+ AFSRemoveEntryDirtyList( Fcb,
+ pEntry);
+
+ dirtyCount = InterlockedDecrement( &Fcb->Specific.File.ExtentsDirtyCount);
+
+ ASSERT( dirtyCount >= 0);
+ }
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteFcbExtents Deleting extent %p fid %08lX-%08lX-%08lX-%08lX Offset %08lX-%08lX Len %08lX\n",
+ pEntry,
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ pEntry->FileOffset.HighPart,
+ pEntry->FileOffset.LowPart,
+ pEntry->Size);
+
+ AFSFreeExtent( Fcb,
+ pEntry);
+ }
+ }
+
+ AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+
+ //
+ // if all extents have been released, reinitialize the skip lists
+ //
+
+ ASSERT( Fcb->Specific.File.ExtentCount == 0);
+
+ if( Fcb->Specific.File.ExtentCount == 0)
+ {
+
+ for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i++)
+ {
+ InitializeListHead(&Fcb->Specific.File.ExtentsLists[i]);
+ }
+
+ //
+ // Reinitialize the dirty list as well
+ //
+
+ AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
+ TRUE);
+
+ ASSERT( Fcb->Specific.File.ExtentsDirtyCount == 0);
+
+ Fcb->NPFcb->Specific.File.DirtyListHead = NULL;
+ Fcb->NPFcb->Specific.File.DirtyListTail = NULL;
+
+ AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ }
+
+ Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
+
+try_exit:
+
+ if (locked)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteFcbExtents Releasing Fcb extent lock %08lX thread %08lX\n",
+ &Fcb->NPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread());
+
+ AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
}
}
}
+
static PAFSExtent
ExtentForOffsetInList( IN AFSFcb *Fcb,
IN LIST_ENTRY *List,
__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
//
if( pVolumeCB != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessSetFileExtents Acquiring VolumeRoot FileIDTree.TreeLock lock %08lX SHARED %08lX\n",
- pVolumeCB->ObjectInfoTree.TreeLock,
- 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);
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
//
// 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,
pObjectInfo,
lCount);
}
+
+ if ( pVolumeCB)
+ {
+
+ 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);
+ }
}
return ntStatus;
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:
// The Volume list may move under our feet. Lock it.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFindFcbToClean Acquiring VolumeRoot ObjectInfoTree lock %08lX SHARED %08lX\n",
- pVolumeCB->ObjectInfoTree.TreeLock,
- PsGetCurrentThread());
-
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;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFindFcbToClean Acquiring VolumeRoot ObjectInfoTree lock %08lX SHARED %08lX\n",
+ pVolumeCB->ObjectInfoTree.TreeLock,
+ PsGetCurrentThread());
+
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
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,
if( pVolumeCB != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessExtentFailure Acquiring VolumeRoot FileIDTree.TreeLock lock %08lX SHARED %08lX\n",
- pVolumeCB->ObjectInfoTree.TreeLock,
- 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);
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessExtentFailure Acquiring VolumeRoot FileIDTree.TreeLock lock %08lX SHARED %08lX\n",
+ pVolumeCB->ObjectInfoTree.TreeLock,
+ PsGetCurrentThread());
+
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
//
// 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,
try_exit:
- NOTHING;
+ if ( pVolumeCB)
+ {
+
+ 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);
+ }
}
return ntStatus;
if( pVolumeCB != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSProcessReleaseFileExtents Acquiring VolumeRoot FileIDTree.TreeLock lock %08lX SHARED %08lX\n",
- pVolumeCB->ObjectInfoTree.TreeLock,
- 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);
try_return( ntStatus = STATUS_UNSUCCESSFUL);
}
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSProcessReleaseFileExtents Acquiring VolumeRoot FileIDTree.TreeLock lock %08lX SHARED %08lX\n",
+ pVolumeCB->ObjectInfoTree.TreeLock,
+ PsGetCurrentThread());
+
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
//
// 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,
pObjectInfo,
lCount);
}
+
+ if ( pVolumeCB)
+ {
+
+ 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);
+
+ }
}
return ntStatus;
__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);
}
}
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;
}
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);
}
}