Windows: Introduce AFSFreeExtent()
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSExtentsSupport.cpp
index b482378..83d2986 100644 (file)
@@ -39,7 +39,6 @@
 
 #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);
@@ -56,16 +55,14 @@ AFSEntryForOffset( IN AFSFcb *Fcb,
 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;
 }
@@ -76,15 +73,14 @@ AFSLockForExtentsTrim( IN AFSFcb *Fcb)
 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
@@ -93,7 +89,7 @@ AFSLockForExtentsTrimNoWait( IN AFSFcb *Fcb)
         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;
@@ -101,18 +97,61 @@ AFSLockForExtentsTrimNoWait( IN AFSFcb *Fcb)
 
     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;
@@ -161,10 +200,6 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
             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,
@@ -176,63 +211,43 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
             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))
                     {
 
@@ -248,115 +263,114 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                         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;
 
@@ -380,8 +394,6 @@ try_exit:
             AFSExFreePool( pRelease);
         }
     }
-
-    return bFoundExtents;
 }
 
 static PAFSExtent
@@ -668,12 +680,14 @@ BOOLEAN AFSDoExtentsMapRegion(IN AFSFcb *Fcb,
                 entry = newEntry;
             }
         }
-        __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+        __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
         {
 
             AFSDbgLogMsg( 0,
                           0,
                           "EXCEPTION - AFSDoExtentsMapRegion\n");
+
+            AFSDumpTraceFilesFnc();
         }
 
 try_exit:
@@ -1648,37 +1662,8 @@ AFSReleaseSpecifiedExtents( IN  AFSReleaseFileExtentsCB *Extents,
             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:
@@ -2739,35 +2724,8 @@ AFSFlushExtents( IN AFSFcb *Fcb,
 
                 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 ++;
 
@@ -2883,7 +2841,8 @@ try_exit:
 
 NTSTATUS
 AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
-                            IN GUID *AuthGroup)
+                            IN GUID *AuthGroup,
+                            IN BOOLEAN bReleaseAll)
 {
     AFSNonPagedFcb      *pNPFcb = Fcb->NPFcb;
     AFSExtent           *pExtent;
@@ -2954,18 +2913,15 @@ AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
             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)
@@ -3052,35 +3008,8 @@ AFSReleaseExtentsWithFlush( IN AFSFcb *Fcb,
                     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 ++;
             }
@@ -3312,33 +3241,8 @@ AFSReleaseCleanExtents( IN AFSFcb *Fcb,
                 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 ++;
             }
@@ -3604,12 +3508,14 @@ AFSMarkDirty( IN AFSFcb *Fcb,
             ulCount++;
         }
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
         AFSDbgLogMsg( 0,
                       0,
                       "EXCEPTION - AFSMarkDirty\n");
+
+        AFSDumpTraceFilesFnc();
     }
 
     AFSReleaseResource( &pNPFcb->Specific.File.DirtyExtentsListLock);
@@ -3635,16 +3541,20 @@ AFSMarkDirty( IN AFSFcb *Fcb,
 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 );
 }
 
@@ -3827,14 +3737,6 @@ AFSTrimExtents( IN AFSFcb *Fcb,
                     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",
@@ -3846,28 +3748,10 @@ AFSTrimExtents( IN AFSFcb *Fcb,
                               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);
             }
         }
 
@@ -3954,14 +3838,6 @@ AFSTrimSpecifiedExtents( IN AFSFcb *Fcb,
 
                 }
 
-                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",
@@ -3973,28 +3849,10 @@ AFSTrimSpecifiedExtents( IN AFSFcb *Fcb,
                               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
@@ -4382,12 +4240,14 @@ AFSSetupMD5Hash( IN AFSFcb *Fcb,
                           PsGetCurrentThread());
 
         }
-        __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+        __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
         {
 
             AFSDbgLogMsg( 0,
                           0,
                           "EXCEPTION - AFSSetupMD5Hash\n");
+
+            AFSDumpTraceFilesFnc();
         }
 
         AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );