LIST_ENTRY *le, *leNext;
AFSExtent *pEntry;
LONG lExtentCount = 0, lProcessCount = 0;
+ LONG lFcbExtentCount;
ULONG ulReleaseCount = 0;
size_t sz;
AFSReleaseExtentsCB *pRelease = NULL;
TRUE);
for( le = Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink,
- lExtentCount = 0;
- lExtentCount < Fcb->Specific.File.ExtentCount;
+ lExtentCount = 0,
+ lFcbExtentCount = Fcb->Specific.File.ExtentCount;
+ lExtentCount < lFcbExtentCount;
lExtentCount += lProcessCount)
{
for( lProcessCount = 0, ulReleaseCount = 0;
!IsListEmpty( le) &&
ulReleaseCount < AFS_MAXIMUM_EXTENT_RELEASE_COUNT &&
- lExtentCount + lProcessCount < Fcb->Specific.File.ExtentCount;
+ lExtentCount + lProcessCount < lFcbExtentCount;
lProcessCount++, le = leNext)
{
}
}
+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,
//
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
//
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;
// 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)
{
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
//
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
//
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;
ntStatus);
}
+
AFSLockForExtentsTrim( Fcb);
bExtentsLocked = TRUE;
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;
}