/*
* Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Your File System, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
- * notice,
- * this list of conditions and the following disclaimer in the
- * documentation
- * and/or other materials provided with the distribution.
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
* - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
* nor the names of their contributors may be used to endorse or promote
* products derived from this software without specific prior written
//
ULONG
-AFSExceptionFilter( IN ULONG Code,
+AFSExceptionFilter( IN CHAR *FunctionString,
+ IN ULONG Code,
IN PEXCEPTION_POINTERS ExceptPtrs)
{
+ UNREFERENCED_PARAMETER(Code);
PEXCEPTION_RECORD ExceptRec;
PCONTEXT Context;
Context = ExceptPtrs->ContextRecord;
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 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);
+ (void *)AFSExceptionFilter));
DbgPrint("**** Exception Caught in AFS Redirector Library ****\n");
else
{
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
"AFSLibExAllocatePoolWithTag failure Type %08lX Size %08lX Tag %08lX %08lX\n",
PoolType,
NumberOfBytes,
Tag,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSBreakPoint();
}
AFSReleaseResource( IN PERESOURCE Resource)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSReleaseResource Releasing lock %08lX Thread %08lX\n",
+ "AFSReleaseResource Releasing lock %p Thread %08lX\n",
Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
ExReleaseResourceLite( Resource);
AFSConvertToShared( IN PERESOURCE Resource)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSConvertToShared Converting lock %08lX Thread %08lX\n",
+ "AFSConvertToShared Converting lock %p Thread %08lX\n",
Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
ExConvertExclusiveToSharedLite( Resource);
IN ULONG Length)
{
- NTSTATUS Status = STATUS_SUCCESS;
void *pAddress = NULL;
if( Irp->MdlAddress != NULL)
pAddress = MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority );
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
+ AFSDumpTraceFilesFnc();
+
IoFreeMdl( Irp->MdlAddress );
Irp->MdlAddress = NULL;
pAddress = NULL;
void *
AFSLockUserBuffer( IN void *UserBuffer,
IN ULONG BufferLength,
- OUT MDL ** Mdl)
+ OUT MDL ** Mdl)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
void *pAddress = NULL;
- MDL *pMdl = NULL;
+ MDL *pMdl = NULL;
- __Enter
- {
+ __Enter
+ {
pMdl = IoAllocateMdl( UserBuffer,
BufferLength,
FALSE,
NULL);
- if( pMdl == NULL)
- {
+ if( pMdl == NULL)
+ {
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
//
// Lock the new Mdl in memory.
{
MmProbeAndLockPages( pMdl,
- KernelMode,
+ KernelMode,
IoWriteAccess);
pAddress = MmGetSystemAddressForMdlSafe( pMdl,
- NormalPagePriority);
+ NormalPagePriority);
}
- __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
{
+ AFSDumpTraceFilesFnc();
+
IoFreeMdl( pMdl);
pMdl = NULL;
pAddress = NULL;
}
- if( pMdl != NULL)
- {
+ if( pMdl != NULL)
+ {
- *Mdl = pMdl;
- }
+ *Mdl = pMdl;
+ }
try_exit:
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- void *pMappedBuffer = NULL;
AFSDeviceExt *pDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
KAPC stApcState;
IN PIRP Irp)
{
+ UNREFERENCED_PARAMETER(DeviceObject);
NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;
- PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
AFSCompleteRequest( Irp,
ntStatus);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirectoryCB *pDirNode = NULL;
ULONG ulEntryLength = 0;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfoCB = NULL;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
__Enter
{
if( pObjectInfoCB == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeGlobalDirectory AFSAllocateObjectInfo failure %08lX\n",
- ntStatus);
+ ntStatus));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+ "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- pObjectInfoCB->ObjectReferenceCount);
+ lCount));
ntStatus = STATUS_SUCCESS;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_ERROR,
- "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n");
+ "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocation failure\n"));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_NP_TAG allocation failure\n");
+ "AFSInitializeGlobalDirectory AFS_DIR_ENTRY_NP_TAG allocation failure\n"));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( pObjectInfoCB == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeGlobalDirectory AFSAllocateObjectInfo (2) failure %08lX\n",
- ntStatus);
+ ntStatus));
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeGlobalDirectoryEntries Increment count on object %08lX Cnt %d\n",
+ "AFSInitializeGlobalDirectoryEntries Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- pObjectInfoCB->ObjectReferenceCount);
+ lCount));
ntStatus = STATUS_SUCCESS;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocation failure\n"));
+
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeGlobalDirectoryEntries Decrement count on object %p Cnt %d\n",
+ AFSGlobalDotDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
AFSDirectoryCB *pDirNode = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ulEntryLength = 0;
- AFSDirEnumEntry *pDirEnumCB = NULL;
- AFSFileID stTargetFileID;
- AFSFcb *pVcb = NULL;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfoCB = NULL;
BOOLEAN bAllocatedObjectCB = FALSE;
ULONGLONG ullIndex = 0;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry Initializing entry %wZ parent FID %08lX-%08lX-%08lX-%08lX\n",
FileName,
ParentObjectInfo->FileId.Cell,
ParentObjectInfo->FileId.Volume,
ParentObjectInfo->FileId.Vnode,
- ParentObjectInfo->FileId.Unique);
+ ParentObjectInfo->FileId.Unique));
//
// First thing is to locate/create our object information block
bAllocatedObjectCB = TRUE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry initialized object %08lX Parent Object %08lX for %wZ\n",
+ "AFSInitDirEntry initialized object %p Parent Object %p for %wZ\n",
pObjectInfoCB,
ParentObjectInfo,
- FileName);
+ FileName));
}
- InterlockedIncrement( &pObjectInfoCB->ObjectReferenceCount);
+ //
+ // This reference count is either stored into the return DirectoryCB
+ // or released before function exit.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry Increment count on object %08lX Cnt %d\n",
+ "AFSInitDirEntry Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- pObjectInfoCB->ObjectReferenceCount);
+ lCount));
AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
pDirNode->ObjectInformation = pObjectInfoCB;
//
- // Set valid entry
+ // Set valid entry and NOT_IN_PARENT flag
//
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
pDirNode->FileIndex = FileIndex;
TRUE);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry Initialized DE %p for %wZ in parent FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
ParentObjectInfo->FileId.Cell,
ParentObjectInfo->FileId.Volume,
ParentObjectInfo->FileId.Vnode,
- ParentObjectInfo->FileId.Unique);
+ ParentObjectInfo->FileId.Unique));
if( TargetName != NULL &&
TargetName->Length > 0)
pObjectInfoCB->FileAttributes = DirEnumEntry->FileAttributes;
if( pObjectInfoCB->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
- pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK ||
pObjectInfoCB->FileType == AFS_FILE_TYPE_DFSLINK)
{
- pObjectInfoCB->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ pObjectInfoCB->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
}
- pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
+ if (pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
- //
- // Object specific information
- //
+ if ( pObjectInfoCB->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
- pObjectInfoCB->Links = DirEnumEntry->Links;
+ pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
- pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
+ pObjectInfoCB->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ }
- pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+ pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
//
// Check for the case where we have a filetype of SymLink but both the TargetFid and the
}
}
+ //
+ // 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);
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pDirNode));
+
+ AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
pDirNode = NULL;
}
if( pObjectInfoCB != NULL)
{
- InterlockedDecrement( &pObjectInfoCB->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitDirEntry Decrement count on object %08lX Cnt %d\n",
+ "AFSInitDirEntry Decrement count on object %p Cnt %d\n",
pObjectInfoCB,
- pObjectInfoCB->ObjectReferenceCount);
+ lCount));
- if( bAllocatedObjectCB)
+ if( bAllocatedObjectCB &&
+ lCount == 0)
{
- ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
-
- AFSDeleteObjectInfo( pObjectInfoCB);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
}
}
}
IN AFSDirectoryCB *DirEntry)
{
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirEnumEntry *pDirEntry = NULL;
UNICODE_STRING uniTargetName;
DirEntry->ObjectInformation->FileAttributes = pDirEntry->FileAttributes;
if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
- pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
{
- DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+
+ if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ if ( DirEntry->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
}
DirEntry->ObjectInformation->EaSize = pDirEntry->EaSize;
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
IN AFSDirectoryCB *DirEntry)
{
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirEnumEntry *pDirEntry = NULL;
UNICODE_STRING uniTargetName;
pDirEntry->FileType == AFS_FILE_TYPE_INVALID)
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSValidateSymLink Invalid type Status %08lX\n",
+ STATUS_OBJECT_NAME_NOT_FOUND));
+
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
DirEntry->ObjectInformation->FileAttributes = pDirEntry->FileAttributes;
if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
- pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
{
- DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+
+ if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ if ( DirEntry->ObjectInformation->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ DirEntry->ObjectInformation->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
}
DirEntry->ObjectInformation->EaSize = pDirEntry->EaSize;
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
}
NTSTATUS
-AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
+AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
+ IN ULONG Reason)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFcb *pDcb = NULL, *pFcb = NULL, *pNextFcb = NULL;
- AFSVolumeCB *pVolumeCB = NULL;
- AFSFcb *pTargetDcb = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
- AFSDirectoryCB *pCurrentDirEntry = NULL;
- BOOLEAN bIsChild = FALSE;
- ULONGLONG ullIndex = 0;
- AFSObjectInfoCB *pObjectInfo = NULL;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
- __Enter
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Invalidation on node type %d for fid %08lX-%08lX-%08lX-%08lX Reason %d\n",
+ (*ppObjectInfo)->FileType,
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique,
+ Reason));
+
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- //
- // Need to locate the Fcb for the directory to purge
- //
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
- &pDevExt->Specific.RDR.VolumeTreeLock,
- PsGetCurrentThread());
-
- //
- // Starve any exclusive waiters on this paticular call
- //
-
- AFSAcquireSharedStarveExclusive( &pDevExt->Specific.RDR.VolumeTreeLock, TRUE);
+ pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
+ &(*ppObjectInfo)->ParentFileId);
+ }
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
+ (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DFSLINK ||
+ (*ppObjectInfo)->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+ {
//
- // Locate the volume node
+ // We only act on the mount point itself, not the target. If the
+ // node has been deleted then mark it as such otherwise indicate
+ // it requires verification
//
- ullIndex = AFSCreateHighIndex( &InvalidateCB->FileID);
-
- ntStatus = AFSLocateHashEntry( pDevExt->Specific.RDR.VolumeTree.TreeHead,
- ullIndex,
- (AFSBTreeEntry **)&pVolumeCB);
-
- if( pVolumeCB != NULL)
- {
-
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Increment count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
- }
-
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
-
- if( !NT_SUCCESS( ntStatus) ||
- pVolumeCB == NULL)
+ if( Reason == AFS_INVALIDATE_DELETED)
{
- try_return( ntStatus = STATUS_SUCCESS);
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
}
-
- //
- // If this is a whole volume invalidation then go do it now
- //
-
- if( InvalidateCB->WholeVolume ||
- AFSIsVolumeFID( &InvalidateCB->FileID))
+ else
{
- ntStatus = AFSInvalidateVolume( pVolumeCB,
- InvalidateCB->Reason);
-
- AFSFsRtlNotifyFullReportChange( &pVolumeCB->ObjectInformation,
- NULL,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_DIR_NAME |
- FILE_NOTIFY_CHANGE_NAME |
- FILE_NOTIFY_CHANGE_ATTRIBUTES |
- FILE_NOTIFY_CHANGE_SIZE,
- FILE_ACTION_MODIFIED);
-
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- try_return( ntStatus);
- }
-
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ if( Reason == AFS_INVALIDATE_FLUSHED)
+ {
- ullIndex = AFSCreateLowIndex( &InvalidateCB->FileID);
+ (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
- ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
- ullIndex,
- (AFSBTreeEntry **)&pObjectInfo);
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
- if( pObjectInfo != NULL)
- {
+ (*ppObjectInfo)->Expiration.QuadPart = 0;
- //
- // Reference the node so it won't be torn down
- //
+ (*ppObjectInfo)->TargetFileId.Vnode = 0;
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ (*ppObjectInfo)->TargetFileId.Unique = 0;
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Increment count on object %08lX Cnt %d\n",
- pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
- }
-
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ "AFSInvalidateObject Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique));
- if( !NT_SUCCESS( ntStatus) ||
- pObjectInfo == NULL)
- {
- try_return( ntStatus = STATUS_SUCCESS);
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
- if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK ||
- pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK ||
- pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+ if ( pParentObjectInfo != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Invalidation on node type %d for fid %08lX-%08lX-%08lX-%08lX Reason %d\n",
- pObjectInfo->FileType,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- InvalidateCB->Reason);
-
- //
- // We only act on the mount point itself, not the target. If the
- // node has been deleted then mark it as such otherwise indicate
- // it requires verification
- //
-
- if( InvalidateCB->Reason == AFS_INVALIDATE_DELETED)
- {
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
- }
- else
- {
-
- if( InvalidateCB->Reason == AFS_INVALIDATE_FLUSHED ||
- InvalidateCB->Reason == AFS_INVALIDATE_DATA_VERSION)
- {
- pObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
-
- pObjectInfo->Expiration.QuadPart = 0;
-
- pObjectInfo->TargetFileId.Vnode = 0;
-
- pObjectInfo->TargetFileId.Unique = 0;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
-
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- }
-
ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- if( InvalidateCB->Reason == AFS_INVALIDATE_CREDS)
+ if( Reason == AFS_INVALIDATE_CREDS)
{
ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
}
- if( InvalidateCB->Reason == AFS_INVALIDATE_DATA_VERSION)
+ if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+ Reason == AFS_INVALIDATE_FLUSHED)
{
ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
}
ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
}
- AFSFsRtlNotifyFullReportChange( pObjectInfo->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
NULL,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_ATTRIBUTES,
+ ulFilter,
FILE_ACTION_MODIFIED);
-
- try_return( ntStatus);
}
- //
- // Depending on the reason for invalidation then perform work on the node
- //
+ try_return( ntStatus);
+ }
+
+ //
+ // Depending on the reason for invalidation then perform work on the node
+ //
- switch( InvalidateCB->Reason)
+ switch( Reason)
+ {
+
+ case AFS_INVALIDATE_DELETED:
{
- case AFS_INVALIDATE_DELETED:
- {
+ //
+ // Mark this node as invalid
+ //
- //
- // Mark this node as invalid
- //
+ (*ppObjectInfo)->Links = 0;
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_DELETED);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Set DELETE flag on fid %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique));
+
+ if( pParentObjectInfo != NULL)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Set DELETE flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ "AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
+ pParentObjectInfo->FileId.Cell,
+ pParentObjectInfo->FileId.Volume,
+ pParentObjectInfo->FileId.Vnode,
+ pParentObjectInfo->FileId.Unique));
- if( pObjectInfo->ParentObjectInformation != NULL)
- {
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->ParentObjectInformation->FileId.Cell,
- pObjectInfo->ParentObjectInformation->FileId.Volume,
- pObjectInfo->ParentObjectInformation->FileId.Vnode,
- pObjectInfo->ParentObjectInformation->FileId.Unique);
-
- SetFlag( pObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
- pObjectInfo->ParentObjectInformation->Expiration.QuadPart = 0;
- }
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- if( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY)
+ pParentObjectInfo->Expiration.QuadPart = 0;
+
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
{
ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
}
ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
}
- AFSFsRtlNotifyFullReportChange( pObjectInfo->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
NULL,
ulFilter,
FILE_ACTION_REMOVED);
-
- break;
}
- case AFS_INVALIDATE_FLUSHED:
+ if( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
+ Reason)))
{
+ (*ppObjectInfo) = NULL; // We'll dec the count in the worker item
+ }
- if( pObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
- pObjectInfo->Fcb != NULL)
- {
+ break;
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Flush/purge file fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ case AFS_INVALIDATE_FLUSHED:
+ {
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_FILE &&
+ (*ppObjectInfo)->Fcb != NULL)
+ {
- __try
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge file fid %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique));
- CcFlushCache( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
+ AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
- if( !NT_SUCCESS( stIoStatus.Status))
- {
+ __try
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInvalidateCache CcFlushCache failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- stIoStatus.Status,
- stIoStatus.Information);
+ CcFlushCache( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
- ntStatus = stIoStatus.Status;
- }
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSInvalidateObject CcFlushCache failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique,
+ stIoStatus.Status,
+ stIoStatus.Information));
+
+ ntStatus = stIoStatus.Status;
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+
+
+ if ( (*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
- ntStatus = GetExceptionCode();
- }
+ if ( !CcPurgeCacheSection( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
+ AFSDbgTrace(( 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));
- //
- // Clear out the extents
- // Get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
- (VOID) AFSTearDownFcbExtents( pObjectInfo->Fcb);
+ AFSDbgTrace(( 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);
}
- // Fall through to the default processing
+ 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)
+ //
+
+ AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+ NULL);
}
- default:
+ (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
+
+
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_FILE)
{
- if( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
- }
- else
- {
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Setting VERIFY_DATA flag on fid %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique));
- if( InvalidateCB->Reason == AFS_INVALIDATE_CREDS)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
- }
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
- if( InvalidateCB->Reason == AFS_INVALIDATE_DATA_VERSION)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
- }
- else
- {
- ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
- }
+ // Fall through to the default processing
+ }
+
+ default:
+ {
+
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+ }
+ else
+ {
+ ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
+ }
+
+ if( Reason == AFS_INVALIDATE_CREDS)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
+ }
+
+ if( Reason == AFS_INVALIDATE_DATA_VERSION)
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
+ }
+ else
+ {
+ ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
+ }
+
+ if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_DIRECTORY)
+ {
- AFSFsRtlNotifyFullReportChange( pObjectInfo->ParentObjectInformation,
+ AFSFsRtlNotifyFullReportChange( (*ppObjectInfo),
NULL,
ulFilter,
FILE_ACTION_MODIFIED);
+ }
+ else if ( pParentObjectInfo != NULL)
+ {
- //
- // Indicate this node requires re-evaluation for the remaining reasons
- //
-
- pObjectInfo->Expiration.QuadPart = 0;
+ AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
+ NULL,
+ ulFilter,
+ FILE_ACTION_MODIFIED);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ //
+ // Indicate this node requires re-evaluation for the remaining reasons
+ //
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ (*ppObjectInfo)->Expiration.QuadPart = 0;
- if( InvalidateCB->Reason == AFS_INVALIDATE_FLUSHED ||
- InvalidateCB->Reason == AFS_INVALIDATE_DATA_VERSION)
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
+ (*ppObjectInfo)->FileId.Cell,
+ (*ppObjectInfo)->FileId.Volume,
+ (*ppObjectInfo)->FileId.Vnode,
+ (*ppObjectInfo)->FileId.Unique));
+
+ SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ if( Reason == AFS_INVALIDATE_DATA_VERSION ||
+ (*ppObjectInfo)->FileType == AFS_FILE_TYPE_FILE &&
+ ( Reason == AFS_INVALIDATE_CALLBACK ||
+ Reason == AFS_INVALIDATE_EXPIRED))
+ {
+ if ( NT_SUCCESS( AFSQueueInvalidateObject( (*ppObjectInfo),
+ AFS_INVALIDATE_DATA_VERSION)))
{
- pObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- if( pObjectInfo->FileType == AFS_FILE_TYPE_FILE)
- {
+ (*ppObjectInfo) = NULL; // We'll dec the count in the worker item
+ }
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Setting VERIFY_DATA flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ break;
+ }
+ }
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
- }
+ try_exit:
- break;
- }
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
+ return ntStatus;
+}
+
+NTSTATUS
+AFSInvalidateCache( IN AFSInvalidateCacheCB *InvalidateCB)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSVolumeCB *pVolumeCB = NULL;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+ ULONGLONG ullIndex = 0;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
+
+ __Enter
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Invalidation FID %08lX-%08lX-%08lX-%08lX Type %d WholeVolume %d Reason %d\n",
+ InvalidateCB->FileID.Cell,
+ InvalidateCB->FileID.Volume,
+ InvalidateCB->FileID.Vnode,
+ InvalidateCB->FileID.Unique,
+ InvalidateCB->FileType,
+ InvalidateCB->WholeVolume,
+ InvalidateCB->Reason));
+
+ //
+ // Need to locate the Fcb for the directory to purge
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
+ &pDevExt->Specific.RDR.VolumeTreeLock,
+ PsGetCurrentThread()));
+
+ //
+ // Starve any exclusive waiters on this paticular call
+ //
+
+ AFSAcquireSharedStarveExclusive( &pDevExt->Specific.RDR.VolumeTreeLock, TRUE);
+
+ //
+ // Locate the volume node
+ //
+
+ ullIndex = AFSCreateHighIndex( &InvalidateCB->FileID);
+
+ ntStatus = AFSLocateHashEntry( pDevExt->Specific.RDR.VolumeTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pVolumeCB);
+
+ if( pVolumeCB != NULL)
+ {
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
+ }
+
+ AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
+
+ if( !NT_SUCCESS( ntStatus) ||
+ pVolumeCB == NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSInvalidateCache Invalidation FAILURE Unable to locate volume node FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ InvalidateCB->FileID.Cell,
+ InvalidateCB->FileID.Volume,
+ InvalidateCB->FileID.Vnode,
+ InvalidateCB->FileID.Unique,
+ ntStatus));
+
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
+ //
+ // If this is a whole volume invalidation then go do it now
+ //
+
+ if( InvalidateCB->WholeVolume)
+ {
+
+ ntStatus = AFSInvalidateVolume( pVolumeCB,
+ InvalidateCB->Reason);
+
+ try_return( ntStatus);
+ }
+
+ AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ if ( AFSIsVolumeFID( &InvalidateCB->FileID))
+ {
+
+ pObjectInfo = &pVolumeCB->ObjectInformation;
+ }
+ else
+ {
+
+ ullIndex = AFSCreateLowIndex( &InvalidateCB->FileID);
+
+ ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
+ }
+
+ if( pObjectInfo != NULL)
+ {
+
+ //
+ // Reference the node so it won't be torn down
+ //
+
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Increment count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
+ }
+
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+
+ if( !NT_SUCCESS( ntStatus) ||
+ pObjectInfo == NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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,
+ InvalidateCB->FileID.Vnode,
+ InvalidateCB->FileID.Unique,
+ ntStatus));
+
+ try_return( ntStatus = STATUS_SUCCESS);
}
+ AFSInvalidateObject( &pObjectInfo,
+ InvalidateCB->Reason);
+
try_exit:
if( pObjectInfo != NULL)
{
- InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateCache Decrement count on object %08lX Cnt %d\n",
+ "AFSInvalidateCache Decrement count on object %p Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount));
+ }
+
+ if ( pVolumeCB != NULL)
+ {
+
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateCache Decrement count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
}
}
BOOLEAN bIsChild = FALSE;
AFSFcb *pCurrentFcb = Fcb;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
while( pCurrentFcb != NULL)
{
- if( pCurrentFcb->ObjectInformation->ParentObjectInformation == Dcb->ObjectInformation)
+ if( BooleanFlagOn( pCurrentFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+ AFSIsEqualFID( &pCurrentFcb->ObjectInformation->ParentFileId, &Dcb->ObjectInformation->FileId))
{
bIsChild = TRUE;
break;
}
- pCurrentFcb = pCurrentFcb->ObjectInformation->ParentObjectInformation->Fcb;
+ pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
+ &pCurrentFcb->ObjectInformation->ParentFileId);
+
+ if ( pParentObjectInfo != NULL)
+ {
+
+ pCurrentFcb = pParentObjectInfo->Fcb;
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+ else
+ {
+
+ pCurrentFcb = NULL;
+ }
}
return bIsChild;
#endif
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSubstituteSysName Acquiring SysName lock %08lX SHARED %08lX\n",
+ "AFSSubstituteSysName Acquiring SysName lock %p SHARED %08lX\n",
pSysNameLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( pSysNameLock,
TRUE);
if( pSysName == NULL)
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSSubstituteSysName No sysname %wZ Status %08lX\n",
+ &ComponentName,
+ STATUS_OBJECT_NAME_NOT_FOUND));
+
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
if( FreePathName)
{
- AFSExFreePool( FullPathName->Buffer);
+ AFSExFreePoolWithTag( FullPathName->Buffer, 0);
}
*FullPathName = uniPathName;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFcb *pFcb = NULL;
AFSObjectInfoCB *pCurrentObject = NULL;
- ULONG ulFilter = 0;
+ AFSObjectInfoCB *pNextObject = NULL;
+ LONG lCount;
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolume Invalidate volume fid %08lX-%08lX-%08lX-%08lX Reason %08lX\n",
VolumeCB->ObjectInformation.FileId.Cell,
VolumeCB->ObjectInformation.FileId.Volume,
VolumeCB->ObjectInformation.FileId.Vnode,
VolumeCB->ObjectInformation.FileId.Unique,
- Reason);
+ Reason));
//
// Depending on the reason for invalidation then perform work on the node
// Mark this volume as invalid
//
- VolumeCB->ObjectInformation.Expiration.QuadPart = 0;
-
SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
SetFlag( VolumeCB->Flags, AFS_VOLUME_FLAGS_OFFLINE);
- AFSFsRtlNotifyFullReportChange( &VolumeCB->ObjectInformation,
- NULL,
- FILE_NOTIFY_CHANGE_DIR_NAME,
- FILE_ACTION_REMOVED);
+ break;
+ }
+ }
- AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ //
+ // Invalidate the volume root directory
+ //
- pCurrentObject = VolumeCB->ObjectInfoListHead;
+ pCurrentObject = &VolumeCB->ObjectInformation;
- while( pCurrentObject != NULL)
- {
+ if ( pCurrentObject )
+ {
- if( pCurrentObject->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
- }
- else
- {
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- }
+ lCount = AFSObjectInfoIncrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSFsRtlNotifyFullReportChange( pCurrentObject,
- NULL,
- ulFilter,
- FILE_ACTION_REMOVED);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount));
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
+ AFSInvalidateObject( &pCurrentObject,
+ Reason);
- pFcb = pCurrentObject->Fcb;
+ if ( pCurrentObject)
+ {
- if( pFcb != NULL &&
- pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
- {
+ lCount = AFSObjectInfoDecrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount));
+ }
+ }
- //
- // Clear out the extents
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ //
+ // Apply invalidation to all other volume objects
+ //
- (VOID) AFSTearDownFcbExtents( pFcb);
- }
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
- }
+ pCurrentObject = VolumeCB->ObjectInfoListHead;
- AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ if ( pCurrentObject)
+ {
- break;
- }
+ //
+ // Reference the node so it won't be torn down
+ //
- default:
+ lCount = AFSObjectInfoIncrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount));
+ }
+
+ while( pCurrentObject != NULL)
+ {
+
+ pNextObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
+
+ if ( pNextObject)
{
//
- // Indicate this node requires re-evaluation for the remaining reasons
+ // Reference the node so it won't be torn down
//
- VolumeCB->ObjectInformation.Expiration.QuadPart = 0;
+ lCount = AFSObjectInfoIncrement( pNextObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolume Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
- VolumeCB->ObjectInformation.FileId.Cell,
- VolumeCB->ObjectInformation.FileId.Volume,
- VolumeCB->ObjectInformation.FileId.Vnode,
- VolumeCB->ObjectInformation.FileId.Unique);
+ "AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
+ pNextObject,
+ lCount));
+ }
- SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
- if( Reason == AFS_INVALIDATE_FLUSHED ||
- Reason == AFS_INVALIDATE_DATA_VERSION)
- {
+ AFSInvalidateObject( &pCurrentObject,
+ Reason);
- VolumeCB->ObjectInformation.DataVersion.QuadPart = (ULONGLONG)-1;
- }
+ if ( pCurrentObject )
+ {
- //
- // Notify anyone that cares
- //
+ lCount = AFSObjectInfoDecrement( pCurrentObject,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
+ pCurrentObject,
+ lCount));
+ }
- if( Reason == AFS_INVALIDATE_CREDS)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
- }
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- if( Reason == AFS_INVALIDATE_DATA_VERSION)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
- }
- else
- {
- ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
- }
+ pCurrentObject = pNextObject;
+ }
- AFSFsRtlNotifyFullReportChange( &VolumeCB->ObjectInformation,
- NULL,
- ulFilter,
- FILE_ACTION_MODIFIED);
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ }
- //
- // Volume invalidations require all objects in the volume be re-verified
- //
+ return ntStatus;
+}
- AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+VOID
+AFSInvalidateAllVolumes( VOID)
+{
+ AFSVolumeCB *pVolumeCB = NULL;
+ AFSVolumeCB *pNextVolumeCB = NULL;
+ AFSDeviceExt *pRDRDeviceExt = NULL;
+ LONG lCount;
- pCurrentObject = VolumeCB->ObjectInfoListHead;
+ pRDRDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
- while( pCurrentObject != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %p SHARED %08lX\n",
+ &pRDRDeviceExt->Specific.RDR.VolumeListLock,
+ PsGetCurrentThread()));
- pCurrentObject->Expiration.QuadPart = 0;
+ AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
+ TRUE);
- pCurrentObject->TargetFileId.Vnode = 0;
+ pVolumeCB = pRDRDeviceExt->Specific.RDR.VolumeListHead;
- pCurrentObject->TargetFileId.Unique = 0;
+ if ( pVolumeCB)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolume Setting VERIFY flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %p SHARED %08lX\n",
+ pVolumeCB->ObjectInfoTree.TreeLock,
+ PsGetCurrentThread()));
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
- if( Reason == AFS_INVALIDATE_FLUSHED ||
- Reason == AFS_INVALIDATE_DATA_VERSION)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
+ }
- pCurrentObject->DataVersion.QuadPart = (ULONGLONG)-1;
+ while( pVolumeCB != NULL)
+ {
- if( pCurrentObject->FileType == AFS_FILE_TYPE_FILE)
- {
+ pNextVolumeCB = (AFSVolumeCB *)pVolumeCB->ListEntry.fLink;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInvalidateVolume Setting VERIFY_DATA flag on fid %08lX-%08lX-%08lX-%08lX\n",
- pCurrentObject->FileId.Cell,
- pCurrentObject->FileId.Volume,
- pCurrentObject->FileId.Vnode,
- pCurrentObject->FileId.Unique);
+ if ( pNextVolumeCB)
+ {
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
- }
+ lCount = AFSVolumeIncrement( pNextVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
- if( pCurrentObject->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
- ulFilter = FILE_NOTIFY_CHANGE_DIR_NAME;
- }
- else
- {
- ulFilter = FILE_NOTIFY_CHANGE_FILE_NAME;
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
+ }
- if( Reason == AFS_INVALIDATE_CREDS)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SECURITY;
- }
+ AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
- if( Reason == AFS_INVALIDATE_DATA_VERSION)
- {
- ulFilter |= FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE;
- }
- else
- {
- ulFilter |= FILE_NOTIFY_CHANGE_ATTRIBUTES;
- }
+ // do I need to hold the volume lock here?
- AFSFsRtlNotifyFullReportChange( pCurrentObject,
- NULL,
- ulFilter,
- FILE_ACTION_MODIFIED);
+ AFSInvalidateVolume( pVolumeCB, AFS_INVALIDATE_EXPIRED);
- pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
- }
+ AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
+ TRUE);
- AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
- break;
- }
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateAllVolumes Decrement count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
+
+ pVolumeCB = pNextVolumeCB;
}
- return ntStatus;
+ AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
}
NTSTATUS
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSVerifyEntry Verifying entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
ntStatus = AFSEvaluateTargetByID( pObjectInfo,
AuthGroup,
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
// 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);
+ 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_SYMLINK:
{
- ASSERT( pDirEnumEntry->TargetNameLength > 0);
-
//
// Update the metadata for the entry
//
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,
+ AFSDbgTrace(( 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))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInvalidateCache Meta Data Update failed %wZ FID %08lX-%08lX-%08lX-%08lX ntStatus %08lX\n",
+ 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,
- ntStatus);
+ pObjectInfo->FileId.Unique));
- break;
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
if( pObjectInfo->Fcb != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyEntry 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);
+ pObjectInfo->FileId.Unique));
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
__try
if( !NT_SUCCESS( stIoStatus.Status))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSVerifyEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
stIoStatus.Status,
- stIoStatus.Information);
+ stIoStatus.Information));
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))
+ {
+
+ AFSDbgTrace(( 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",
+ AFSDbgTrace(( 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);
+ ntStatus));
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
if ( bPurgeExtents)
{
- AFSFlushExtents( pObjectInfo->Fcb);
+ AFSFlushExtents( pObjectInfo->Fcb,
+ AuthGroup);
}
//
// Reacquire the Fcb to purge the cache
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb lock %08lX EXCL %08lX\n",
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
TRUE);
//
+ // Update the metadata for the entry
+ //
+
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgTrace(( 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
//
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)
(PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+
+ //
+ // Update the metadata for the entry
+ //
+
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgTrace(( 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;
+ }
+
+ AFSDbgTrace(( 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,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
}
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
case AFS_FILE_TYPE_DIRECTORY:
{
- AFSFcb *pCurrentFcb = NULL;
- AFSDirectoryCB *pCurrentDirEntry = NULL;
-
//
// For a directory or root entry flush the content of
// the directory enumeration.
if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSVerifyEntry Validating directory content for entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSValidateDirectoryCache( pObjectInfo,
- AuthGroup);
+ ntStatus = AFSValidateDirectoryCache( pObjectInfo,
+ AuthGroup);
AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
+ if ( !NT_SUCCESS( ntStatus))
+ {
+
+ try_return( ntStatus);
+ }
}
//
default:
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSVerifyEntry Attempt to verify node of type %d\n",
- pObjectInfo->FileType);
+ "AFSVerifyEntry Attempt to verify node of type %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ pObjectInfo->FileType,
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
break;
}
if( pDirEnumEntry != NULL)
{
- AFSExFreePool( pDirEnumEntry);
+ AFSExFreePoolWithTag( pDirEnumEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
ULONGLONG ullIndex = 0;
AFSVolumeCB *pVolumeCB = NULL;
- AFSFcb *pFcb = NULL;
- AFSObjectInfoCB *pCurrentObject = NULL;
+ LONG lCount;
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetVolumeState Marking volume state %d Volume Cell %08lX Volume %08lX\n",
VolumeStatus->Online,
VolumeStatus->FileID.Cell,
- VolumeStatus->FileID.Volume);
+ VolumeStatus->FileID.Volume));
//
// Need to locate the Fcb for the directory to purge
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %08lX SHARED %08lX\n",
+ "AFSSetVolumeState Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
&pDevExt->Specific.RDR.VolumeTreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pDevExt->Specific.RDR.VolumeTreeLock, TRUE);
if( pVolumeCB != NULL)
{
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ AFS_VOLUME_REFERENCE_INVALIDATE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSSetVolumeState Increment count on volume %p Cnt %d\n",
+ pVolumeCB,
+ lCount));
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
InterlockedOr( (LONG *)&(pVolumeCB->Flags), AFS_VOLUME_FLAGS_OFFLINE);
}
+ }
+ }
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ return ntStatus;
+}
- pCurrentObject = pVolumeCB->ObjectInfoListHead;;
+NTSTATUS
+AFSSetNetworkState( IN AFSNetworkStatusCB *NetworkStatus)
+{
- while( pCurrentObject != NULL)
- {
+ NTSTATUS ntStatus = STATUS_SUCCESS;
- if( VolumeStatus->Online)
- {
+ __Enter
+ {
- ClearFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
+ if( AFSGlobalRoot == NULL)
+ {
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ try_return( ntStatus);
+ }
- pCurrentObject->DataVersion.QuadPart = (ULONGLONG)-1;
- }
- else
- {
+ AFSAcquireExcl( AFSGlobalRoot->VolumeLock,
+ TRUE);
- SetFlag( pCurrentObject->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID);
- }
+ //
+ // Set the network state according to the information
+ //
- pFcb = pCurrentObject->Fcb;
+ if( NetworkStatus->Online)
+ {
- if( pFcb != NULL &&
- !(VolumeStatus->Online) &&
- pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
- {
+ ClearFlag( AFSGlobalRoot->Flags, AFS_VOLUME_FLAGS_OFFLINE);
+ }
+ else
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSSetVolumeState Marking volume offline and canceling extents Volume Cell %08lX Volume %08lX\n",
- VolumeStatus->FileID.Cell,
- VolumeStatus->FileID.Volume);
+ SetFlag( AFSGlobalRoot->Flags, AFS_VOLUME_FLAGS_OFFLINE);
+ }
- //
- // Clear out the extents
- //
+ AFSReleaseResource( AFSGlobalRoot->VolumeLock);
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Acquiring Fcb extents lock %08lX EXCL %08lX\n",
- &pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+try_exit:
- AFSAcquireExcl( &pFcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
+ NOTHING;
+ }
- pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_CANCELLED;
-
- KeSetEvent( &pFcb->NPFcb->Specific.File.ExtentsRequestComplete,
- 0,
- FALSE);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSSetVolumeState Releasing Fcb extents lock %08lX EXCL %08lX\n",
- &pFcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource);
-
- //
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
-
- (VOID) AFSTearDownFcbExtents( pFcb);
- }
-
- pCurrentObject = (AFSObjectInfoCB *)pCurrentObject->ListEntry.fLink;
- }
-
- AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
-
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
- }
- else
- {
-
- AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
- }
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSSetNetworkState( IN AFSNetworkStatusCB *NetworkStatus)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- __Enter
- {
-
- if( AFSGlobalRoot == NULL)
- {
-
- try_return( ntStatus);
- }
-
- AFSAcquireExcl( AFSGlobalRoot->VolumeLock,
- TRUE);
-
- //
- // Set the network state according to the information
- //
-
- if( NetworkStatus->Online)
- {
-
- ClearFlag( AFSGlobalRoot->Flags, AFS_VOLUME_FLAGS_OFFLINE);
- }
- else
- {
-
- SetFlag( AFSGlobalRoot->Flags, AFS_VOLUME_FLAGS_OFFLINE);
- }
-
- AFSReleaseResource( AFSGlobalRoot->VolumeLock);
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
+ return ntStatus;
+}
NTSTATUS
AFSValidateDirectoryCache( IN AFSObjectInfoCB *ObjectInfo,
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
BOOLEAN bAcquiredLock = FALSE;
AFSDirectoryCB *pCurrentDirEntry = NULL, *pNextDirEntry = NULL;
- AFSFcb *pFcb = NULL;
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Validating content for FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ ObjectInfo->FileId.Unique));
if( !ExIsResourceAcquiredLite( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSValidateDirectoryCache Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
ObjectInfo->Specific.Directory.DirectoryNodeCount > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %08lX for dir FID %08lX-%08lX-%08lX-%08lX\n",
+ "AFSValidateDirectoryCache Empty Node List but Non-Zero Node Count %d for dir FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfo->Specific.Directory.DirectoryNodeCount,
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ ObjectInfo->FileId.Unique));
}
//
while( pCurrentDirEntry != NULL)
{
+ pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
+
if( !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_FAKE))
{
- ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID);
+ //
+ // If this entry has been deleted then process it here
+ //
+
+ if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED) &&
+ pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+ pCurrentDirEntry->NameArrayReferenceCount <= 0)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %08lX\n",
- pCurrentDirEntry,
- pCurrentDirEntry->OpenReferenceCount);
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Deleting dir entry %p name %wZ\n",
+ pCurrentDirEntry,
+ &pCurrentDirEntry->NameInformation.FileName));
+
+ AFSDeleteDirEntry( ObjectInfo,
+ pCurrentDirEntry);
+ }
+ else
+ {
+
+ ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %d\n",
+ pCurrentDirEntry,
+ pCurrentDirEntry->DirOpenReferenceCount));
+
+ //
+ // We pull the short name from the parent tree since it could change below
+ //
+ if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Removing DE %p (%08lX) from shortname tree for %wZ\n",
+ pCurrentDirEntry,
+ pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex,
+ &pCurrentDirEntry->NameInformation.FileName));
+
+ AFSRemoveShortNameDirEntry( &ObjectInfo->Specific.Directory.ShortNameTree,
+ pCurrentDirEntry);
+
+ ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
+ }
+ }
}
- pCurrentDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
+ pCurrentDirEntry = pNextDirEntry;
}
//
// Reget the directory contents
//
- AFSVerifyDirectoryContent( ObjectInfo,
- AuthGroup);
+ ntStatus = AFSVerifyDirectoryContent( ObjectInfo,
+ AuthGroup);
+
+ if ( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
//
// Now start again and tear down any entries not valid
if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID))
{
+ if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME) &&
+ pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex > 0)
+ {
+
+ if( ObjectInfo->Specific.Directory.ShortNameTree == NULL)
+ {
+
+ ObjectInfo->Specific.Directory.ShortNameTree = pCurrentDirEntry;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Insert DE %p to head of shortname tree for %wZ\n",
+ pCurrentDirEntry,
+ &pCurrentDirEntry->NameInformation.FileName));
+
+ SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
+ }
+ else
+ {
+
+ if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ObjectInfo->Specific.Directory.ShortNameTree,
+ pCurrentDirEntry)))
+ {
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Failed to insert DE %p (%08lX) to shortname tree for %wZ\n",
+ pCurrentDirEntry,
+ pCurrentDirEntry->Type.Data.ShortNameTreeEntry.HashIndex,
+ &pCurrentDirEntry->NameInformation.FileName));
+ }
+ else
+ {
+ SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateDirectoryCache Insert DE %p to shortname tree for %wZ\n",
+ pCurrentDirEntry,
+ &pCurrentDirEntry->NameInformation.FileName));
+ }
+ }
+ }
+
pCurrentDirEntry = pNextDirEntry;
continue;
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %08lX\n",
+ "AFSValidateDirectoryCache Processing INVALID DE %p Reference count %d\n",
pCurrentDirEntry,
- pCurrentDirEntry->OpenReferenceCount);
+ pCurrentDirEntry->DirOpenReferenceCount));
- if( pCurrentDirEntry->OpenReferenceCount == 0)
+ if( pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+ pCurrentDirEntry->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Deleting dir entry %wZ from parent FID %08lX-%08lX-%08lX-%08lX\n",
&pCurrentDirEntry->NameInformation.FileName,
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ ObjectInfo->FileId.Unique));
AFSDeleteDirEntry( ObjectInfo,
pCurrentDirEntry);
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Setting dir entry %p Name %wZ DELETED in parent FID %08lX-%08lX-%08lX-%08lX\n",
pCurrentDirEntry,
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ ObjectInfo->FileId.Unique));
SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
}
#endif
+try_exit:
+
if( bAcquiredLock)
{
pObjectInfo->FileAttributes = DirEnumEntry->FileAttributes;
if( pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
- pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK ||
pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK)
{
- pObjectInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ pObjectInfo->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+
+ if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ if ( pObjectInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ pObjectInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ pObjectInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
}
pObjectInfo->EaSize = DirEnumEntry->EaSize;
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;
// correct order
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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:
//
pObjectInfo->Expiration.QuadPart >= liSystemTime.QuadPart)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSValidateEntry Directory entry %wZ FID %08lX-%08lX-%08lX-%08lX VALID\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
try_return( ntStatus);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry Failed to evaluate entry %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ "AFSValidateEntry Failed to evaluate entry FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ FastCall,
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
//
// Failed validation of node so return access-denied
try_return( ntStatus);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Validating entry %wZ FID %08lX-%08lX-%08lX-%08lX DV %I64X returned DV %I64X FT %d\n",
+ "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,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Unique,
pObjectInfo->DataVersion.QuadPart,
pDirEnumEntry->DataVersion.QuadPart,
- pDirEnumEntry->FileType);
+ pDirEnumEntry->FileType));
//
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( 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;
-
- 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);
+ pCurrentFcb = pObjectInfo->Fcb;
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ if( !ExIsResourceAcquiredLite( &pCurrentFcb->NPFcb->Resource))
{
- bPurgeExtents = TRUE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_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);
+ "AFSValidateEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
+ TRUE);
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ bReleaseFcb = TRUE;
}
- __try
+ if( pCurrentFcb != NULL)
{
- CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
+ IO_STATUS_BLOCK stIoStatus;
- if( !NT_SUCCESS( stIoStatus.Status))
+ 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)
{
- 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",
+ 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,
- stIoStatus.Status,
- stIoStatus.Information);
+ pObjectInfo->DataVersion.LowPart,
+ pDirEnumEntry->DataVersion.LowPart));
- ntStatus = stIoStatus.Status;
+ bPurgeExtents = TRUE;
}
- if ( bPurgeExtents)
+ if ( bSafeToPurge)
{
- CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ 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);
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ }
+
+ //
+ // 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.
+ //
+
+ if ( !(bPurgeExtents && bSafeToPurge))
+ {
+
+ ntStatus = AFSUpdateMetaData( DirEntry,
+ pDirEnumEntry);
+
+ if( !NT_SUCCESS( ntStatus))
{
- ntStatus = GetExceptionCode();
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry CcFlushCache or CcPurgeCacheSection exception %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ "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));
+ break;
}
- AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
- if ( bPurgeExtents)
- {
- AFSFlushExtents( pCurrentFcb);
- }
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
//
- // Reacquire the Fcb to purge the cache
+ // Update file sizes
//
- 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);
- }
-
- //
- // Update the metadata for the entry
- //
-
- ntStatus = AFSUpdateMetaData( DirEntry,
- pDirEnumEntry);
-
- if( !NT_SUCCESS( ntStatus))
- {
+ if( pObjectInfo->Fcb != NULL)
+ {
+ FILE_OBJECT *pCCFileObject;
- 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);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- break;
- }
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
- //
- // 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;
- if( pObjectInfo->Fcb != NULL)
- {
- FILE_OBJECT *pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+ if ( pCCFileObject != NULL)
+ {
+ CcSetFileSizes( pCCFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ }
- 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,
+ "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- if ( pCCFileObject != NULL)
- {
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
}
-
break;
}
case AFS_FILE_TYPE_DIRECTORY:
{
- AFSDirectoryCB *pCurrentDirEntry = NULL;
-
- if( pCurrentFcb != NULL &&
- pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+ if( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
{
//
// the directory enumeration.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSValidateEntry Acquiring DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSValidateEntry Validating directory content for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSValidateDirectoryCache( pCurrentFcb->ObjectInformation,
- AuthGroup);
+ ntStatus = AFSValidateDirectoryCache( pObjectInfo,
+ AuthGroup);
AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSValidateEntry Failed to re-enumerate %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
break;
}
default:
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
- "AFSValidateEntry Attempt to verify node of type %d\n",
- pObjectInfo->FileType);
-
+ "AFSValidateEntry Attempt to verify node of type %d FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ pObjectInfo->FileType,
+ FastCall,
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
break;
}
if( pDirEnumEntry != NULL)
{
- AFSExFreePool( pDirEnumEntry);
+ AFSExFreePoolWithTag( pDirEnumEntry, AFS_GENERIC_MEMORY_2_TAG);
}
}
UNICODE_STRING uniShareName;
ULONG ulEntryLength = 0;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
__Enter
{
RtlInitUnicodeString( &uniShareName,
- L"PIPE\\srvsvc");
+ L"PIPE");
pObjectInfoCB = AFSAllocateObjectInfo( &AFSGlobalRoot->ObjectInformation,
0);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeSpecialShareNameList (srvsvc) Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
- pObjectInfoCB->ObjectReferenceCount = 1;
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
- pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
ulEntryLength = sizeof( AFSDirectoryCB) +
uniShareName.Length;
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_SERVER_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);
-
- AFSSpecialShareNames = pDirNode;
-
- pLastDirNode = pDirNode;
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
- RtlInitUnicodeString( &uniShareName,
- L"PIPE\\wkssvc");
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
- pObjectInfoCB = AFSAllocateObjectInfo( &AFSGlobalRoot->ObjectInformation,
- 0);
+ if ( lCount == 0)
+ {
- if( pObjectInfoCB == NULL)
- {
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
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);
- }
+ "AFSInitializeSpecialShareNameList (srvsvc) AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
// Set valid entry
//
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_WORKSTATION_SERVICE);
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID | AFS_DIR_ENTRY_PIPE_SERVICE);
pDirNode->NameInformation.FileName.Length = uniShareName.Length;
pDirNode->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pDirNode->NameInformation.FileName,
TRUE);
- pLastDirNode->ListEntry.fLink = pDirNode;
-
- pDirNode->ListEntry.bLink = pLastDirNode;
+ AFSSpecialShareNames = pDirNode;
pLastDirNode = pDirNode;
+
RtlInitUnicodeString( &uniShareName,
L"IPC$");
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitializeSpecialShareNameList (ipc$) Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
- pObjectInfoCB->ObjectReferenceCount = 1;
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
- pObjectInfoCB->FileType = AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
ulEntryLength = sizeof( AFSDirectoryCB) +
uniShareName.Length;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList (ipc$) AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
ExFreePool( pDirNode);
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeSpecialShareNameList Decrement count on object %p Cnt %d\n",
+ pDirNode->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
__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
- {
+ AFSDbgTrace(( 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
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)
pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
- if( pCurrentDirEntry->OpenReferenceCount == 0)
+ if( pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+ pCurrentDirEntry->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSResetDirectoryContent Deleting dir entry %p for %wZ\n",
pCurrentDirEntry,
- &pCurrentDirEntry->NameInformation.FileName);
+ &pCurrentDirEntry->NameInformation.FileName));
AFSDeleteDirEntry( ObjectInfoCB,
pCurrentDirEntry);
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSResetDirectoryContent Setting DELETE flag in dir entry %p for %wZ\n",
pCurrentDirEntry,
- &pCurrentDirEntry->NameInformation.FileName);
+ &pCurrentDirEntry->NameInformation.FileName));
SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
ObjectInfoCB->Specific.Directory.DirectoryNodeCount = 0;
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSResetDirectoryContent Reset count to 0 on parent FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
}
return ntStatus;
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %08lX EXCL %08lX\n",
+ "AFSEnumerateGlobalRoot Acquiring GlobalRoot DirectoryNodeHdr.TreeLock lock %p EXCL %08lX\n",
AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
pDirGlobalDirNode = AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeListHead;
- //
- // Indicate the node is initialized
- //
-
- SetFlag( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
-
uniFullName.MaximumLength = PAGE_SIZE;
uniFullName.Length = 0;
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;
return ntStatus;
}
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
- IN ULONG InitialElementCount)
+void
+AFSSetEnumerationEvent( IN AFSFcb *Fcb)
{
+ LONG lCount;
- AFSNameArrayHdr *pNameArray = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+ //
+ // Depending on the type of node, set the event
+ //
- __Enter
+ switch( Fcb->Header.NodeTypeCode)
{
- if( InitialElementCount == 0)
- {
-
- InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
- }
-
- pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)),
- AFS_NAME_ARRAY_TAG);
-
- if( pNameArray == NULL)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInitNameArray Failed to allocate name array\n");
+ lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- try_return( pNameArray);
+ break;
}
+ }
- RtlZeroMemory( pNameArray,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)));
-
- pNameArray->MaxElementCount = InitialElementCount;
+ return;
+}
- if( DirectoryCB != NULL)
- {
+void
+AFSClearEnumerationEvent( IN AFSFcb *Fcb)
+{
- pNameArray->CurrentEntry = &pNameArray->ElementArray[ 0];
+ LONG lCount;
- InterlockedIncrement( &pNameArray->Count);
+ //
+ // Depending on the type of node, set the event
+ //
- InterlockedIncrement( &DirectoryCB->OpenReferenceCount);
+ switch( Fcb->Header.NodeTypeCode)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray Increment count on %wZ DE %p Cnt %d\n",
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- DirectoryCB->OpenReferenceCount);
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
+ {
- pNameArray->CurrentEntry->DirectoryCB = DirectoryCB;
+ ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
- pNameArray->CurrentEntry->Component = DirectoryCB->NameInformation.FileName;
+ lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- pNameArray->CurrentEntry->FileId = DirectoryCB->ObjectInformation->FileId;
+ break;
}
-
-try_exit:
-
- NOTHING;
}
- return pNameArray;
+ return;
}
-NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
- IN UNICODE_STRING *Path,
- IN AFSDirectoryCB *DirectoryCB)
+BOOLEAN
+AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
{
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- UNICODE_STRING uniComponentName, uniRemainingPath;
- AFSObjectInfoCB *pCurrentObject = NULL;
- ULONG ulTotalCount = 0;
- ULONG ulIndex = 0;
- USHORT usLength = 0;
+ BOOLEAN bIsInProcess = FALSE;
__Enter
{
- //
- // Init some info in the header
- //
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- NameArray->CurrentEntry = pCurrentElement;
-
- //
- // The first entry points at the root
- //
-
- pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
-
- InterlockedIncrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray Increment count on volume %wZ DE %p Cnt %d\n",
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- pCurrentElement->DirectoryCB->OpenReferenceCount);
+ if( ObjectInfo->Fcb == NULL)
+ {
- pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
+ try_return( bIsInProcess);
+ }
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
+ switch( ObjectInfo->Fcb->Header.NodeTypeCode)
+ {
- NameArray->Count = 1;
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
+ {
- NameArray->LinkCount = 0;
+ if( ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0)
+ {
- //
- // If the root is the parent then we are done ...
- //
+ bIsInProcess = TRUE;
+ }
- if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
- {
- try_return( ntStatus);
+ break;
+ }
}
try_exit:
NOTHING;
}
- return ntStatus;
+ return bIsInProcess;
}
NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
- IN AFSNameArrayHdr *RelatedNameArray,
- IN AFSDirectoryCB *DirectoryCB)
+AFSVerifyVolume( IN ULONGLONG ProcessId,
+ IN AFSVolumeCB *VolumeCB)
{
+ UNREFERENCED_PARAMETER(ProcessId);
+ UNREFERENCED_PARAMETER(VolumeCB);
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
- UNICODE_STRING uniComponentName, uniRemainingPath;
- AFSObjectInfoCB *pObjectInfo = NULL;
- ULONG ulTotalCount = 0;
- ULONG ulIndex = 0;
- USHORT usLength = 0;
- __Enter
- {
- //
- // Init some info in the header
- //
+ return ntStatus;
+}
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- pCurrentRelatedElement = &RelatedNameArray->ElementArray[ 0];
-
- NameArray->Count = 0;
-
- NameArray->LinkCount = RelatedNameArray->LinkCount;
-
- //
- // Populate the name array with the data from the related array
- //
-
- while( TRUE)
- {
-
- pCurrentElement->DirectoryCB = pCurrentRelatedElement->DirectoryCB;
-
- pCurrentElement->Component = pCurrentRelatedElement->DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = pCurrentElement->DirectoryCB->ObjectInformation->FileId;
-
- InterlockedIncrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray Increment count on %wZ DE %p Cnt %d\n",
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- InterlockedIncrement( &NameArray->Count);
-
- if( pCurrentElement->DirectoryCB == DirectoryCB ||
- NameArray->Count == RelatedNameArray->Count)
- {
-
- //
- // Done ...
- //
-
- break;
- }
-
- pCurrentElement++;
-
- pCurrentRelatedElement++;
- }
-
- if( NameArray->Count > 0)
- {
- NameArray->CurrentEntry = pCurrentElement;
- }
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
-
- __Enter
- {
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- while( TRUE)
- {
-
- if( pCurrentElement->DirectoryCB == NULL)
- {
-
- break;
- }
-
- InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray Decrement count on %wZ DE %p Cnt %d\n",
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- pCurrentElement++;
- }
-
- AFSExFreePool( NameArray);
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-
- __Enter
- {
-
- if( NameArray->Count == NameArray->MaxElementCount)
- {
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- if( NameArray->CurrentEntry != NULL &&
- NameArray->CurrentEntry->DirectoryCB == DirEntry)
- {
-
- try_return( ntStatus);
- }
-
- if( NameArray->Count > 0)
- {
-
- NameArray->CurrentEntry++;
- }
- else
- {
- NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
- }
-
- InterlockedIncrement( &NameArray->Count);
-
- InterlockedIncrement( &DirEntry->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,
- DirEntry->OpenReferenceCount);
-
- NameArray->CurrentEntry->DirectoryCB = DirEntry;
-
- NameArray->CurrentEntry->Component = DirEntry->NameInformation.FileName;
-
- NameArray->CurrentEntry->FileId = DirEntry->ObjectInformation->FileId;
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-void
-AFSReplaceCurrentElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- ASSERT( NameArray->CurrentEntry != NULL);
-
- 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,
- NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
-
- 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,
- DirectoryCB->OpenReferenceCount);
-
- NameArray->CurrentEntry->DirectoryCB = DirectoryCB;
-
- NameArray->CurrentEntry->Component = DirectoryCB->NameInformation.FileName;
-
- NameArray->CurrentEntry->FileId = DirectoryCB->ObjectInformation->FileId;
-
- if( DirectoryCB->ObjectInformation->ParentObjectInformation == NULL)
- {
-
- SetFlag( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- return;
-}
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pCurrentDirEntry = NULL;
-
- __Enter
- {
-
- if( NameArray->Count == 0)
- {
- try_return( pCurrentDirEntry);
- }
-
- InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry Decrement count on %wZ DE %p Cnt %d\n",
- &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
- NameArray->CurrentEntry->DirectoryCB,
- NameArray->CurrentEntry->DirectoryCB->OpenReferenceCount);
-
- NameArray->CurrentEntry->DirectoryCB = NULL;
-
- if( InterlockedDecrement( &NameArray->Count) == 0)
- {
- NameArray->CurrentEntry = NULL;
- }
- else
- {
- NameArray->CurrentEntry--;
- pCurrentDirEntry = NameArray->CurrentEntry->DirectoryCB;
- }
-
-try_exit:
-
- NOTHING;
- }
-
- return pCurrentDirEntry;
-}
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pDirEntry = NULL;
- AFSNameArrayCB *pElement = NULL;
-
- __Enter
- {
-
- if( NameArray->Count == 0 ||
- NameArray->Count == 1)
- {
-
- try_return( pDirEntry = NULL);
- }
-
- pElement = &NameArray->ElementArray[ NameArray->Count - 2];
-
- pDirEntry = pElement->DirectoryCB;
-
-try_exit:
-
- NOTHING;
- }
-
- return pDirEntry;
-}
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirEntry)
-{
-
- AFSNameArrayCB *pCurrentElement = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
-
- __Enter
- {
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- while( TRUE)
- {
-
- if( pCurrentElement->DirectoryCB == NULL)
- {
-
- break;
- }
-
- InterlockedDecrement( &pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray Decrement count on %wZ DE %p Cnt %d\n",
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- pCurrentElement->DirectoryCB->OpenReferenceCount);
-
- pCurrentElement++;
- }
-
- RtlZeroMemory( NameArray,
- sizeof( AFSNameArrayHdr) +
- ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
-
- NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
-
- if( DirEntry != NULL)
- {
-
- NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
-
- InterlockedIncrement( &NameArray->Count);
-
- InterlockedIncrement( &DirEntry->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,
- DirEntry->OpenReferenceCount);
-
- NameArray->CurrentEntry->DirectoryCB = DirEntry;
-
- NameArray->CurrentEntry->Component = DirEntry->NameInformation.FileName;
-
- NameArray->CurrentEntry->FileId = DirEntry->ObjectInformation->FileId;
- }
- }
-
- return;
-}
-
-void
-AFSDumpNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSNameArrayCB *pCurrentElement = NULL;
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- AFSPrint("AFSDumpNameArray Start (%d)\n", NameArray->Count);
-
- while( pCurrentElement->DirectoryCB != NULL)
- {
-
- AFSPrint("FID %08lX-%08lX-%08lX-%08lX %wZ\n",
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName);
-
- pCurrentElement++;
- }
-
- AFSPrint("AFSDumpNameArray End\n\n");
-
- return;
-}
-
-void
-AFSSetEnumerationEvent( IN AFSFcb *Fcb)
-{
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- {
-
- KeSetEvent( &Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- 0,
- FALSE);
-
- InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
-
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- KeSetEvent( &Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent,
- 0,
- FALSE);
-
- InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
- }
-
- return;
-}
-
-void
-AFSClearEnumerationEvent( IN AFSFcb *Fcb)
-{
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- {
-
- ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
- if( InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount) == 0)
- {
-
- KeClearEvent( &Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent);
- }
-
- break;
- }
-
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
- if( InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount) == 0)
- {
-
- KeClearEvent( &Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent);
- }
-
- break;
- }
- }
-
- return;
-}
-
-BOOLEAN
-AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
-{
-
- BOOLEAN bIsInProcess = FALSE;
-
- __Enter
- {
-
- if( ObjectInfo->Fcb == NULL)
- {
-
- try_return( bIsInProcess);
- }
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( ObjectInfo->Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- {
-
- if( KeReadStateEvent( &ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent))
- {
-
- bIsInProcess = TRUE;
- }
-
- break;
- }
-
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- if( KeReadStateEvent( &ObjectInfo->Fcb->NPFcb->Specific.Directory.DirectoryEnumEvent))
- {
-
- bIsInProcess = TRUE;
- }
-
- break;
- }
- }
-
-try_exit:
-
- NOTHING;
- }
-
- return bIsInProcess;
-}
-
-NTSTATUS
-AFSVerifyVolume( IN ULONGLONG ProcessId,
- IN AFSVolumeCB *VolumeCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ObjectInfo)
-{
+NTSTATUS
+AFSInitPIOCtlDirectoryCB( IN AFSObjectInfoCB *ParentObjectInfo)
+{
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSObjectInfoCB *pObjectInfoCB = NULL;
AFSDirectoryCB *pDirNode = NULL;
ULONG ulEntryLength = 0;
AFSNonPagedDirectoryCB *pNonPagedDirEntry = NULL;
+ LONG lCount;
__Enter
{
- pObjectInfoCB = AFSAllocateObjectInfo( ObjectInfo,
+ pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
0);
if( pObjectInfoCB == NULL)
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitPIOCtlDirectoryCB Initializing count (1) on object %08lX\n",
- pObjectInfoCB);
+ lCount = AFSObjectInfoIncrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
- pObjectInfoCB->ObjectReferenceCount = 1;
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
- pObjectInfoCB->FileType = AFS_FILE_TYPE_PIOCTL;
+ pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM;
if( pDirNode == NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
+ pDirNode));
+
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
AFS_DIR_ENTRY_NP_TAG);
pDirNode->CaseInsensitiveTreeEntry.HashIndex = AFSGenerateCRC( &pDirNode->NameInformation.FileName,
TRUE);
- ObjectInfo->Specific.Directory.PIOCtlDirectoryCB = pDirNode;
+ if ( InterlockedCompareExchangePointer( (PVOID *)&ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %p pFcb %p\n",
+ ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
+ pDirNode));
+
+ try_return( ntStatus = STATUS_REPARSE);
+ }
try_exit:
- if ( !NT_SUCCESS( ntStatus))
+ if ( ntStatus != STATUS_SUCCESS)
{
if ( pDirNode != NULL)
{
- AFSExFreePool( pDirNode);
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG deallocating %p\n",
+ pDirNode));
+
+ AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
+ }
+
+ if( pNonPagedDirEntry != NULL)
+ {
+
+ ExDeleteResourceLite( &pNonPagedDirEntry->Lock);
+
+ AFSExFreePoolWithTag( pNonPagedDirEntry, AFS_DIR_ENTRY_NP_TAG);
}
if ( pObjectInfoCB != NULL)
{
- AFSDeleteObjectInfo( pObjectInfoCB);
+ lCount = AFSObjectInfoDecrement( pObjectInfoCB,
+ AFS_OBJECT_REFERENCE_DIRENTRY);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n",
+ pObjectInfoCB,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
}
}
}
IN AFSDirectoryCB *DirectoryCB,
IN UNICODE_STRING *ParentPathName,
IN AFSNameArrayHdr *RelatedNameArray,
+ IN GUID *AuthGroup,
OUT AFSFileInfoCB *FileInfo)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
- UNICODE_STRING uniFullPathName;
+ AFSDirEnumEntry *pDirEntry = NULL;
+ UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
- GUID *pAuthGroup = NULL;
+ LONG lCount;
__Enter
{
AFSReleaseResource( &DirectoryCB->NonPaged->Lock);
- if( ParentDirectoryCB->ObjectInformation->Fcb != NULL)
- {
- pAuthGroup = &ParentDirectoryCB->ObjectInformation->Fcb->AuthGroup;
- }
- else if( DirectoryCB->ObjectInformation->Fcb != NULL)
- {
- pAuthGroup = &DirectoryCB->ObjectInformation->Fcb->AuthGroup;
- }
-
ntStatus = AFSEvaluateTargetByID( DirectoryCB->ObjectInformation,
- pAuthGroup,
+ AuthGroup,
FALSE,
&pDirEntry);
if( pDirEntry != NULL)
{
- ntStatus = STATUS_ACCESS_DENIED;
+ ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
}
try_return( ntStatus);
pVolumeCB = ParentDirectoryCB->ObjectInformation->VolumeCB;
- AFSAcquireShared( pVolumeCB->VolumeLock,
- TRUE);
-
pParentDirEntry = ParentDirectoryCB;
}
else
AFSReleaseResource( &DirectoryCB->NonPaged->Lock);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSRetrieveFileAttributes Name %wZ contains invalid server name\n",
- &uniFullPathName);
+ &uniFullPathName));
try_return( ntStatus = STATUS_OBJECT_PATH_INVALID);
}
pVolumeCB = AFSGlobalRoot;
- AFSAcquireShared( pVolumeCB->VolumeLock,
- TRUE);
-
pParentDirEntry = AFSGlobalRoot->DirectoryCB;
}
// Increment the ref count on the volume and dir entry for correct processing below
//
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_FILE_ATTRS;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Increment count on volume %08lX Cnt %d\n",
+ "AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason,
+ lCount));
- InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRetrieveFileAttributes Increment count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirEntry->NameInformation.FileName,
pParentDirEntry,
NULL,
- pParentDirEntry->OpenReferenceCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&uniParsedName,
pNameArray,
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL,
- &pVolumeCB,
- &pParentDirEntry,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &NewVolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
+ if ( pNewVolumeCB != NULL)
{
-
//
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
//
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( pVolumeCB != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pVolumeCB = pNewVolumeCB;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSReleaseResource( pVolumeCB->VolumeLock);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
- InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- pDirectoryEntry->OpenReferenceCount);
- }
- else
- {
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount));
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- pParentDirEntry->OpenReferenceCount);
- }
- }
+ pParentDirEntry = pNewParentDirEntry;
- pVolumeCB = NULL;
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
try_return( ntStatus);
}
// Check for the mount point being returned
//
- if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+ if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+ pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_DFSLINK)
{
FileInfo->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
}
- else if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK ||
- pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_DFSLINK)
+ else if( pDirectoryEntry->ObjectInformation->FileType == AFS_FILE_TYPE_SYMLINK)
{
- FileInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ if ( FileInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ FileInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ FileInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
}
FileInfo->AllocationSize = pDirectoryEntry->ObjectInformation->AllocationSize;
FileInfo->ChangeTime = pDirectoryEntry->ObjectInformation->ChangeTime;
- //
- // Remove the reference made above
- //
+try_exit:
+
+ if( pDirEntry != NULL)
+ {
- InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
+ }
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- pDirectoryEntry->OpenReferenceCount);
+ if( pDirectoryEntry != NULL)
+ {
-try_exit:
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
- if( pDirEntry != NULL)
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
}
if( pVolumeCB != NULL)
{
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on volume %08lX Cnt %d\n",
+ "AFSRetrieveFileAttributes Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
-
- AFSReleaseResource( pVolumeCB->VolumeLock);
+ VolumeReferenceReason,
+ lCount));
}
if( pNameArray != NULL)
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
- AFSExFreePool( uniFullPathName.Buffer);
+ AFSExFreePoolWithTag( uniFullPathName.Buffer, 0);
}
- AFSExFreePool( pwchBuffer);
+ AFSExFreePoolWithTag( pwchBuffer, 0);
}
}
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
__Enter
{
if( pObjectInfo->NonPagedInfo == NULL)
{
- AFSExFreePool( pObjectInfo);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
try_return( pObjectInfo = NULL);
}
ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
-
- pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+ ExInitializeResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- pObjectInfo->ParentObjectInformation = ParentObjectInfo;
+ pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock = &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock;
if( ParentObjectInfo != NULL)
{
- InterlockedIncrement( &ParentObjectInfo->ObjectReferenceCount);
+
+ pObjectInfo->VolumeCB = ParentObjectInfo->VolumeCB;
+
+ pObjectInfo->ParentFileId = ParentObjectInfo->FileId;
+
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ lCount = AFSObjectInfoIncrement( ParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
+ ParentObjectInfo,
+ lCount));
}
//
if( HashIndex != 0)
{
+ ASSERT( ParentObjectInfo);
+
//
// Insert the entry into the object tree and list
//
return pObjectInfo;
}
+LONG
+AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason)
+{
+
+ 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);
+ }
+ }
+
+ InterlockedIncrement( &ObjectInfo->ObjectReferences[ Reason]);
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+LONG
+AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo,
+ IN LONG Reason)
+{
+
+ LONG lCount, lCount2;
+
+ 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);
+ }
+
+ lCount2 = InterlockedDecrement( &ObjectInfo->ObjectReferences[ Reason]);
+
+ ASSERT( lCount2 >= 0);
+
+ AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ return lCount;
+}
+
+AFSObjectInfoCB *
+AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
+ IN AFSFileID *FileId)
+{
+ DWORD ntStatus = STATUS_SUCCESS;
+ ULONGLONG ullIndex;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
+
+ if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
+ {
+
+ pObjectInfo = &VolumeCB->ObjectInformation;
+ }
+ else
+ {
+
+ AFSAcquireExcl( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ ntStatus = AFSLocateHashEntry( VolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
+
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+ }
+
+ if ( NT_SUCCESS( ntStatus)) {
+
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSFindObjectInfo Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
+ }
+
+ return pObjectInfo;
+}
+
+void
+AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
+{
+ LONG lCount;
+
+ lCount = AFSObjectInfoDecrement( *ppObjectInfo,
+ AFS_OBJECT_REFERENCE_FIND);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSReleaseObjectInfo Decrement count on object %p Cnt %d\n",
+ *ppObjectInfo,
+ lCount));
+
+ *ppObjectInfo = NULL;
+}
+
void
-AFSDeleteObjectInfo( IN AFSObjectInfoCB *ObjectInfo)
+AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
BOOLEAN bAcquiredTreeLock = FALSE;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ BOOLEAN bHeldInService;
+ AFSObjectInfoCB * pParentObjectInfo = NULL;
+ AFSFileID FileId;
+ LONG lCount;
+
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ {
+
+ //
+ // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+ // embedded in the VolumeCB.
+ //
+
+ ASSERT( FALSE);
+
+ return;
+ }
+
+ pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+ NULL,
+ *ppObjectInfo);
+
+ if ( pObjectInfo == NULL)
+ {
+
+ return;
+ }
+
+ ASSERT( *ppObjectInfo == NULL);
- if( !ExIsResourceAcquiredExclusiveLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
+ ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+
+ bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+
+ if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
{
- ASSERT( !ExIsResourceAcquiredLite( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+ ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
- AFSAcquireExcl( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
TRUE);
bAcquiredTreeLock = TRUE;
}
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+ {
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId);
+ }
+
//
// Remove it from the tree and list if it was inserted
//
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
{
- AFSRemoveHashEntry( &ObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &ObjectInfo->TreeEntry);
+ AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
}
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
{
- if( ObjectInfo->ListEntry.fLink == NULL)
+ if( pObjectInfo->ListEntry.fLink == NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)ObjectInfo->ListEntry.bLink;
+ pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
- if( ObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
+ if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+ pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
}
}
else
{
- ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.fLink))->ListEntry.bLink = ObjectInfo->ListEntry.bLink;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
}
- if( ObjectInfo->ListEntry.bLink == NULL)
+ if( pObjectInfo->ListEntry.bLink == NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)ObjectInfo->ListEntry.fLink;
+ pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
- if( ObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+ if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
{
- ObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+ pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
}
}
else
{
- ((AFSObjectInfoCB *)(ObjectInfo->ListEntry.bLink))->ListEntry.fLink = ObjectInfo->ListEntry.fLink;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
}
}
- if( ObjectInfo->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- InterlockedDecrement( &ObjectInfo->ParentObjectInformation->ObjectReferenceCount);
+
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ lCount = AFSObjectInfoDecrement( pParentObjectInfo,
+ AFS_OBJECT_REFERENCE_CHILD);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
+ pParentObjectInfo,
+ lCount));
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
if( bAcquiredTreeLock)
{
- AFSReleaseResource( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+ AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+ }
+
+ if( bHeldInService)
+ {
+
+ FileId = pObjectInfo->FileId;
}
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+
+ AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+
//
// Release the fid in the service
//
- if( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE))
+ if( bHeldInService)
{
- AFSReleaseFid( &ObjectInfo->FileId);
+ AFSReleaseFid( &FileId);
}
- ExDeleteResourceLite( &ObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
-
- AFSExFreePool( ObjectInfo->NonPagedInfo);
-
- AFSExFreePool( ObjectInfo);
-
return;
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDirEnumEntry *pDirEntry = NULL, *pLastDirEntry = NULL;
- UNICODE_STRING uniFullPathName;
+ AFSDirEnumEntry *pDirEntry = NULL;
+ UNICODE_STRING uniFullPathName = {0};
AFSNameArrayHdr *pNameArray = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
WCHAR *pwchBuffer = NULL;
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
- GUID *pAuthGroup = NULL;
+ GUID stAuthGroup;
+ LONG lCount;
+
+ __Enter
+ {
+
+ ntStatus = AFSRetrieveValidAuthGroup( NULL,
+ DirectoryCB->ObjectInformation,
+ FALSE,
+ &stAuthGroup);
- __Enter
- {
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
//
// Retrieve a target name for the entry
AFSReleaseResource( &DirectoryCB->NonPaged->Lock);
- if( DirectoryCB->ObjectInformation->Fcb != NULL)
- {
- pAuthGroup = &DirectoryCB->ObjectInformation->Fcb->AuthGroup;
- }
-
ntStatus = AFSEvaluateTargetByID( DirectoryCB->ObjectInformation,
- pAuthGroup,
+ &stAuthGroup,
FALSE,
&pDirEntry);
if( pDirEntry != NULL)
{
- ntStatus = STATUS_ACCESS_DENIED;
+ ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
}
try_return( ntStatus);
pVolumeCB = AFSGlobalRoot;
- AFSAcquireShared( pVolumeCB->VolumeLock,
- TRUE);
-
pParentDirEntry = AFSGlobalRoot->DirectoryCB;
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_EVAL_ROOT;
+
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Increment count on volume %08lX Cnt %d\n",
+ "AFSEvaluateRootEntry Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason,
+ lCount));
- InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEvaluateRootEntry Increment count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirEntry->NameInformation.FileName,
pParentDirEntry,
NULL,
- pParentDirEntry->OpenReferenceCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&uniParsedName,
pNameArray,
0,
- &pVolumeCB,
- &pParentDirEntry,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &VolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
+ if ( pNewVolumeCB != NULL)
{
-
//
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
//
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( pVolumeCB != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pVolumeCB = pNewVolumeCB;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSReleaseResource( pVolumeCB->VolumeLock);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
+
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- pDirectoryEntry->OpenReferenceCount);
- }
- else
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount));
- InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ pParentDirEntry = pNewParentDirEntry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- pParentDirEntry->OpenReferenceCount);
- }
- }
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
pVolumeCB = NULL;
//
// Pass back the target dir entry for this request
+ // The caller must release the DirOpenReferenceCount
//
*TargetDirEntry = pDirectoryEntry;
+ pDirectoryEntry = NULL;
+
try_exit:
+ if( pDirectoryEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
if( pDirEntry != NULL)
{
- AFSExFreePool( pDirEntry);
+ AFSExFreePoolWithTag( pDirEntry, AFS_GENERIC_MEMORY_2_TAG);
}
if( pVolumeCB != NULL)
{
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry2 Decrement count on volume %08lX Cnt %d\n",
+ "AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
-
- AFSReleaseResource( pVolumeCB->VolumeLock);
+ VolumeReferenceReason,
+ lCount));
}
if( pNameArray != NULL)
pwchBuffer != (WCHAR *)((char *)uniFullPathName.Buffer - ulNameDifference))
{
- AFSExFreePool( uniFullPathName.Buffer);
+ AFSExFreePoolWithTag( uniFullPathName.Buffer, 0);
}
- AFSExFreePool( pwchBuffer);
+ AFSExFreePoolWithTag( pwchBuffer, 0);
}
}
!BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- AFSAcquireExcl( &Fcb->NPFcb->Resource,
- TRUE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireShared( &Fcb->NPFcb->Resource,
+ TRUE);
if( Fcb->OpenReferenceCount > 0)
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
__try
{
if( !NT_SUCCESS( stIoStatus.Status))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSCleanupFcb CcFlushCache [1] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
Fcb->ObjectInformation->FileId.Cell,
Fcb->ObjectInformation->FileId.Vnode,
Fcb->ObjectInformation->FileId.Unique,
stIoStatus.Status,
- stIoStatus.Information);
+ stIoStatus.Information));
ntStatus = stIoStatus.Status;
}
- CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE);
+ if ( Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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();
+
+ AFSDbgTrace(( 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);
}
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
AFSReleaseResource( &Fcb->NPFcb->Resource);
//
// Now perform another flush on the file
//
- if( !NT_SUCCESS( AFSFlushExtents( Fcb)))
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)))
{
- AFSReleaseExtentsWithFlush( Fcb);
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
}
}
BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- AFSTearDownFcbExtents( Fcb);
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
}
try_return( ntStatus);
// 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))
{
-
- if( !NT_SUCCESS( AFSFlushExtents( Fcb)) &&
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)) &&
Fcb->OpenReferenceCount == 0)
{
- AFSReleaseExtentsWithFlush( Fcb);
+ AFSReleaseExtentsWithFlush( Fcb,
+ 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);
- }
//
// 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
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ if ( AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource, ForceFlush))
{
- CcFlushCache( &Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- &stIoStatus);
+ __try
+ {
+
+ CcFlushCache( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
+
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
+
+ AFSDbgTrace(( 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( ForceFlush &&
+ Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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));
- if( !NT_SUCCESS( stIoStatus.Status))
+ 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();
+
+ AFSDbgTrace(( 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)
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
+
+ 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);
+ 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);
PIRP pIrp = NULL;
KEVENT kEvent;
PIO_STACK_LOCATION pIoStackLocation = NULL;
- AFSDeviceExt *pRdrDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
DEVICE_OBJECT *pTargetDeviceObject = NULL;
FILE_OBJECT *pCacheFileObject = NULL;
IN PVOID Context)
{
+ UNREFERENCED_PARAMETER(Irp);
+ UNREFERENCED_PARAMETER(DeviceObject);
KEVENT *pEvent = (KEVENT *)Context;
KeSetEvent( pEvent,
if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveNameEntry DE %p for %wZ has NOT_IN flag set\n",
DirEntry,
- &DirEntry->NameInformation.FileName);
+ &DirEntry->NameInformation.FileName));
try_return( ntStatus);
}
// Remove the entry from the parent tree
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveNameEntry DE %p for %wZ removing from case sensitive tree\n",
DirEntry,
- &DirEntry->NameInformation.FileName);
+ &DirEntry->NameInformation.FileName));
AFSRemoveCaseSensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
DirEntry);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveNameEntry DE %p for %wZ removing from case insensitive tree\n",
DirEntry,
- &DirEntry->NameInformation.FileName);
+ &DirEntry->NameInformation.FileName));
AFSRemoveCaseInsensitiveDirEntry( &ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
DirEntry);
- if( ParentObjectInfo->Specific.Directory.ShortNameTree &&
- DirEntry->Type.Data.ShortNameTreeEntry.HashIndex != 0)
+ if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME))
{
//
// From the short name tree
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveNameEntry DE %p for %wZ removing from shortname tree\n",
DirEntry,
- &DirEntry->NameInformation.FileName);
+ &DirEntry->NameInformation.FileName));
AFSRemoveShortNameDirEntry( &ParentObjectInfo->Specific.Directory.ShortNameTree,
DirEntry);
+
+ ClearFlag( DirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRemoveNameEntry DE %p for %wZ setting NOT_IN flag\n",
DirEntry,
- &DirEntry->NameInformation.FileName);
+ &DirEntry->NameInformation.FileName));
SetFlag( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE);
+ ClearFlag( DirEntry->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD);
+
try_exit:
NOTHING;
if( hToken == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+ AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
AFS_TRACE_LEVEL_ERROR,
- "AFSGetAuthenticationId Failed to retrieve impersonation or primary token\n");
+ "AFSGetAuthenticationId Failed to retrieve impersonation or primary token\n"));
try_return( ntStatus);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+ AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
AFS_TRACE_LEVEL_ERROR,
- "AFSGetAuthenticationId Failed to retrieve information Status %08lX\n", ntStatus);
+ "AFSGetAuthenticationId Failed to retrieve information Status %08lX\n",
+ ntStatus));
try_return( ntStatus);
}
liAuthId.HighPart = pTokenInfo->AuthenticationId.HighPart;
liAuthId.LowPart = pTokenInfo->AuthenticationId.LowPart;
- AFSDbgLogMsg( AFS_SUBSYSTEM_NETWORK_PROVIDER,
+ AFSDbgTrace(( AFS_SUBSYSTEM_NETWORK_PROVIDER,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetAuthenticationId Successfully retrieved authentication ID %I64X\n",
- liAuthId.QuadPart);
+ liAuthId.QuadPart));
try_exit:
if( pTokenInfo != NULL)
{
- AFSExFreePool( pTokenInfo);
+ ExFreePool( pTokenInfo); // Allocated by SeQueryInformationToken
}
}
IN AFSCcb *Ccb)
{
+ UNREFERENCED_PARAMETER(Fcb);
if( Ccb->FileUnwindInfo.FileAttributes != (ULONG)-1)
{
Ccb->DirectoryCB->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
BOOLEAN bIsValid = TRUE;
ULONG ulCount = 0;
- AFSDirectoryCB *pCurrentDirEntry = NULL;
+ AFSDirectoryCB *pCurrentDirEntry = NULL, *pDirEntry = NULL;
pCurrentDirEntry = ObjectInfo->Specific.Directory.DirectoryNodeListHead;
if( !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_FAKE))
{
ulCount++;
+
+ if( !BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
+ {
+
+ pDirEntry = NULL;
+
+ AFSLocateCaseSensitiveDirEntry( ObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
+ (ULONG)pCurrentDirEntry->CaseSensitiveTreeEntry.HashIndex,
+ &pDirEntry);
+
+ if( pDirEntry == NULL)
+ {
+ DbgBreakPoint();
+ }
+ }
}
pCurrentDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
}
- if( ulCount != ObjectInfo->Specific.Directory.DirectoryNodeCount)
+ if( ulCount != (ULONG) ObjectInfo->Specific.Directory.DirectoryNodeCount)
{
AFSPrint("AFSValidateDirList Count off Calc: %d Stored: %d\n",
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pControlDevExt = NULL;
ULONG ulTimeIncrement = 0;
+ LONG lCount;
__Enter
{
AFSServerName = LibraryInit->AFSServerName;
+ AFSMountRootName = LibraryInit->AFSMountRootName;
+
AFSDebugFlags = LibraryInit->AFSDebugFlags;
//
AFSDbgLogMsg = LibraryInit->AFSDbgLogMsg;
+ AFSDebugTraceFnc = AFSDbgLogMsg;
+
AFSAddConnectionEx = LibraryInit->AFSAddConnectionEx;
AFSExAllocatePoolWithTag = LibraryInit->AFSExAllocatePoolWithTag;
- AFSExFreePool = LibraryInit->AFSExFreePool;
+ AFSExFreePoolWithTag = LibraryInit->AFSExFreePoolWithTag;
AFSDumpTraceFilesFnc = LibraryInit->AFSDumpTraceFiles;
ulTimeIncrement = KeQueryTimeIncrement();
pControlDevExt->Specific.Control.ObjectLifeTimeCount.QuadPart = (ULONGLONG)((ULONGLONG)AFS_OBJECT_LIFETIME / (ULONGLONG)ulTimeIncrement);
- pControlDevExt->Specific.Control.FcbPurgeTimeCount.QuadPart = AFS_ONE_SECOND;
- pControlDevExt->Specific.Control.FcbPurgeTimeCount.QuadPart *= AFS_SERVER_PURGE_DELAY;
+ pControlDevExt->Specific.Control.FcbPurgeTimeCount.QuadPart = AFS_SERVER_PURGE_DELAY;
pControlDevExt->Specific.Control.FcbPurgeTimeCount.QuadPart /= ulTimeIncrement;
- pControlDevExt->Specific.Control.FcbFlushTimeCount.QuadPart = (ULONGLONG)((ULONGLONG)(AFS_ONE_SECOND * AFS_SERVER_FLUSH_DELAY) / (ULONGLONG)ulTimeIncrement);
+ pControlDevExt->Specific.Control.FcbFlushTimeCount.QuadPart = (ULONGLONG)((ULONGLONG)AFS_SERVER_FLUSH_DELAY / (ULONGLONG)ulTimeIncrement);
pControlDevExt->Specific.Control.ExtentRequestTimeCount.QuadPart = (ULONGLONG)((ULONGLONG)AFS_EXTENT_REQUEST_TIME/(ULONGLONG)ulTimeIncrement);
//
ntStatus = AFSInitVolume( NULL,
&LibraryInit->GlobalRootFid,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT,
&AFSGlobalRoot);
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeLibrary AFSInitVolume failure %08lX\n",
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSInitializeLibrary AFSInitRootFcb failure %08lX\n",
- ntStatus);
+ ntStatus));
+
+ lCount = AFSVolumeDecrement( AFSGlobalRoot,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
+ AFSGlobalRoot,
+ lCount));
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
SetFlag( AFSGlobalRoot->Flags, AFS_VOLUME_ACTIVE_GLOBAL_ROOT);
//
+ // Invalidate all known volumes since contact with the service and therefore
+ // the file server was lost.
+ //
+
+ AFSInvalidateAllVolumes();
+
+ //
// Drop the locks acquired above
//
AFSInitVolumeWorker( AFSGlobalRoot);
+ lCount = AFSVolumeDecrement( AFSGlobalRoot,
+ AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
+ AFSGlobalRoot,
+ lCount));
+
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
AFSReleaseResource( AFSGlobalRoot->ObjectInformation.Fcb->Header.Resource);
NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDirectoryCB *pDirNode = NULL, *pLastDirNode = NULL;
+ LONG lCount;
__Enter
{
if( AFSGlobalDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ AFSGlobalDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDirEntry->NonPaged->Lock);
if( AFSGlobalDotDotDirEntry != NULL)
{
- AFSDeleteObjectInfo( AFSGlobalDotDotDirEntry->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ AFSGlobalDotDotDirEntry->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ }
ExDeleteResourceLite( &AFSGlobalDotDotDirEntry->NonPaged->Lock);
pLastDirNode = (AFSDirectoryCB *)pDirNode->ListEntry.fLink;
- AFSDeleteObjectInfo( pDirNode->ObjectInformation);
+ lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
+ AFS_OBJECT_REFERENCE_GLOBAL);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCloseLibrary Decrement count on parent object %p Cnt %d\n",
+ pDirNode->ObjectInformation,
+ lCount));
+
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ }
ExDeleteResourceLite( &pDirNode->NonPaged->Lock);
...)
{
+ UNREFERENCED_PARAMETER(Subsystem);
+ UNREFERENCED_PARAMETER(Level);
NTSTATUS ntStatus = STATUS_SUCCESS;
va_list va_args;
char chDebugBuffer[ 256];
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFcb *pFcb = NULL;
AFSVolumeCB *pVolumeCB = NULL;
+ LONG VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ AFSVolumeCB *pNewVolumeCB = NULL;
+ LONG NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSObjectInfoCB *pObjectInfo = NULL;
ULONGLONG ullIndex = 0;
UNICODE_STRING uniFullPathName, uniRemainingPath, uniComponentName, uniParsedName;
AFSNameArrayHdr *pNameArray = NULL;
AFSDirectoryCB *pDirectoryEntry = NULL, *pParentDirEntry = NULL;
+ AFSDirectoryCB *pNewParentDirEntry = NULL;
+ LONG lCount;
__Enter
{
if( pVolumeCB != NULL)
{
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on volume %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason,
+ lCount));
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
pObjectInfo = &pVolumeCB->ObjectInformation;
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
}
else
{
AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
-
ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
ntStatus = AFSLocateHashEntry( pVolumeCB->ObjectInfoTree.TreeHead,
// Reference the node so it won't be torn down
//
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on object %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
pObjectInfo,
- pObjectInfo->ObjectReferenceCount);
+ lCount));
}
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
&AFSServerName,
TRUE) != 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSGetObjectStatus Name %wZ contains invalid server name\n",
- &uniFullPathName);
+ &uniFullPathName));
try_return( ntStatus = STATUS_OBJECT_PATH_INVALID);
}
pVolumeCB = AFSGlobalRoot;
- AFSAcquireShared( pVolumeCB->VolumeLock,
- TRUE);
-
pParentDirEntry = AFSGlobalRoot->DirectoryCB;
//
// Increment the ref count on the volume and dir entry for correct processing below
//
- InterlockedIncrement( &pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason = AFS_VOLUME_REFERENCE_GET_OBJECT;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ lCount = AFSVolumeIncrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Increment count on volume %08lX Cnt %d\n",
+ "AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ VolumeReferenceReason,
+ lCount));
- InterlockedIncrement( &pParentDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment count on %wZ DE %p Ccb %p Cnt %d\n",
&pParentDirEntry->NameInformation.FileName,
pParentDirEntry,
NULL,
- pParentDirEntry->OpenReferenceCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&uniParsedName,
pNameArray,
AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
- AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
- &pVolumeCB,
- &pParentDirEntry,
+ AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL,
+ pVolumeCB,
+ pParentDirEntry,
+ &pNewVolumeCB,
+ &NewVolumeReferenceReason,
+ &pNewParentDirEntry,
&pDirectoryEntry,
NULL);
- if( !NT_SUCCESS( ntStatus))
+ if ( pNewVolumeCB != NULL)
{
//
- // The volume lock was released on failure above
- // Except for STATUS_OBJECT_NAME_NOT_FOUND
+ // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+ // even if pVolumeCB == pNewVolumeCB. It is always safe to release
+ // the reference on pVolumeCB that was held prior to the call.
+ // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+ // will be released second.
//
- if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND)
- {
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- if( pVolumeCB != NULL)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+ pVolumeCB = pNewVolumeCB;
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ pNewVolumeCB = NULL;
- AFSReleaseResource( pVolumeCB->VolumeLock);
- }
+ VolumeReferenceReason = NewVolumeReferenceReason;
- if( pDirectoryEntry != NULL)
- {
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
- InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
+ //
+ // AFSLocateNameEntry does not alter the reference count of
+ // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+ // a reference held.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pDirectoryEntry->NameInformation.FileName,
- pDirectoryEntry,
- NULL,
- pDirectoryEntry->OpenReferenceCount);
- }
- else
- {
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus DecrementX count on %wZ DE %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ lCount));
- InterlockedDecrement( &pParentDirEntry->OpenReferenceCount);
+ pParentDirEntry = pNewParentDirEntry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
- &pParentDirEntry->NameInformation.FileName,
- pParentDirEntry,
- NULL,
- pParentDirEntry->OpenReferenceCount);
- }
- }
+ pNewParentDirEntry = NULL;
+
+ if( !NT_SUCCESS( ntStatus) ||
+ ntStatus == STATUS_REPARSE)
+ {
pVolumeCB = NULL;
try_return( ntStatus);
}
- //
- // Remove the reference made above
- //
-
- InterlockedDecrement( &pDirectoryEntry->OpenReferenceCount);
-
pObjectInfo = pDirectoryEntry->ObjectInformation;
- InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
-
- if( pVolumeCB != NULL)
- {
-
- InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement2 count on volume %08lX Cnt %d\n",
- pVolumeCB,
- pVolumeCB->VolumeReferenceCount);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
- AFSReleaseResource( pVolumeCB->VolumeLock);
- }
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
}
//
// Return the information length
//
- *ReturnLength = sizeof( AFSStatusInfoCB);
+ *ReturnLength = sizeof( AFSStatusInfoCB);
+
+try_exit:
+
+ if( pDirectoryEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement1 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirectoryEntry->NameInformation.FileName,
+ pDirectoryEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( pParentDirEntry != NULL)
+ {
+
+ lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pParentDirEntry->NameInformation.FileName,
+ pParentDirEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
+ }
+
+ if( pObjectInfo != NULL)
+ {
+
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
-try_exit:
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
+ }
- if( pObjectInfo != NULL)
+ if( pVolumeCB != NULL)
{
- InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement4 count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
}
if( pNameArray != NULL)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSDirectoryCB *pDirEntry = NULL;
ULONG ulCRC = 0;
+ LONG lCount;
__Enter
{
// Search for the entry in the parent
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSCheckSymlinkAccess Searching for entry %wZ case sensitive\n",
- ComponentName);
+ ComponentName));
ulCRC = AFSGenerateCRC( ComponentName,
FALSE);
// Missed so perform a case insensitive lookup
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSCheckSymlinkAccess Searching for entry %wZ case insensitive\n",
- ComponentName);
+ ComponentName));
ulCRC = AFSGenerateCRC( ComponentName,
TRUE);
// a lookup in the short name tree
//
- if( RtlIsNameLegalDOS8Dot3( ComponentName,
+ if( !BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ RtlIsNameLegalDOS8Dot3( ComponentName,
NULL,
NULL))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSCheckSymlinkAccess Searching for entry %wZ short name\n",
- ComponentName);
+ ComponentName));
AFSLocateShortNameDirEntry( ParentDirectoryCB->ObjectInformation->Specific.Directory.ShortNameTree,
ulCRC,
if( pDirEntry != NULL)
{
- InterlockedIncrement( &pDirEntry->OpenReferenceCount);
+ lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCheckSymlinkAccess Increment count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
}
AFSReleaseResource( ParentDirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
if( pDirEntry == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSCheckSymlinkAccess Failed to locate entry %wZ\n",
- ComponentName);
+ "AFSCheckSymlinkAccess Failed to locate entry %wZ ntStatus %08X\n",
+ ComponentName,
+ STATUS_OBJECT_NAME_NOT_FOUND));
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
// denied.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSCheckSymlinkAccess Failing symlink access to entry %wZ ACCESS_DENIED\n",
- ComponentName);
+ "AFSCheckSymlinkAccess Failing symlink access to entry %wZ REPARSE_POINT_NOT_RESOLVED\n",
+ ComponentName));
- ntStatus = STATUS_ACCESS_DENIED;
+ ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
- InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+ lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCheckSymlinkAccess Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+ &pDirEntry->NameInformation.FileName,
+ pDirEntry,
+ NULL,
+ lCount));
+
+ ASSERT( lCount >= 0);
try_exit:
SECURITY_DESCRIPTOR *pSecurityDescr = NULL;
ULONG ulSDLength = 0;
SECURITY_DESCRIPTOR *pRelativeSecurityDescr = NULL;
+ PSID pWorldSID = NULL;
+ ULONG *pulSubAuthority = NULL;
+ ULONG ulWorldSIDLEngth = 0;
__Enter
{
+ ulWorldSIDLEngth = RtlLengthRequiredSid( 1);
+
+ pWorldSID = (PSID)ExAllocatePoolWithTag( PagedPool,
+ ulWorldSIDLEngth,
+ AFS_GENERIC_MEMORY_29_TAG);
+
+ if( pWorldSID == NULL)
+ {
+ AFSPrint( "AFSCreateDefaultSecurityDescriptor unable to allocate World SID\n");
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlZeroMemory( pWorldSID,
+ ulWorldSIDLEngth);
+
+ RtlInitializeSid( pWorldSID,
+ &SeWorldSidAuthority,
+ 1);
+
+ pulSubAuthority = RtlSubAuthoritySid(pWorldSID, 0);
+ *pulSubAuthority = SECURITY_WORLD_RID;
+
if( AFSRtlSetSaclSecurityDescriptor == NULL)
{
}
}
+ //
+ // Add in the group and owner to the SD
+ //
+
+ if( AFSRtlSetGroupSecurityDescriptor != NULL)
+ {
+ ntStatus = AFSRtlSetGroupSecurityDescriptor( pSecurityDescr,
+ pWorldSID,
+ FALSE);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSPrint( "AFSCreateDefaultSecurityDescriptor RtlSetGroupSecurityDescriptor failed ntStatus %08lX\n",
+ ntStatus);
+
+ try_return( ntStatus);
+ }
+ }
+
+ ntStatus = RtlSetOwnerSecurityDescriptor( pSecurityDescr,
+ pWorldSID,
+ FALSE);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ AFSPrint( "AFSCreateDefaultSecurityDescriptor RtlSetOwnerSecurityDescriptor failed ntStatus %08lX\n",
+ ntStatus);
+
+ try_return( ntStatus);
+ }
+
if( !RtlValidSecurityDescriptor( pSecurityDescr))
{
{
ExFreePool( pACE);
}
+
+ if( pWorldSID != NULL)
+ {
+ ExFreePool( pWorldSID);
+ }
+ }
+
+ return ntStatus;
+}
+
+void
+AFSRetrieveParentPath( IN UNICODE_STRING *FullFileName,
+ OUT UNICODE_STRING *ParentPath)
+{
+
+ *ParentPath = *FullFileName;
+
+ //
+ // If the final character is a \, jump over it
+ //
+
+ if( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
+ {
+ ParentPath->Length -= sizeof( WCHAR);
+ }
+
+ while( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
+ {
+ ParentPath->Length -= sizeof( WCHAR);
+ }
+
+ //
+ // And the separator
+ //
+
+ ParentPath->Length -= sizeof( WCHAR);
+
+ return;
+}
+
+NTSTATUS
+AFSRetrieveValidAuthGroup( IN AFSFcb *Fcb,
+ IN AFSObjectInfoCB *ObjectInfo,
+ IN BOOLEAN WriteAccess,
+ OUT GUID *AuthGroup)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ GUID stAuthGroup, stZeroAuthGroup;
+ BOOLEAN bFoundAuthGroup = FALSE;
+ AFSCcb *pCcb = NULL;
+ AFSFcb *pFcb = Fcb;
+
+ __Enter
+ {
+
+ RtlZeroMemory( &stAuthGroup,
+ sizeof( GUID));
+
+ RtlZeroMemory( &stZeroAuthGroup,
+ sizeof( GUID));
+
+ if( Fcb == NULL)
+ {
+
+ if( ObjectInfo != NULL &&
+ ObjectInfo->Fcb != NULL)
+ {
+ pFcb = ObjectInfo->Fcb;
+ }
+ }
+
+ if( pFcb != NULL)
+ {
+
+ AFSAcquireShared( &Fcb->NPFcb->CcbListLock,
+ TRUE);
+
+ pCcb = Fcb->CcbListHead;
+
+ while( pCcb != NULL)
+ {
+
+ if( WriteAccess &&
+ pCcb->GrantedAccess & FILE_WRITE_DATA)
+ {
+ RtlCopyMemory( &stAuthGroup,
+ &pCcb->AuthGroup,
+ sizeof( GUID));
+
+ bFoundAuthGroup = TRUE;
+
+ break;
+ }
+ else if( pCcb->GrantedAccess & FILE_READ_DATA)
+ {
+ //
+ // At least get the read-only access
+ //
+
+ RtlCopyMemory( &stAuthGroup,
+ &pCcb->AuthGroup,
+ sizeof( GUID));
+
+ bFoundAuthGroup = TRUE;
+ }
+
+ pCcb = (AFSCcb *)pCcb->ListEntry.fLink;
+ }
+
+ AFSReleaseResource( &Fcb->NPFcb->CcbListLock);
+ }
+
+ if( !bFoundAuthGroup)
+ {
+
+ AFSRetrieveAuthGroupFnc( (ULONGLONG)PsGetCurrentProcessId(),
+ (ULONGLONG)PsGetCurrentThreadId(),
+ &stAuthGroup);
+
+ if( RtlCompareMemory( &stZeroAuthGroup,
+ &stAuthGroup,
+ sizeof( GUID)) == sizeof( GUID))
+ {
+
+ DbgPrint("AFSRetrieveValidAuthGroup Failed to locate PAG\n");
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
+ }
+
+ RtlCopyMemory( AuthGroup,
+ &stAuthGroup,
+ sizeof( GUID));
+
+try_exit:
+
+ NOTHING;
+ }
+
+ return ntStatus;
+}
+
+NTSTATUS
+AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
+ IN ULONG InvalidateReason)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ LIST_ENTRY *le;
+ AFSExtent *pEntry;
+ ULONG ulProcessCount = 0;
+ ULONG ulCount = 0;
+ LONG lCount;
+
+ __Enter
+ {
+
+ switch( InvalidateReason)
+ {
+
+ case AFS_INVALIDATE_DELETED:
+ {
+
+ if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+ 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
+ // And get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
+
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+ }
+
+ 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;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireShared( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+
+ bExtentsLocked = TRUE;
+
+ //
+ // There are several possibilities here:
+ //
+ // 0. If there are no extents or all of the extents are dirty, do nothing.
+ //
+ // 1. There could be nothing dirty and an open reference count of zero
+ // in which case we can just tear down all of the extents without
+ // holding any resources.
+ //
+ // 2. There could be nothing dirty and a non-zero open reference count
+ // in which case we can issue a CcPurge against the entire file
+ // while holding just the Fcb Resource.
+ //
+ // 3. There can be dirty extents in which case we need to identify
+ // the non-dirty ranges and then perform a CcPurge on just the
+ // non-dirty ranges while holding just the Fcb Resource.
+ //
+
+ if ( ObjectInfo->Fcb->Specific.File.ExtentCount != ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount)
+ {
+
+ if ( ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount == 0)
+ {
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+
+ bExtentsLocked = FALSE;
+
+ if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
+ {
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
+
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
+ }
+ else
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+ bLocked = FALSE;
+
+ __try
+ {
+
+ if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+ !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "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);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+ }
+ }
+ else
+ {
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+
+ bExtentsLocked = FALSE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ 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)
+ // ranges. In all but the most extreme random data write scenario there will
+ // be significantly fewer.
+ //
+ // For each range we need offset and size.
+ //
+
+ AFSByteRange * ByteRangeList = NULL;
+ ULONG ulByteRangeCount = 0;
+ ULONG ulIndex;
+ BOOLEAN bPurgeOnClose = FALSE;
+
+ __try
+ {
+
+ ulByteRangeCount = AFSConstructCleanByteRangeList( ObjectInfo->Fcb,
+ &ByteRangeList);
+
+ if ( ByteRangeList != NULL ||
+ ulByteRangeCount == 0)
+ {
+
+ for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
+ {
+
+ ULONG ulSize;
+
+ do {
+
+ ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
+
+ if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+ !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &ByteRangeList[ulIndex].FileOffset,
+ ulSize,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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
+ {
+
+ bCleanExtents = TRUE;
+ }
+
+ ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
+
+ ByteRangeList[ulIndex].FileOffset.QuadPart += ulSize;
+
+ } while ( ByteRangeList[ulIndex].Length.QuadPart > 0);
+ }
+ }
+ else
+ {
+
+ //
+ // We couldn't allocate the memory to build the purge list
+ // so just walk the extent list while holding the ExtentsList Resource.
+ // This could deadlock but we do not have much choice.
+ //
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+ bExtentsLocked = TRUE;
+
+ le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
+
+ ulProcessCount = 0;
+
+ ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount;
+
+ if( ulCount > 0)
+ {
+ pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+
+ while( ulProcessCount < ulCount)
+ {
+ pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+
+ if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
+ {
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &pEntry->FileOffset,
+ pEntry->Size,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+
+ if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
+ {
+
+ liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart;
+
+ while( liFlushLength.QuadPart > 0)
+ {
+
+ if( liFlushLength.QuadPart > 512 * 1024000)
+ {
+ ulFlushLength = 512 * 1024000;
+ }
+ else
+ {
+ ulFlushLength = liFlushLength.LowPart;
+ }
+
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ &liCurrentOffset,
+ ulFlushLength,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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
+ {
+
+ bCleanExtents = TRUE;
+ }
+
+ liFlushLength.QuadPart -= ulFlushLength;
+ }
+ }
+
+ liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size;
+
+ ulProcessCount++;
+ le = le->Flink;
+ }
+ }
+ else
+ {
+ if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( 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
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+
+ if ( bPurgeOnClose)
+ {
+
+ SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+ }
+ }
+
+ if ( bExtentsLocked)
+ {
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ }
+
+ if ( bLocked)
+ {
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ }
+
+ if ( bCleanExtents)
+ {
+
+ AFSReleaseCleanExtents( ObjectInfo->Fcb,
+ NULL);
+ }
+ }
+
+ break;
+ }
+ }
+
+ //
+ // Destroy the reference passed in by the caller to AFSInvalidateObject
+ // or AFSQueueInvalidateObject
+ //
+
+ lCount = AFSObjectInfoDecrement( ObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
+ ObjectInfo,
+ lCount));
}
return ntStatus;