//
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;
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
FileName);
}
- lCount = InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
//
- // Object specific information
- //
-
- pObjectInfoCB->Links = DirEnumEntry->Links;
-
- pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
-
- pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
-
- //
// Check for the case where we have a filetype of SymLink but both the TargetFid and the
// TargetName are empty. In this case set the filetype to zero so we evaluate it later in
// the code
}
}
+ //
+ // Object specific information
+ //
+
+ pObjectInfoCB->Links = DirEnumEntry->Links;
+
+ pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
+
+ pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+
try_exit:
if( !NT_SUCCESS( ntStatus))
ExDeleteResourceLite( &pNonPagedDirEntry->Lock);
- AFSExFreePool( pNonPagedDirEntry);
+ AFSExFreePoolWithTag( pNonPagedDirEntry, AFS_DIR_ENTRY_NP_TAG);
}
if( pDirNode != NULL)
{
- AFSExFreePool( pDirNode);
+ AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
pDirNode = NULL;
}
if( pObjectInfoCB != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
// Mark this node as invalid
//
+ (*ppObjectInfo)->Links = 0;
+
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_DELETED);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
ntStatus = stIoStatus.Status;
}
- CcPurgeCacheSection( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+
+ if ( (*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ 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;
ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
}
- AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_MODIFIED);
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+ {
+
+ AFSFsRtlNotifyFullReportChange( (*ppObjectInfo),
+ NULL,
+ ulFilter,
+ FILE_ACTION_MODIFIED);
+ }
+ else
+ {
+
+ AFSFsRtlNotifyFullReportChange( (*ppObjectInfo)->ParentObjectInformation,
+ NULL,
+ ulFilter,
+ FILE_ACTION_MODIFIED);
+ }
//
// Indicate this node requires re-evaluation for the remaining reasons
// 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,
{
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,
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if( FreePathName)
{
- AFSExFreePool( FullPathName->Buffer);
+ AFSExFreePoolWithTag( FullPathName->Buffer, 0);
}
*FullPathName = uniPathName;
if ( pCurrentObject )
{
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pCurrentObject)
{
- lCount = InterlockedDecrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
// Reference the node so it won't be torn down
//
- lCount = InterlockedIncrement( &pNextObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pNextObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pCurrentObject )
{
- lCount = InterlockedDecrement( &pCurrentObject->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pCurrentObject);
AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
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,
case AFS_FILE_TYPE_SYMLINK:
{
- ASSERT( pDirEnumEntry->TargetNameLength > 0);
-
//
// Update the metadata for the entry
//
if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
{
+ AFSDbgLogMsg( 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;
}
ntStatus = stIoStatus.Status;
}
- if ( bPurgeExtents)
+ if ( bPurgeExtents &&
+ pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
- 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);
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,
if( pDirEnumEntry != NULL)
{
- AFSExFreePool( pDirEnumEntry);
+ AFSExFreePoolWithTag( pDirEnumEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
// for any writes or reads to the cache to complete)
//
- (VOID) AFSTearDownFcbExtents( pFcb,
- NULL);
+ AFSTearDownFcbExtents( pFcb,
+ NULL);
}
pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
BOOLEAN bAcquiredLock = FALSE;
AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
AFSFcb *pFcb = NULL;
if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID))
{
- if( !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME) &&
+ if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME) &&
pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex > 0)
{
pObjectInfo->Links = DirEnumEntry->Links;
- if( DirEnumEntry->TargetNameLength > 0)
+ if( DirEnumEntry->TargetNameLength > 0 &&
+ ( DirEntry->NameInformation.TargetName.Length != DirEnumEntry->TargetNameLength ||
+ DirEntry->ObjectInformation->DataVersion.QuadPart != DirEnumEntry->DataVersion.QuadPart))
{
//
AFSReleaseResource( &DirEntry->NonPaged->Lock);
}
- else if( DirEntry->NameInformation.TargetName.Length > 0)
+ else if( DirEntry->NameInformation.TargetName.Length > 0 &&
+ DirEntry->ObjectInformation->DataVersion.QuadPart != DirEnumEntry->DataVersion.QuadPart)
{
AFSAcquireExcl( &DirEntry->NonPaged->Lock,
if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_RELEASE_TARGET_NAME_BUFFER) &&
DirEntry->NameInformation.TargetName.Buffer != NULL)
{
- AFSExFreePool( DirEntry->NameInformation.TargetName.Buffer);
+ AFSExFreePoolWithTag( DirEntry->NameInformation.TargetName.Buffer, AFS_NAME_BUFFER_FIVE_TAG);
}
ClearFlag( DirEntry->Flags, AFS_DIR_RELEASE_TARGET_NAME_BUFFER);
NTSTATUS
AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
IN GUID *AuthGroup,
- IN BOOLEAN PurgeContent,
- IN BOOLEAN FastCall)
+ IN BOOLEAN FastCall,
+ IN BOOLEAN bSafeToPurge)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSValidateEntry Validating entry %wZ FID %08lX-%08lX-%08lX-%08lX PurgeContent %u FastCall %u\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,
- PurgeContent,
FastCall);
//
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Validating entry Purge %d FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX DV %I64X returned DV %I64X FT %d\n",
- PurgeContent,
+ "AFSValidateEntry Validating entry FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX DV %I64X returned DV %I64X FT %d\n",
FastCall,
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
case AFS_FILE_TYPE_FILE:
{
+ BOOLEAN bPurgeExtents = FALSE;
+
//
// For a file where the data version has become invalid we need to
// fail any current extent requests and purge the cache for the file
// Can't hold the Fcb resource while doing this
//
- if( PurgeContent &&
- pObjectInfo->Fcb != 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)))
{
pCurrentFcb = pObjectInfo->Fcb;
{
IO_STATUS_BLOCK stIoStatus;
- BOOLEAN bPurgeExtents = FALSE;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique);
- 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",
+ "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->FileId.Unique,
+ pObjectInfo->DataVersion.LowPart,
+ pDirEnumEntry->DataVersion.LowPart
+ );
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ bPurgeExtents = TRUE;
}
- __try
+ if ( bSafeToPurge)
{
- CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
-
- 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);
+ CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
+
+ 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;
+ }
+
+ if ( bPurgeExtents &&
+ pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ 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);
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+ ntStatus = GetExceptionCode();
+
+ 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);
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ else
{
- ntStatus = GetExceptionCode();
- 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 ( bPurgeExtents)
+ {
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
}
+
AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
bReleaseFcb = FALSE;
- if ( bPurgeExtents)
+ if ( bPurgeExtents &&
+ bSafeToPurge)
{
AFSFlushExtents( pCurrentFcb,
AuthGroup);
}
//
- // Update the metadata for the entry
+ // Update the metadata for the entry but only if it is safe to do so.
+ // If it was determined that a data version change has occurred or
+ // that a pending data verification was required, do not update the
+ // ObjectInfo meta data or the FileObject size information. That
+ // way it is consistent for the next time that the data is verified
+ // or validated.
//
- ntStatus = AFSUpdateMetaData( DirEntry,
- pDirEnumEntry);
-
- if( !NT_SUCCESS( ntStatus))
+ if ( !(bPurgeExtents && bSafeToPurge))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry Meta Data Update failed %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);
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
- break;
- }
+ if( !NT_SUCCESS( ntStatus))
+ {
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSValidateEntry Meta Data Update failed %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);
- //
- // Update file sizes
- //
+ break;
+ }
- if( pObjectInfo->Fcb != NULL)
- {
- FILE_OBJECT *pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
- pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
- pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
- pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ //
+ // Update file sizes
+ //
- if ( pCCFileObject != NULL)
+ if( pObjectInfo->Fcb != NULL)
{
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ FILE_OBJECT *pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+
+ 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);
+ }
}
}
-
break;
}
if( pDirEnumEntry != NULL)
{
- AFSExFreePool( pDirEnumEntry);
+ AFSExFreePoolWithTag( pDirEnumEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
{
RtlInitUnicodeString( &uniShareName,
- L"PIPE\\srvsvc");
+ L"PIPE");
pObjectInfoCB = AFSAllocateObjectInfo( &AFSGlobalRoot->ObjectInformation,
0);
// Set valid entry
//
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_SERVER_SERVICE);
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_PIPE_SERVICE);
pDirNode->NameInformation.FileName.Length = uniShareName.Length;
pLastDirNode = pDirNode;
- RtlInitUnicodeString( &uniShareName,
- L"PIPE\\wkssvc");
-
- pObjectInfoCB = AFSAllocateObjectInfo( &AFSGlobalRoot->ObjectInformation,
- 0);
-
- if( pObjectInfoCB == NULL)
- {
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeSpecialShareNameList (wkssvc) Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
-
- pObjectInfoCB->ObjectReferenceCount = 1;
-
- pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
-
- ulEntryLength = sizeof( AFSDirectoryCB) +
- uniShareName.Length;
-
- pDirNode = (AFSDirectoryCB *)AFSLibExAllocatePoolWithTag( PagedPool,
- ulEntryLength,
- AFS_DIR_ENTRY_TAG);
-
- if( pDirNode == NULL)
- {
-
- AFSDeleteObjectInfo( pObjectInfoCB);
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
- sizeof( AFSNonPagedDirectoryCB),
- AFS_DIR_ENTRY_NP_TAG);
-
- if( pNonPagedDirEntry == NULL)
- {
-
- ExFreePool( pDirNode);
-
- AFSDeleteObjectInfo( pObjectInfoCB);
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- RtlZeroMemory( pDirNode,
- ulEntryLength);
-
- RtlZeroMemory( pNonPagedDirEntry,
- sizeof( AFSNonPagedDirectoryCB));
-
- ExInitializeResourceLite( &pNonPagedDirEntry->Lock);
-
- pDirNode->NonPaged = pNonPagedDirEntry;
-
- pDirNode->ObjectInformation = pObjectInfoCB;
-
- //
- // Set valid entry
- //
-
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_WORKSTATION_SERVICE);
-
- pDirNode->NameInformation.FileName.Length = uniShareName.Length;
-
- pDirNode->NameInformation.FileName.MaximumLength = uniShareName.Length;
-
- pDirNode->NameInformation.FileName.Buffer = (WCHAR *)((char *)pDirNode + sizeof( AFSDirectoryCB));
-
- RtlCopyMemory( pDirNode->NameInformation.FileName.Buffer,
- uniShareName.Buffer,
- pDirNode->NameInformation.FileName.Length);
-
- pDirNode->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pDirNode->NameInformation.FileName,
- TRUE);
-
- pLastDirNode->ListEntry.fLink = pDirNode;
-
- pDirNode->ListEntry.bLink = pLastDirNode;
-
- pLastDirNode = pDirNode;
RtlInitUnicodeString( &uniShareName,
L"IPC$");
__Enter
{
- //
- // Build up the entire name here. We are guaranteed that if there is a
- // secondary name, it is pointing to a portion of the share name buffer
- //
-
- if( SecondaryName->Length > 0 &&
- SecondaryName->Buffer != NULL)
- {
-
- uniFullShareName = *SecondaryName;
-
- //
- // The calling routine strips off the leading slash so add it back in
- //
- uniFullShareName.Buffer--;
- uniFullShareName.Length += sizeof( WCHAR);
- uniFullShareName.MaximumLength += sizeof( WCHAR);
-
- //
- // And the share name
- //
-
- uniFullShareName.Buffer -= (ShareName->Length/sizeof( WCHAR));
- uniFullShareName.Length += ShareName->Length;
- uniFullShareName.MaximumLength += ShareName->Length;
- }
- else
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSGetSpecialShareNameEntry share name %wZ secondary name %wZ\n",
+ ShareName,
+ SecondaryName);
- uniFullShareName = *ShareName;
- }
+ uniFullShareName = *ShareName;
//
// Generate our hash value
pDirGlobalDirNode = (AFSDirectoryCB *)pDirGlobalDirNode->ListEntry.fLink;
}
- AFSExFreePool( uniFullName.Buffer);
+ AFSExFreePoolWithTag( uniFullName.Buffer, 0);
try_exit:
BOOLEAN bIsRelative = FALSE;
- if( Name->Buffer[ 0] != L'\\')
+ if( Name->Length > 0 &&
+ Name->Buffer[ 0] != L'\\')
{
bIsRelative = TRUE;
return bIsRelative;
}
+BOOLEAN
+AFSIsAbsoluteAFSName( IN UNICODE_STRING *Name)
+{
+ UNICODE_STRING uniTempName;
+ BOOLEAN bIsAbsolute = FALSE;
+
+ //
+ // An absolute AFS path must begin with \afs\... or equivalent
+ //
+
+ if ( Name->Length == 0 ||
+ Name->Length <= AFSMountRootName.Length + sizeof( WCHAR) ||
+ Name->Buffer[ 0] != L'\\' ||
+ Name->Buffer[ AFSMountRootName.Length/sizeof( WCHAR)] != L'\\')
+ {
+
+ return FALSE;
+ }
+
+ uniTempName.Length = AFSMountRootName.Length;
+ uniTempName.MaximumLength = AFSMountRootName.Length;
+
+ uniTempName.Buffer = (WCHAR *)AFSExAllocatePoolWithTag( PagedPool,
+ uniTempName.MaximumLength,
+ AFS_NAME_BUFFER_TWO_TAG);
+
+ if( uniTempName.Buffer == NULL)
+ {
+
+ return FALSE;
+ }
+
+ RtlCopyMemory( uniTempName.Buffer,
+ Name->Buffer,
+ AFSMountRootName.Length);
+
+ bIsAbsolute = (0 == RtlCompareUnicodeString( &uniTempName,
+ &AFSMountRootName,
+ TRUE));
+
+ AFSExFreePoolWithTag( uniTempName.Buffer,
+ AFS_NAME_BUFFER_TWO_TAG);
+
+ return bIsAbsolute;
+}
+
+
void
AFSUpdateName( IN UNICODE_STRING *Name)
{
if( BooleanFlagOn( *Flags, AFS_DIR_RELEASE_TARGET_NAME_BUFFER))
{
- AFSExFreePool( TargetName->Buffer);
+ AFSExFreePoolWithTag( TargetName->Buffer, AFS_NAME_BUFFER_FIVE_TAG);
}
TargetName->MaximumLength = NameLength;
lCount);
}
- AFSExFreePool( NameArray);
+ AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
}
return ntStatus;
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 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)
- {
+ if ( bVolumeRoot &&
+ !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
+ {
- pDirectoryCB = AFSBackupEntry( NameArray);
+ pDirectoryCB = AFSBackupEntry( NameArray);
+ }
}
+
try_exit:
NOTHING;
// Increment the open reference and handle on the node
//
- lCount = InterlockedIncrement( &pDirNode->ObjectInformation->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pDirNode->ObjectInformation);
AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
if ( pDirNode != NULL)
{
- AFSExFreePool( pDirNode);
+ AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
+ }
+
+ if( pNonPagedDirEntry != NULL)
+ {
+
+ ExDeleteResourceLite( &pNonPagedDirEntry->Lock);
+
+ AFSExFreePoolWithTag( pNonPagedDirEntry, AFS_DIR_ENTRY_NP_TAG);
}
if ( pObjectInfoCB != NULL)
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
if( pVolumeCB != NULL)
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
- AFSExFreePool( uniFullPathName.Buffer);
+ AFSExFreePoolWithTag( uniFullPathName.Buffer, 0);
}
- AFSExFreePool( pwchBuffer);
+ AFSExFreePoolWithTag( pwchBuffer, 0);
}
}
if( pObjectInfo->NonPagedInfo == NULL)
{
- AFSExFreePool( pObjectInfo);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
try_return( pObjectInfo = NULL);
}
ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
if( ParentObjectInfo != NULL)
{
- lCount = InterlockedIncrement( &ParentObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( ParentObjectInfo);
}
//
return pObjectInfo;
}
+LONG
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo)
+{
+
+ LONG lCount;
+
+ if ( ObjectInfo->ObjectReferenceCount == 0)
+ {
+
+ AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount);
+ }
+ else
+ {
+
+ AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount);
+
+ if ( lCount == 1)
+ {
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+ }
+ }
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+LONG
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo)
+{
+
+ LONG lCount;
+
+ AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
+
+ if ( lCount == 0)
+ {
+
+ lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount);
+
+ AFSReleaseResource(&ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock,
+ TRUE);
+
+ lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
+ }
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+
+
void
AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
{
if( ObjectInfo->ParentObjectInformation != NULL)
{
- lCount = InterlockedDecrement( &ObjectInfo->ParentObjectInformation->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( ObjectInfo->ParentObjectInformation);
}
if( bAcquiredTreeLock)
AFSReleaseFid( &ObjectInfo->FileId);
}
+ ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- AFSExFreePool( ObjectInfo->NonPagedInfo);
+ AFSExFreePoolWithTag( ObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
- AFSExFreePool( ObjectInfo);
+ AFSExFreePoolWithTag( ObjectInfo, AFS_OBJECT_INFO_TAG);
return;
}
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
if( pVolumeCB != NULL)
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
- AFSExFreePool( uniFullPathName.Buffer);
+ AFSExFreePoolWithTag( uniFullPathName.Buffer, 0);
}
- AFSExFreePool( pwchBuffer);
+ AFSExFreePoolWithTag( pwchBuffer, 0);
}
}
ntStatus = stIoStatus.Status;
}
- CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ 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);
}
}
{
AFSReleaseExtentsWithFlush( Fcb,
- NULL);
+ NULL,
+ TRUE);
}
}
// 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))
{
AFSReleaseExtentsWithFlush( Fcb,
- NULL);
+ NULL,
+ TRUE);
}
}
- 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*
( 0 != Fcb->Specific.File.ExtentCount &&
0 != Fcb->Specific.File.LastExtentAccess.QuadPart &&
(liTime.QuadPart - Fcb->Specific.File.LastExtentAccess.QuadPart) >=
- (AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))) &&
- AFSAcquireExcl( &Fcb->NPFcb->Resource,
- ForceFlush))
+ (AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
{
- __try
+ if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush))
{
- CcFlushCache( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
+ __try
+ {
+
+ CcFlushCache( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
+
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCleanupFcb CcFlushCache [2] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ Fcb->ObjectInformation->FileId.Cell,
+ Fcb->ObjectInformation->FileId.Volume,
+ Fcb->ObjectInformation->FileId.Vnode,
+ Fcb->ObjectInformation->FileId.Unique,
+ stIoStatus.Status,
+ stIoStatus.Information);
+
+ ntStatus = stIoStatus.Status;
+ }
- if( !NT_SUCCESS( stIoStatus.Status))
+ if( ForceFlush &&
+ Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ 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)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSCleanupFcb CcFlushCache [2] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ 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,
- stIoStatus.Status,
- stIoStatus.Information);
-
- ntStatus = stIoStatus.Status;
+ ntStatus);
}
- if( ForceFlush)
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
+
+ if( Fcb->OpenReferenceCount <= 0)
{
- CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ //
+ // Tear em down we'll not be needing them again
+ //
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
- ntStatus = GetExceptionCode();
- }
-
- AFSReleaseResource( &Fcb->NPFcb->Resource);
-
- if( Fcb->OpenReferenceCount == 0)
+ else
{
- //
- // Tear em down we'll not be needing them again
- //
-
- AFSTearDownFcbExtents( Fcb,
- NULL);
+ ntStatus = STATUS_RETRY;
}
}
if( BooleanFlagOn( DirectoryCB->Flags, AFS_DIR_RELEASE_NAME_BUFFER))
{
- AFSExFreePool( DirectoryCB->NameInformation.FileName.Buffer);
+ AFSExFreePoolWithTag( DirectoryCB->NameInformation.FileName.Buffer, 0);
ClearFlag( DirectoryCB->Flags, AFS_DIR_RELEASE_NAME_BUFFER);
if( pTokenInfo != NULL)
{
- AFSExFreePool( pTokenInfo);
+ ExFreePool( pTokenInfo); // Allocated by SeQueryInformationToken
}
}
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pControlDevExt = NULL;
ULONG ulTimeIncrement = 0;
+ LONG lCount;
__Enter
{
AFSServerName = LibraryInit->AFSServerName;
+ AFSMountRootName = LibraryInit->AFSMountRootName;
+
AFSDebugFlags = LibraryInit->AFSDebugFlags;
//
AFSExAllocatePoolWithTag = LibraryInit->AFSExAllocatePoolWithTag;
- AFSExFreePool = LibraryInit->AFSExFreePool;
+ AFSExFreePoolWithTag = LibraryInit->AFSExFreePoolWithTag;
AFSDumpTraceFilesFnc = LibraryInit->AFSDumpTraceFiles;
"AFSInitializeLibrary AFSInitRootFcb failure %08lX\n",
ntStatus);
+ lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
try_return( ntStatus);
AFSInitVolumeWorker( AFSGlobalRoot);
+ lCount = InterlockedDecrement( &AFSGlobalRoot->VolumeReferenceCount);
+
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
AFSReleaseResource( AFSGlobalRoot->ObjectInformation.Fcb->Header.Resource);
pObjectInfo = &pVolumeCB->ObjectInformation;
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
}
// 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,
pObjectInfo = pDirectoryEntry->ObjectInformation;
- lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo);
if( pVolumeCB != NULL)
{
if( pObjectInfo != NULL)
{
- lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo);
}
if( pNameArray != NULL)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSDirectoryCB *pDirEntry = NULL;
ULONG ulCRC = 0;
LONG lCount;
// a lookup in the short name tree
//
- if( RtlIsNameLegalDOS8Dot3( ComponentName,
+ if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ RtlIsNameLegalDOS8Dot3( ComponentName,
NULL,
NULL))
{
ObjectInfo->Fcb != NULL)
{
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+
+ ObjectInfo->Links = 0;
+
+ ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+
+ KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+ 0,
+ FALSE);
//
// Clear out the extents
// for any writes or reads to the cache to complete)
//
- (VOID) AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
}
break;
bLocked = FALSE;
- (VOID) AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
}
else
{
bExtentsLocked = FALSE;
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+ !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
NULL,
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);
}
}
}
ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+ !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
&ByteRangeList[ulIndex].FileOffset,
ulSize,
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);
}
}
if( ObjectInfo != NULL)
{
- InterlockedDecrement( &ObjectInfo->ObjectReferenceCount);
+
+ AFSObjectInfoDecrement( ObjectInfo);
}
}