//
ULONG
-AFSExceptionFilter( IN ULONG Code,
+AFSExceptionFilter( IN CHAR *FunctionString,
+ IN ULONG Code,
IN PEXCEPTION_POINTERS ExceptPtrs)
{
AFSDbgLogMsg( 0,
0,
- "AFSExceptionFilter (Library) - EXR %p CXR %p Code %08lX Address %p Routine %p\n",
+ "AFSExceptionFilter (Library) - EXR %p CXR %p Function %s Code %08lX Address %p Routine %p\n",
ExceptRec,
Context,
+ FunctionString,
ExceptRec->ExceptionCode,
ExceptRec->ExceptionAddress,
(void *)AFSExceptionFilter);
pAddress = MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority );
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
+ AFSDumpTraceFilesFnc();
+
IoFreeMdl( Irp->MdlAddress );
Irp->MdlAddress = NULL;
pAddress = NULL;
pAddress = MmGetSystemAddressForMdlSafe( pMdl,
NormalPagePriority);
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
+ AFSDumpTraceFilesFnc();
+
IoFreeMdl( pMdl);
pMdl = NULL;
pAddress = NULL;
AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
NULL,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_ATTRIBUTES,
+ ulFilter,
FILE_ACTION_MODIFIED);
try_return( ntStatus);
ntStatus = stIoStatus.Status;
}
- CcPurgeCacheSection( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( !CcPurgeCacheSection( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSInvalidateObject CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique);
+
+ SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
+
+ AFSDbgLogMsg( 0,
+ 0,
+ "EXCEPTION - AFSInvalidateObject Cc FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique,
+ ntStatus);
+
+ SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
// for any writes or reads to the cache to complete)
//
- (VOID) AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
- NULL);
+ AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+ NULL);
}
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
+ AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateCache Invalidation FAILURE Unable to locate object FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
InvalidateCB->FileID.Cell,
InvalidateCB->FileID.Volume,
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry Evaluate Target failed %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ "AFSVerifyEntry Evaluate Target failed %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
// Check the data version of the file
//
- if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart &&
- !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart)
{
+ if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ {
- AFSDbgLogMsg( 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);
+ AFSDbgLogMsg( 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);
+ }
}
//
FILE_OBJECT * pCCFileObject = NULL;
BOOLEAN bPurgeExtents = FALSE;
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
{
- bPurgeExtents = TRUE;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "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->FileId.Unique,
+ pObjectInfo->DataVersion.LowPart,
+ pDirEnumEntry->DataVersion.LowPart
+ );
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ bPurgeExtents = TRUE;
}
- //
- // Update the metadata for the entry
- //
-
- ntStatus = AFSUpdateMetaData( DirEntry,
- pDirEnumEntry);
-
- if( !NT_SUCCESS( ntStatus))
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
{
+ bPurgeExtents = TRUE;
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+ 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,
- ntStatus);
+ pObjectInfo->FileId.Unique);
- break;
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
if( pObjectInfo->Fcb != NULL)
if ( bPurgeExtents)
{
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSVerifyEntry 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();
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSVerifyEntry CcFlushCache or CcPurgeCacheSection Exception %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ AFSDbgLogMsg( 0,
+ 0,
+ "EXCEPTION - AFSVerifyEntry 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);
}
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
TRUE);
//
+ // Update the metadata for the entry
+ //
+
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus);
+
+ break;
+ }
+
+ //
// Update file sizes
//
}
else
{
+
+ //
+ // Update the metadata for the entry
+ //
+
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSVerifyEntry Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus);
+
+ break;
+ }
+
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSValidateEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
// for any writes or reads to the cache to complete)
//
- (VOID) AFSTearDownFcbExtents( pFcb,
- NULL);
+ AFSTearDownFcbExtents( pFcb,
+ NULL);
}
pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
NTSTATUS
AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
IN GUID *AuthGroup,
- IN BOOLEAN PurgeContent,
IN BOOLEAN FastCall)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSValidateEntry Validating entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSValidateEntry Validating entry %wZ FID %08lX-%08lX-%08lX-%08lX FastCall %u\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique,
+ FastCall);
//
// If this is a fake node then bail since the service knows nothing about it
try_return( ntStatus);
}
- if( PurgeContent &&
- pObjectInfo->Fcb != NULL)
- {
-
- pCurrentFcb = pObjectInfo->Fcb;
-
- if( !ExIsResourceAcquiredLite( &pCurrentFcb->NPFcb->Resource))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
- &pCurrentFcb->NPFcb->Resource,
- PsGetCurrentThread());
-
- AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
- TRUE);
-
- bReleaseFcb = TRUE;
- }
- }
-
//
// This routine ensures that the current entry is valid by:
//
// Can't hold the Fcb resource while doing this
//
- if( pCurrentFcb != NULL &&
+ if( pObjectInfo->Fcb != NULL &&
(pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart ||
- BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA)))
+ BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA)))
{
- IO_STATUS_BLOCK stIoStatus;
- BOOLEAN bPurgeExtents = FALSE;
+ pCurrentFcb = pObjectInfo->Fcb;
- AFSDbgLogMsg( 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( !ExIsResourceAcquiredLite( &pCurrentFcb->NPFcb->Resource))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->Resource,
+ PsGetCurrentThread());
+
+ AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
+ TRUE);
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ bReleaseFcb = TRUE;
+ }
+
+ if( pCurrentFcb != NULL)
{
- bPurgeExtents = TRUE;
+
+ IO_STATUS_BLOCK stIoStatus;
+ BOOLEAN bPurgeExtents = FALSE;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ 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);
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
+ if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+ {
- __try
- {
+ AFSDbgLogMsg( 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
+ );
- CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
+ bPurgeExtents = TRUE;
+ }
- if( !NT_SUCCESS( stIoStatus.Status))
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
{
+ bPurgeExtents = TRUE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ AFSDbgLogMsg( 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,
- stIoStatus.Status,
- stIoStatus.Information);
+ pObjectInfo->FileId.Unique);
- ntStatus = stIoStatus.Status;
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
- if ( bPurgeExtents)
+ __try
{
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
- }
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
- ntStatus = GetExceptionCode();
+ CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry CcFlushCache or CcPurgeCacheSection exception %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);
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
- }
+ AFSDbgLogMsg( 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;
+ }
- AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
+ if ( bPurgeExtents)
+ {
- if ( bPurgeExtents)
- {
- AFSFlushExtents( pCurrentFcb,
- AuthGroup);
- }
+ if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
- //
- // Reacquire the Fcb to purge the cache
- //
+ AFSDbgLogMsg( 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);
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
- &pCurrentFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+ ntStatus = GetExceptionCode();
- AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
- TRUE);
+ AFSDbgLogMsg( 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);
+ }
+
+ AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
+
+ bReleaseFcb = FALSE;
+
+ if ( bPurgeExtents)
+ {
+ AFSFlushExtents( pCurrentFcb,
+ AuthGroup);
+ }
+ }
}
//
(PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
}
}
-
break;
}
AFSDirectoryCB *pCurrentDirEntry = NULL;
- if( pCurrentFcb != NULL &&
- pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+ if( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
{
//
AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSValidateDirectoryCache( pCurrentFcb->ObjectInformation,
- AuthGroup);
+ ntStatus = AFSValidateDirectoryCache( pObjectInfo,
+ AuthGroup);
AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
BOOLEAN bIsEqual = FALSE;
- if( FileId1->Unique == FileId2->Unique &&
+ if( FileId1->Hash == FileId2->Hash &&
+ FileId1->Unique == FileId2->Unique &&
FileId1->Vnode == FileId2->Vnode &&
FileId1->Volume == FileId2->Volume &&
FileId1->Cell == FileId2->Cell)
{
AFSNameArrayHdr *pNameArray = NULL;
+ AFSNameArrayCB *pCurrentElement = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LONG lCount;
if( pNameArray == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSInitNameArray Failed to allocate name array\n");
if( DirectoryCB != NULL)
{
- pNameArray->CurrentEntry = &pNameArray->ElementArray[ 0];
+ pCurrentElement = &pNameArray->ElementArray[ 0];
+
+ pNameArray->CurrentEntry = pCurrentElement;
+
+ pNameArray->Count = 1;
- lCount = InterlockedIncrement( &pNameArray->Count);
+ pNameArray->LinkCount = 0;
lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
DirectoryCB,
lCount);
- pNameArray->CurrentEntry->DirectoryCB = DirectoryCB;
+ pCurrentElement->DirectoryCB = DirectoryCB;
- pNameArray->CurrentEntry->Component = DirectoryCB->NameInformation.FileName;
+ pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
+
+ pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
+
+ if( pCurrentElement->FileId.Vnode == 1)
+ {
- pNameArray->CurrentEntry->FileId = DirectoryCB->ObjectInformation->FileId;
+ SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ }
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ pNameArray,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
}
try_exit:
__Enter
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ &Path,
+ DirectoryCB,
+ DirectoryCB->ObjectInformation->FileId.Cell,
+ DirectoryCB->ObjectInformation->FileId.Volume,
+ DirectoryCB->ObjectInformation->FileId.Vnode,
+ DirectoryCB->ObjectInformation->FileId.Unique,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB->ObjectInformation->FileType);
+
//
// Init some info in the header
//
pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
+ pCurrentElement->Flags = 0;
+
+ if( pCurrentElement->FileId.Vnode == 1)
+ {
+
+ SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ }
+
NameArray->Count = 1;
NameArray->LinkCount = 0;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
+
//
// If the root is the parent then we are done ...
//
__Enter
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ RelatedNameArray,
+ DirectoryCB,
+ DirectoryCB->ObjectInformation->FileId.Cell,
+ DirectoryCB->ObjectInformation->FileId.Volume,
+ DirectoryCB->ObjectInformation->FileId.Vnode,
+ DirectoryCB->ObjectInformation->FileId.Unique,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB->ObjectInformation->FileType);
+
//
// Init some info in the header
//
pCurrentElement->FileId = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
+ pCurrentElement->Flags = 0;
+
+ if( pCurrentElement->FileId.Vnode == 1)
+ {
+
+ SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ }
+
lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
lCount = InterlockedIncrement( &NameArray->Count);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ lCount - 1,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
+
if( pCurrentElement->DirectoryCB == DirectoryCB ||
NameArray->Count == RelatedNameArray->Count)
{
pCurrentRelatedElement++;
}
- if( NameArray->Count > 0)
- {
- NameArray->CurrentEntry = pCurrentElement;
- }
+ NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
}
return ntStatus;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount;
+ LONG lCount, lElement;
__Enter
{
- pCurrentElement = &NameArray->ElementArray[ 0];
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFreeNameArray [NA:%p]\n",
+ NameArray);
- while( TRUE)
+ for ( lElement = 0; lElement < NameArray->Count; lElement++)
{
- if( pCurrentElement->DirectoryCB == NULL)
- {
-
- break;
- }
+ pCurrentElement = &NameArray->ElementArray[ lElement];
lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
-
- pCurrentElement++;
}
AFSExFreePool( NameArray);
NTSTATUS
AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry)
+ IN AFSDirectoryCB *DirectoryCB)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+ AFSNameArrayCB *pCurrentElement = NULL;
LONG lCount;
__Enter
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ DirectoryCB,
+ DirectoryCB->ObjectInformation->FileId.Cell,
+ DirectoryCB->ObjectInformation->FileId.Volume,
+ DirectoryCB->ObjectInformation->FileId.Vnode,
+ DirectoryCB->ObjectInformation->FileId.Unique,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB->ObjectInformation->FileType);
+
if( NameArray->Count == NameArray->MaxElementCount)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
+ NameArray);
+
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- if( NameArray->CurrentEntry != NULL &&
- NameArray->CurrentEntry->DirectoryCB == DirEntry)
+ for ( lCount = 0; lCount < NameArray->Count; lCount++)
{
- try_return( ntStatus);
+ if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
+ &DirectoryCB->ObjectInformation->FileId) )
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
+ NameArray,
+ DirectoryCB,
+ STATUS_ACCESS_DENIED);
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
}
if( NameArray->Count > 0)
NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
}
+ pCurrentElement = NameArray->CurrentEntry;
+
lCount = InterlockedIncrement( &NameArray->Count);
- lCount = InterlockedIncrement( &DirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInsertNextElement Increment count on %wZ DE %p Cnt %d\n",
- &DirEntry->NameInformation.FileName,
- DirEntry,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB,
lCount);
- NameArray->CurrentEntry->DirectoryCB = DirEntry;
+ pCurrentElement->DirectoryCB = DirectoryCB;
- NameArray->CurrentEntry->Component = DirEntry->NameInformation.FileName;
+ pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
- NameArray->CurrentEntry->FileId = DirEntry->ObjectInformation->FileId;
+ pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-try_exit:
+ pCurrentElement->Flags = 0;
- NOTHING;
- }
-
- return ntStatus;
-}
-
-void
-AFSReplaceCurrentElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
- LONG lCount;
-
- ASSERT( NameArray->CurrentEntry != NULL);
-
- lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSReplaceCurrentElement Decrement count on %wZ DE %p Cnt %d\n",
- &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
- NameArray->CurrentEntry->DirectoryCB,
- lCount);
-
- lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSReplaceCurrentElement Increment count on %wZ DE %p Cnt %d\n",
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount);
-
- NameArray->CurrentEntry->DirectoryCB = DirectoryCB;
+ if( pCurrentElement->FileId.Vnode == 1)
+ {
- NameArray->CurrentEntry->Component = DirectoryCB->NameInformation.FileName;
+ SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ }
- NameArray->CurrentEntry->FileId = DirectoryCB->ObjectInformation->FileId;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ NameArray->Count - 1,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
- if( DirectoryCB->ObjectInformation->ParentObjectInformation == NULL)
- {
+try_exit:
- SetFlag( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ NOTHING;
}
- return;
+ return ntStatus;
}
AFSDirectoryCB *
AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
{
- AFSDirectoryCB *pCurrentDirEntry = NULL;
+ AFSDirectoryCB *pDirectoryCB = NULL;
+ AFSNameArrayCB *pCurrentElement = NULL;
+ BOOLEAN bVolumeRoot = FALSE;
LONG lCount;
__Enter
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSBackupEntry [NA:%p]\n",
+ NameArray);
+
if( NameArray->Count == 0)
{
- try_return( pCurrentDirEntry);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSBackupEntry [NA:%p] No more entries\n",
+ NameArray);
+
+ try_return( pCurrentElement);
}
lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
if( lCount == 0)
{
NameArray->CurrentEntry = NULL;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSBackupEntry [NA:%p] No more entries\n",
+ NameArray);
}
else
{
+
+ bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+
NameArray->CurrentEntry--;
- pCurrentDirEntry = NameArray->CurrentEntry->DirectoryCB;
+
+ pCurrentElement = NameArray->CurrentEntry;
+
+ pDirectoryCB = pCurrentElement->DirectoryCB;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ NameArray->Count - 1,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
+
+ //
+ // If the entry we are removing is a volume root,
+ // we must remove the mount point entry as well.
+ // If the NameArray was constructed by checking the
+ // share name via the service, the name array can
+ // contain two volume roots in sequence without a
+ // mount point separating them.
+ //
+
+ if ( bVolumeRoot &&
+ !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
+ {
+
+ pDirectoryCB = AFSBackupEntry( NameArray);
+ }
}
+
try_exit:
NOTHING;
}
- return pCurrentDirEntry;
+ return pDirectoryCB;
}
AFSDirectoryCB *
__Enter
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetParentEntry [NA:%p]\n",
+ NameArray);
+
if( NameArray->Count == 0 ||
NameArray->Count == 1)
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSGetParentEntry [NA:%p] No more entries\n",
+ NameArray);
+
try_return( pDirEntry = NULL);
}
pDirEntry = pElement->DirectoryCB;
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ NameArray->Count - 2,
+ pElement->DirectoryCB,
+ pElement->FileId.Cell,
+ pElement->FileId.Volume,
+ pElement->FileId.Vnode,
+ pElement->FileId.Unique,
+ &pElement->DirectoryCB->NameInformation.FileName,
+ pElement->DirectoryCB->ObjectInformation->FileType);
+
try_exit:
NOTHING;
void
AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry)
+ IN AFSDirectoryCB *DirectoryCB)
{
AFSNameArrayCB *pCurrentElement = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
- LONG lCount;
+ LONG lCount, lElement;
__Enter
{
- pCurrentElement = &NameArray->ElementArray[ 0];
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ DirectoryCB,
+ DirectoryCB->ObjectInformation->FileId.Cell,
+ DirectoryCB->ObjectInformation->FileId.Volume,
+ DirectoryCB->ObjectInformation->FileId.Vnode,
+ DirectoryCB->ObjectInformation->FileId.Unique,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB->ObjectInformation->FileType);
+ //
+ // Dereference previous name array contents
+ //
- while( TRUE)
+ for ( lElement = 0; lElement < NameArray->Count; lElement++)
{
- if( pCurrentElement->DirectoryCB == NULL)
- {
-
- break;
- }
+ pCurrentElement = &NameArray->ElementArray[ lElement];
lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
&pCurrentElement->DirectoryCB->NameInformation.FileName,
pCurrentElement->DirectoryCB,
lCount);
-
- pCurrentElement++;
}
RtlZeroMemory( NameArray,
NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
- if( DirEntry != NULL)
+ if( DirectoryCB != NULL)
{
- NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
+ pCurrentElement = &NameArray->ElementArray[ 0];
- lCount = InterlockedIncrement( &NameArray->Count);
+ NameArray->CurrentEntry = pCurrentElement;
+
+ NameArray->Count = 1;
- lCount = InterlockedIncrement( &DirEntry->OpenReferenceCount);
+ NameArray->LinkCount = 0;
+
+ lCount = InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSResetNameArray Increment count on %wZ DE %p Cnt %d\n",
- &DirEntry->NameInformation.FileName,
- DirEntry,
+ &DirectoryCB->NameInformation.FileName,
+ DirectoryCB,
lCount);
- NameArray->CurrentEntry->DirectoryCB = DirEntry;
+ pCurrentElement->DirectoryCB = DirectoryCB;
- NameArray->CurrentEntry->Component = DirEntry->NameInformation.FileName;
+ pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
- NameArray->CurrentEntry->FileId = DirEntry->ObjectInformation->FileId;
+ pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
+
+ pCurrentElement->Flags = 0;
+
+ if( pCurrentElement->FileId.Vnode == 1)
+ {
+
+ SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
+ }
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
+ NameArray,
+ pCurrentElement->DirectoryCB,
+ pCurrentElement->FileId.Cell,
+ pCurrentElement->FileId.Volume,
+ pCurrentElement->FileId.Vnode,
+ pCurrentElement->FileId.Unique,
+ &pCurrentElement->DirectoryCB->NameInformation.FileName,
+ pCurrentElement->DirectoryCB->ObjectInformation->FileType);
}
}
ntStatus = stIoStatus.Status;
}
- CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( !CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSCleanupFcb CcPurgeCacheSection [1] failure FID %08lX-%08lX-%08lX-%08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique);
+
+ SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
+
ntStatus = GetExceptionCode();
+
+ AFSDbgLogMsg( 0,
+ 0,
+ "EXCEPTION - AFSCleanupFcb Cc [1] FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ ntStatus);
+
+ SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
// First up are there dirty extents in the cache to flush?
//
- if( ForceFlush ||
- ( !BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) &&
- !BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED) &&
- ( Fcb->Specific.File.ExtentsDirtyCount ||
+ 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
+ //
+
+ 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))
NULL);
}
}
- else 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
- //
-
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
//
// If there are extents and they haven't been used recently *and*
if( ForceFlush)
{
- CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( !CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSCleanupFcb CcPurgeCacheSection [2] failure FID %08lX-%08lX-%08lX-%08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique);
+
+ SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
}
}
__except( EXCEPTION_EXECUTE_HANDLER)
{
+
ntStatus = GetExceptionCode();
+
+ AFSDbgLogMsg( 0,
+ 0,
+ "EXCEPTION - AFSCleanupFcb Cc [2] FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ ntStatus);
}
AFSReleaseResource( &Fcb->NPFcb->Resource);
- if( Fcb->OpenReferenceCount == 0)
+ if( Fcb->OpenReferenceCount <= 0)
{
//
// for any writes or reads to the cache to complete)
//
- (VOID) AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
}
break;
bLocked = FALSE;
- (VOID) AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
}
else
{
0,
FALSE))
{
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique);
+
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
else
AFSDbgLogMsg( 0,
0,
- "EXCEPTION - AFSPerformObjectInvalidate Status %08lX\n",
+ "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
ntStatus);
+
+ SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
}
FALSE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique);
+
bPurgeOnClose = TRUE;
}
else
FALSE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique);
+
bPurgeOnClose = TRUE;
}
else
FALSE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique);
+
bPurgeOnClose = TRUE;
}
else
FALSE))
{
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique);
+
bPurgeOnClose = TRUE;
}
else
AFSDbgLogMsg( 0,
0,
- "EXCEPTION - AFSPerformObjectInvalidate Status %08lX\n",
+ "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
ntStatus);
}
}