if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
- ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDirEntry = NULL;
}
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
- ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDotDirEntry = NULL;
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
AFSObjectInfoCB * pParentObjectInfo = NULL;
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Acquiring Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
TRUE);
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
- //
- // Clear out the extents
- // Get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Releasing Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
- NULL);
+ AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ //
+ // Clear out the extents
+ // Get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
+
+ AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+ NULL);
+ }
}
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
NTSTATUS
AFSVerifyEntry( IN GUID *AuthGroup,
- IN AFSDirectoryCB *DirEntry)
+ IN AFSDirectoryCB *DirEntry,
+ IN BOOLEAN bFollowMountPoint)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
IO_STATUS_BLOCK stIoStatus;
ntStatus = AFSEvaluateTargetByID( pObjectInfo,
AuthGroup,
- FALSE,
+ bFollowMountPoint ? FALSE : TRUE,
&pDirEnumEntry);
if( !NT_SUCCESS( ntStatus))
// Check the data version of the file
//
- if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart)
- {
- if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
- {
+ if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart &&
+ !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ {
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->DataVersion.QuadPart,
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique));
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry No DV change %I64X for Fcb %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ pObjectInfo->DataVersion.QuadPart,
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
- //
- // We are ok, just get out
- //
+ //
+ // We are ok, just get out
+ //
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- try_return( ntStatus = STATUS_SUCCESS);
- }
+ try_return( ntStatus = STATUS_SUCCESS);
}
//
case AFS_FILE_TYPE_FILE:
{
FILE_OBJECT * pCCFileObject = NULL;
- BOOLEAN bPurgeExtents = FALSE;
-
- if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- pObjectInfo->DataVersion.LowPart,
- pDirEnumEntry->DataVersion.LowPart));
-
- bPurgeExtents = TRUE;
- }
if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
{
- bPurgeExtents = TRUE;
-
AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique));
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
ntStatus = stIoStatus.Status;
}
- if ( bPurgeExtents &&
- pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ if ( pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
- if ( bPurgeExtents)
- {
- AFSFlushExtents( pObjectInfo->Fcb,
- AuthGroup);
- }
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- //
- // Reacquire the Fcb to purge the cache
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->Resource,
- PsGetCurrentThread()));
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
+ AFSFlushExtents( pObjectInfo->Fcb,
+ AuthGroup);
+
+ //
+ // Acquire the Fcb to purge the cache
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+ }
//
// Update the metadata for the entry
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
ntStatus));
-
- break;
}
-
- //
- // Update file sizes
- //
-
- pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
- pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
- pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread()));
-
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- TRUE);
-
- pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
-
- if ( pCCFileObject != NULL)
- {
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ else
+ {
+
+ //
+ // Update file sizes
+ //
+
+ pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
+ pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+
+ if ( pCCFileObject != NULL)
+ {
+ CcSetFileSizes( pCCFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSVerifyEntry CcSetFileSized failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
PsGetCurrentThread()));
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
-
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
}
else
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
ntStatus));
-
- break;
}
-
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique));
+ else
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+ }
}
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ if ( NT_SUCCESS( ntStatus))
+ {
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
break;
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LARGE_INTEGER liSystemTime;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSFcb *pCurrentFcb = NULL;
AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
TRUE);
- bReleaseFcb = TRUE;
- }
-
- if( pCurrentFcb != NULL)
- {
-
- IO_STATUS_BLOCK stIoStatus;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique));
-
- if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- pObjectInfo->DataVersion.LowPart,
- pDirEnumEntry->DataVersion.LowPart));
-
- bPurgeExtents = TRUE;
- }
-
- if ( bSafeToPurge)
- {
-
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
- {
- bPurgeExtents = TRUE;
-
- AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique));
-
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
-
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread()));
-
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- TRUE);
-
- //
- // Release Fcb->Resource to avoid Trend Micro deadlock
- //
-
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
-
- __try
- {
-
- CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
-
- if( !NT_SUCCESS( stIoStatus.Status))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- stIoStatus.Status,
- stIoStatus.Information));
-
- ntStatus = stIoStatus.Status;
- }
-
- if ( bPurgeExtents &&
- pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
- {
-
- if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE))
- {
-
- AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique));
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
- }
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
- ntStatus = GetExceptionCode();
-
- AFSDbgTrace(( 0,
- 0,
- "EXCEPTION - AFSValidateEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- ntStatus));
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
-
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread()));
-
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
-
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
- }
- else
- {
-
- if ( bPurgeExtents)
- {
-
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
- }
-
-
- AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
- bReleaseFcb = FALSE;
-
- if ( bPurgeExtents &&
- bSafeToPurge)
- {
- AFSFlushExtents( pCurrentFcb,
- AuthGroup);
- }
- }
- }
+ bReleaseFcb = TRUE;
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pObjectInfo->DataVersion.LowPart,
+ pDirEnumEntry->DataVersion.LowPart));
+
+ bPurgeExtents = TRUE;
+ }
+
+ if ( bSafeToPurge)
+ {
+
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ {
+ bPurgeExtents = TRUE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pCurrentFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ IO_STATUS_BLOCK stIoStatus;
+
+ CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
+
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ stIoStatus.Status,
+ stIoStatus.Information));
+
+ ntStatus = stIoStatus.Status;
+ }
+
+ if ( bPurgeExtents &&
+ pCurrentFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSValidateEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
+
+ SetFlag( pCurrentFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pCurrentFcb->NPFcb->SectionObjectResource);
+ }
+ else
+ {
+
+ if ( bPurgeExtents)
+ {
+
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+ }
+
+ if (bReleaseFcb)
+ {
+ AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
+
+ bReleaseFcb = FALSE;
+ }
+
+ if ( bPurgeExtents &&
+ bSafeToPurge)
+ {
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ AFSFlushExtents( pCurrentFcb,
+ AuthGroup);
+ }
+ }
+ }
//
// Update the metadata for the entry but only if it is safe to do so.
{
FILE_OBJECT *pCCFileObject;
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->SectionObjectResource,
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+ __try
+ {
- pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
- pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
- pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
- if ( pCCFileObject != NULL)
+ pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
+ pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+ if ( pCCFileObject != NULL)
+ {
+ CcSetFileSizes( pCCFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSValidateEntry CcSetFileSizes failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->SectionObjectResource,
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
- ExFreePool( pDirNode->NonPaged);
+ AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
pDirNode = pLastDirNode;
}
pDirGlobalDirNode = (AFSDirectoryCB *)pDirGlobalDirNode->ListEntry.fLink;
}
- AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+ AFSLibExFreePoolWithTag( uniFullName.Buffer,
+ AFS_GENERIC_MEMORY_12_TAG);
try_exit:
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Acquiring Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
PsGetCurrentThread()));
- AFSAcquireShared( &Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &Fcb->NPFcb->Resource,
TRUE);
if( Fcb->OpenReferenceCount > 0)
{
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Releasing Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
PsGetCurrentThread()));
AFSReleaseResource( &Fcb->NPFcb->Resource);
- //
- // Wait for any currently running flush or release requests to complete
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // Wait for any currently running flush or release requests to complete
+ //
- AFSWaitOnQueuedFlushes( Fcb);
+ AFSWaitOnQueuedFlushes( Fcb);
- //
- // Now perform another flush on the file
- //
+ //
+ // Now perform another flush on the file
+ //
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)))
- {
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)))
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
- }
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
+ }
- if( Fcb->OpenReferenceCount == 0 ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( Fcb->OpenReferenceCount == 0 ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
try_return( ntStatus);
}
KeQueryTickCount( &liTime);
- //
- // First up are there dirty extents in the cache to flush?
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // First up are there dirty extents in the cache to flush?
+ //
- if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
+ if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
- //
- // The file has been marked as invalid. Dump it
- //
+ //
+ // The file has been marked as invalid. Dump it
+ //
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
- else if( ForceFlush ||
- ( ( Fcb->Specific.File.ExtentsDirtyCount ||
- Fcb->Specific.File.ExtentCount) &&
- (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
- >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
- {
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)) &&
- Fcb->OpenReferenceCount == 0)
- {
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ else if( ForceFlush ||
+ ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+ Fcb->Specific.File.ExtentCount) &&
+ (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+ >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)) &&
+ Fcb->OpenReferenceCount == 0)
+ {
+
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
}
//
(AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
{
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Acquiring Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush) == FALSE)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Failed to Acquire Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ try_return( ntStatus = STATUS_RETRY);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
ntStatus));
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
- if( Fcb->OpenReferenceCount <= 0)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- //
- // Tear em down we'll not be needing them again
- //
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ if( Fcb->OpenReferenceCount <= 0)
+ {
+
+ //
+ // Tear em down we'll not be needing them again
+ //
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
}
else
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Failed to Acquire Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
+
ntStatus = STATUS_RETRY;
}
}
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
- ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDirEntry = NULL;
}
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
- ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDotDirEntry = NULL;
}
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
- ExFreePool( pDirNode->NonPaged);
+ AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
pDirNode = pLastDirNode;
}
if( pRelativeSecurityDescr != NULL)
{
- ExFreePool( pRelativeSecurityDescr);
+
+ AFSLibExFreePoolWithTag( pRelativeSecurityDescr,
+ AFS_GENERIC_MEMORY_27_TAG);
}
}
if( pSecurityDescr != NULL)
{
- ExFreePool( pSecurityDescr);
+
+ AFSLibExFreePoolWithTag( pSecurityDescr,
+ AFS_GENERIC_MEMORY_27_TAG);
}
if( pSACL != NULL)
{
- ExFreePool( pSACL);
+
+ AFSLibExFreePoolWithTag( pSACL,
+ AFS_GENERIC_MEMORY_29_TAG);
}
if( pACE != NULL)
{
- ExFreePool( pACE);
+
+ AFSLibExFreePoolWithTag( pACE,
+ AFS_GENERIC_MEMORY_29_TAG);
}
if( pWorldSID != NULL)
{
- ExFreePool( pWorldSID);
+
+ AFSLibExFreePoolWithTag( pWorldSID,
+ AFS_GENERIC_MEMORY_29_TAG);
}
}
AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
- LIST_ENTRY *le;
- AFSExtent *pEntry;
- ULONG ulProcessCount = 0;
- ULONG ulCount = 0;
LONG lCount;
__Enter
{
- switch( InvalidateReason)
+ switch( InvalidateReason)
{
case AFS_INVALIDATE_DELETED:
{
- if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
ObjectInfo->Fcb != NULL)
{
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- ObjectInfo->Links = 0;
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
- ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+ ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
- KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
- 0,
- FALSE);
+ KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+ 0,
+ FALSE);
- //
- // Clear out the extents
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ //
+ // Clear out the extents
+ // And get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
- AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+ }
+ }
+
+ ObjectInfo->Links = 0;
break;
}
case AFS_INVALIDATE_DATA_VERSION:
{
- LARGE_INTEGER liCurrentOffset = {0,0};
- LARGE_INTEGER liFlushLength = {0,0};
- ULONG ulFlushLength = 0;
- BOOLEAN bLocked = FALSE;
- BOOLEAN bExtentsLocked = FALSE;
- BOOLEAN bCleanExtents = FALSE;
-
if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
ObjectInfo->Fcb != NULL)
{
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
-
- bLocked = TRUE;
-
if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
{
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation DirectIO Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
- bLocked = FALSE;
-
- __try
+ __try
{
if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- else
- {
-
- bCleanExtents = TRUE;
- }
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation DirectIO Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
PsGetCurrentThread()));
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
- }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation DirectIO Releasing Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ }
else
{
+ LIST_ENTRY *le;
+ AFSExtent *pEntry;
+ ULONG ulProcessCount = 0;
+ ULONG ulCount = 0;
+ LARGE_INTEGER liCurrentOffset = {0,0};
+ LARGE_INTEGER liFlushLength = {0,0};
+ ULONG ulFlushLength = 0;
+ BOOLEAN bLocked = FALSE;
+ BOOLEAN bExtentsLocked = FALSE;
+ BOOLEAN bCleanExtents = FALSE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ bLocked = TRUE;
AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
else
{
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
- bLocked = FALSE;
-
__try
{
bCleanExtents = TRUE;
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
PsGetCurrentThread()));
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
}
}
else
bExtentsLocked = FALSE;
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
- bLocked = FALSE;
-
//
// Must build a list of non-dirty ranges from the beginning of the file
// to the end. There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
ntStatus = GetExceptionCode();
ntStatus));
}
- AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&ObjectInfo->Fcb->NPFcb->SectionObjectResource,
PsGetCurrentThread()));
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
}
}
AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
}
- }
- if ( bLocked)
- {
+ if ( bLocked)
+ {
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ }
- if ( bCleanExtents)
- {
+ if ( bCleanExtents)
+ {
- AFSReleaseCleanExtents( ObjectInfo->Fcb,
- NULL);
- }
+ AFSReleaseCleanExtents( ObjectInfo->Fcb,
+ NULL);
+ }
+ }
}
break;