Windows: Fcb sectionObjectResource
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSExtentsSupport.cpp
index 705ae6c..60d0e50 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,6 +97,41 @@ 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);
+    }
+
+    AFSExFreePoolWithTag( pExtent, AFS_EXTENT_TAG);
+}
+
 //
 // AFSTearDownFcbExtents was originally written to
 // remove all of the extents from an FCB.  For that to happen
@@ -119,8 +150,8 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
     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;
@@ -186,16 +217,18 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
         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;
@@ -205,16 +238,14 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                 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))
@@ -225,7 +256,7 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                         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);
 
@@ -244,31 +275,16 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                                   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);
                 }
             }
 
@@ -296,7 +312,7 @@ AFSTearDownFcbExtents( IN AFSFcb *Fcb,
                 // 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,
@@ -377,7 +393,7 @@ try_exit:
         if (pRelease)
         {
 
-            AFSExFreePool( pRelease);
+            AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
         }
     }
 }
@@ -613,13 +629,7 @@ BOOLEAN AFSDoExtentsMapRegion(IN AFSFcb *Fcb,
     __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
         {
@@ -678,14 +688,6 @@ BOOLEAN AFSDoExtentsMapRegion(IN AFSFcb *Fcb,
 
 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;
     }
 
@@ -748,11 +750,33 @@ AFSRequestExtentsAsync( IN AFSFcb *Fcb,
         // 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);
         }
 
@@ -789,6 +813,8 @@ AFSRequestExtentsAsync( IN AFSFcb *Fcb,
                                        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",
@@ -838,17 +864,14 @@ AFSRequestExtentsAsync( IN AFSFcb *Fcb,
                 }
             }
 
-            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:
 
@@ -1174,29 +1197,6 @@ AFSProcessExtentsResult( IN AFSFcb *Fcb,
                 //
                 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
                 //
@@ -1301,6 +1301,12 @@ AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents )
                           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);
@@ -1326,6 +1332,12 @@ AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents )
 
         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
         //
@@ -1343,7 +1355,7 @@ AFSProcessSetFileExtents( IN AFSSetFileExtentsCB *SetExtents )
             // 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,
@@ -1424,7 +1436,7 @@ try_exit:
         if( pObjectInfo != NULL)
         {
 
-            lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+            lCount = AFSObjectInfoDecrement( pObjectInfo);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -1648,37 +1660,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:
@@ -1733,6 +1716,12 @@ AFSFindFcbToClean(ULONG IgnoreTime, AFSFcb *LastFcb, BOOLEAN Block)
 
         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;
@@ -1742,6 +1731,12 @@ AFSFindFcbToClean(ULONG IgnoreTime, AFSFcb *LastFcb, BOOLEAN Block)
 
         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)
         {
 
@@ -1858,7 +1853,7 @@ AFSFindFcbToClean(ULONG IgnoreTime, AFSFcb *LastFcb, BOOLEAN Block)
                 // 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,
@@ -1957,6 +1952,12 @@ AFSProcessExtentFailure( PIRP Irp)
                           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);
@@ -1978,6 +1979,11 @@ AFSProcessExtentFailure( PIRP Irp)
 
         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
         //
@@ -1996,7 +2002,7 @@ AFSProcessExtentFailure( PIRP Irp)
             // 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,
@@ -2057,7 +2063,7 @@ AFSProcessExtentFailure( PIRP Irp)
 
         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
 
-        lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+        lCount = AFSObjectInfoDecrement( pObjectInfo);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -2196,6 +2202,12 @@ AFSProcessReleaseFileExtents( IN PIRP Irp)
                               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);
@@ -2217,6 +2229,12 @@ AFSProcessReleaseFileExtents( IN PIRP Irp)
 
             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
             //
@@ -2234,7 +2252,7 @@ AFSProcessReleaseFileExtents( IN PIRP Irp)
                 // 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,
@@ -2442,7 +2460,7 @@ try_exit:
             Irp->AssociatedIrp.SystemBuffer != pResult)
         {
 
-            AFSExFreePool(pResult);
+            AFSExFreePoolWithTag(pResult, AFS_EXTENTS_RESULT_TAG);
         }
 
         if (NT_SUCCESS(ntStatus))
@@ -2459,7 +2477,7 @@ try_exit:
         if( pObjectInfo != NULL)
         {
 
-            lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+            lCount = AFSObjectInfoDecrement( pObjectInfo);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -2591,6 +2609,8 @@ AFSFlushExtents( IN AFSFcb *Fcb,
     __Enter
     {
 
+        lCount = InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
+
         if( pAuthGroup == NULL ||
             RtlCompareMemory( pAuthGroup,
                               &Fcb->NPFcb->Specific.File.ExtentsRequestAuthGroup,
@@ -2622,8 +2642,6 @@ AFSFlushExtents( IN AFSFcb *Fcb,
 
         bExtentsLocked = TRUE;
 
-        lCount = InterlockedIncrement( &Fcb->Specific.File.QueuedFlushCount);
-
         //
         // Clear our queued flush event
         //
@@ -2739,35 +2757,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 ++;
 
@@ -2839,6 +2830,7 @@ AFSFlushExtents( IN AFSFcb *Fcb,
                               ntStatus);
 
             }
+
             AFSLockForExtentsTrim( Fcb);
 
             bExtentsLocked = TRUE;
@@ -2848,6 +2840,8 @@ try_exit:
 
         lCount = InterlockedDecrement( &Fcb->Specific.File.QueuedFlushCount);
 
+       ASSERT( lCount >= 0);
+
         if( lCount == 0)
         {
 
@@ -2874,7 +2868,7 @@ try_exit:
 
         if (pRelease)
         {
-            AFSExFreePool( pRelease);
+            AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
         }
     }
 
@@ -2883,7 +2877,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 +2949,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 +3044,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 ++;
             }
@@ -3169,7 +3134,7 @@ try_exit:
 
         if (pRelease)
         {
-            AFSExFreePool( pRelease);
+            AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
         }
     }
 
@@ -3312,33 +3277,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 ++;
             }
@@ -3427,7 +3367,7 @@ try_exit:
 
         if (pRelease)
         {
-            AFSExFreePool( pRelease);
+            AFSExFreePoolWithTag( pRelease, AFS_EXTENT_RELEASE_TAG);
         }
     }
 
@@ -3448,7 +3388,6 @@ AFSMarkDirty( IN AFSFcb *Fcb,
     ULONG ulCount = 0;
     BOOLEAN bInsertTail = FALSE, bInsertHead = FALSE;
     LONG lCount;
-    BOOLEAN bLocked = FALSE;
 
     AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                   AFS_TRACE_LEVEL_VERBOSE,
@@ -3456,11 +3395,7 @@ AFSMarkDirty( IN AFSFcb *Fcb,
                   &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);
@@ -3622,11 +3557,6 @@ AFSMarkDirty( IN AFSFcb *Fcb,
                   &Fcb->NPFcb->Specific.File.ExtentsResource,
                   PsGetCurrentThread());
 
-    if( bLocked)
-    {
-        AFSReleaseResource( &Fcb->NPFcb->Specific.File.ExtentsResource );
-    }
-
     return;
 }
 
@@ -3637,16 +3567,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 );
 }
 
@@ -3829,14 +3763,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",
@@ -3848,28 +3774,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);
             }
         }
 
@@ -3956,14 +3864,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",
@@ -3975,28 +3875,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
@@ -4399,7 +4281,7 @@ AFSSetupMD5Hash( IN AFSFcb *Fcb,
         if( pExtentBuffer != NULL)
         {
 
-            AFSExFreePool( pExtentBuffer);
+            AFSExFreePoolWithTag( pExtentBuffer, AFS_GENERIC_MEMORY_9_TAG);
         }
     }