#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);
+ }
+
+ AFSExFreePool( pExtent);
+}
+
//
-// Pull all the extents away from the FCB.
+// AFSTearDownFcbExtents was originally written to
+// remove all of the extents from an FCB. For that to happen
+// it must be an invariant that the extent list cannot change
+// from the moment the caller decides to execute AFSTearDownFcbExtents
+// until it returns. This invariant does not hold because the
+// the decision to call AFSTearDownFcbExtents is made without
+// holding the ExtentsResource and it is possible that extents
+// are in active use. Therefore, AFSTearDownFcbExtents now releases
+// as many non-active extents as it can.
//
-BOOLEAN
+VOID
AFSTearDownFcbExtents( IN AFSFcb *Fcb,
IN GUID *AuthGroup)
{
- BOOLEAN bFoundExtents = FALSE;
AFSNonPagedFcb *pNPFcb = Fcb->NPFcb;
- LIST_ENTRY *le;
+ LIST_ENTRY *le, *leNext;
AFSExtent *pEntry;
- ULONG ulCount = 0, ulReleaseCount = 0, ulProcessCount = 0;
+ LONG lExtentCount = 0;
+ ULONG ulReleaseCount = 0, ulProcessCount = 0;
size_t sz;
AFSReleaseExtentsCB *pRelease = NULL;
BOOLEAN locked = FALSE;
try_return ( ntStatus = STATUS_SUCCESS);
}
- //
- // Release a max of 100 extents at a time
- //
-
sz = sizeof( AFSReleaseExtentsCB ) + (AFS_MAXIMUM_EXTENT_RELEASE_COUNT * sizeof ( AFSFileExtentCB ));
pRelease = (AFSReleaseExtentsCB*) AFSExAllocatePoolWithTag( NonPagedPool,
try_return ( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
}
- le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
-
- ulCount = Fcb->Specific.File.ExtentCount;
+ AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
+ TRUE);
- while( ulReleaseCount < ulCount)
+ for( le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink,
+ lExtentCount = 0;
+ lExtentCount < Fcb->Specific.File.ExtentCount;
+ lExtentCount += ulProcessCount)
{
- bFoundExtents = TRUE;
-
RtlZeroMemory( pRelease,
sizeof( AFSReleaseExtentsCB ) +
(AFS_MAXIMUM_EXTENT_RELEASE_COUNT * sizeof ( AFSFileExtentCB )));
- if( ulCount - ulReleaseCount <= AFS_MAXIMUM_EXTENT_RELEASE_COUNT)
+ for( ulProcessCount = 0, ulReleaseCount = 0;
+ !IsListEmpty( le) && ulReleaseCount < AFS_MAXIMUM_EXTENT_RELEASE_COUNT;
+ ulProcessCount++, le = leNext)
{
- ulProcessCount = ulCount - ulReleaseCount;
- }
- else
- {
- ulProcessCount = AFS_MAXIMUM_EXTENT_RELEASE_COUNT;
- }
- pRelease->Flags = AFS_EXTENT_FLAG_RELEASE;
- pRelease->ExtentCount = ulProcessCount;
-
- //
- // Update the metadata for this call
- //
+ leNext = le->Flink;
- 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;
+ pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
- ulProcessCount = 0;
+ if( pEntry->ActiveCount == 0)
+ {
- while (ulProcessCount < pRelease->ExtentCount)
- {
- pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+ ulReleaseCount++;
- pRelease->FileExtents[ulProcessCount].Flags = AFS_EXTENT_FLAG_RELEASE;
+ pRelease->FileExtents[ulProcessCount].Flags = AFS_EXTENT_FLAG_RELEASE;
#if GEN_MD5
- RtlCopyMemory( pRelease->FileExtents[ulProcessCount].MD5,
- pEntry->MD5,
- sizeof(pEntry->MD5));
+ RtlCopyMemory( pRelease->FileExtents[ulProcessCount].MD5,
+ pEntry->MD5,
+ sizeof(pEntry->MD5));
- pRelease->FileExtents[ulProcessCount].Flags |= AFS_EXTENT_FLAG_MD5_SET;
+ pRelease->FileExtents[ulProcessCount].Flags |= AFS_EXTENT_FLAG_MD5_SET;
#endif
- if( BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
- {
-
- AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
- TRUE);
-
if( BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
{
ASSERT( dirtyCount >= 0);
}
- AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSTearDownFcbExtents Releasing 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);
+
+ 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;
+
+ AFSFreeExtent( Fcb,
+ pEntry);
}
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSTearDownFcbExtents Releasing 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);
+ if ( ulReleaseCount > 0)
+ {
- 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->ExtentCount = ulReleaseCount;
- InterlockedExchangeAdd( &pControlDevExt->Specific.Control.ExtentsHeldLength, -((LONG)(pEntry->Size/1024)));
+ pRelease->Flags = AFS_EXTENT_FLAG_RELEASE;
- InterlockedExchangeAdd( &Fcb->Specific.File.ExtentLength, -((LONG)(pEntry->Size/1024)));
+ //
+ // Update the metadata for this call
+ //
- ASSERT( pEntry->ActiveCount == 0);
+ 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;
- ulProcessCount ++;
- le = le->Flink;
- AFSExFreePool( pEntry);
+ //
+ // Send the request down. We cannot send this down
+ // asynchronously - if we did that we could request them
+ // back before the service got this request and then this
+ // request would be a corruption.
+ //
- lCount = InterlockedDecrement( &Fcb->Specific.File.ExtentCount);
+ sz = sizeof( AFSReleaseExtentsCB ) + (ulProcessCount * sizeof ( AFSFileExtentCB ));
- lCount = InterlockedDecrement( &pControlDevExt->Specific.Control.ExtentCount);
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RELEASE_FILE_EXTENTS,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ pAuthGroup,
+ NULL,
+ &Fcb->ObjectInformation->FileId,
+ pRelease,
+ sz,
+ NULL,
+ NULL);
- if( lCount == 0)
+ if( !NT_SUCCESS(ntStatus))
{
- KeSetEvent( &pControlDevExt->Specific.Control.ExtentsHeldEvent,
- 0,
- FALSE);
- }
- }
-
- //
- // Send the request down. We cannot send this down
- // asynchronously - if we did that we could request them
- // back before the service got this request and then this
- // request would be a corruption.
- //
-
- sz = sizeof( AFSReleaseExtentsCB ) + (ulProcessCount * sizeof ( AFSFileExtentCB ));
-
- 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.
- //
+ //
+ // 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,
- "AFSTearDownFcbExtents 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);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSTearDownFcbExtents 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);
+ }
}
-
- ulReleaseCount += ulProcessCount;
}
+ AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+
//
- // Reinitialize the skip lists
+ // if all extents have been released, reinitialize the skip lists
//
- ASSERT( Fcb->Specific.File.ExtentCount == 0);
-
- for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i++)
+ if( Fcb->Specific.File.ExtentCount == 0)
{
- InitializeListHead(&Fcb->Specific.File.ExtentsLists[i]);
- }
- //
- // Reinitialize the dirty list as well
- //
+ for (ULONG i = 0; i < AFS_NUM_EXTENT_LISTS; i++)
+ {
+ InitializeListHead(&Fcb->Specific.File.ExtentsLists[i]);
+ }
- AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
- TRUE);
+ //
+ // Reinitialize the dirty list as well
+ //
+
+ AFSAcquireExcl( &pNPFcb->Specific.File.DirtyExtentsListLock,
+ TRUE);
- ASSERT( Fcb->Specific.File.ExtentsDirtyCount == 0);
+ ASSERT( Fcb->Specific.File.ExtentsDirtyCount == 0);
- Fcb->NPFcb->Specific.File.DirtyListHead = NULL;
- Fcb->NPFcb->Specific.File.DirtyListTail = NULL;
+ Fcb->NPFcb->Specific.File.DirtyListHead = NULL;
+ Fcb->NPFcb->Specific.File.DirtyListTail = NULL;
- AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
+ }
Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
AFSExFreePool( pRelease);
}
}
-
- return bFoundExtents;
}
static PAFSExtent
entry = newEntry;
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSDoExtentsMapRegion\n");
+
+ AFSDumpTraceFilesFnc();
}
try_exit:
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:
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
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 ++;
}
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 ++;
}
ulCount++;
}
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSMarkDirty\n");
+
+ AFSDumpTraceFilesFnc();
}
AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
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
PsGetCurrentThread());
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
AFSDbgLogMsg( 0,
0,
"EXCEPTION - AFSSetupMD5Hash\n");
+
+ AFSDumpTraceFilesFnc();
}
AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );