/*
* 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
Context = ExceptPtrs->ContextRecord;
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
"AFSExceptionFilter (Library) - EXR %p CXR %p Function %s Code %08lX Address %p Routine %p\n",
ExceptRec,
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 %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 %p Thread %08lX\n",
Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
ExConvertExclusiveToSharedLite( Resource);
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);
}
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 %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ 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 | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ 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);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeGlobalDirectory AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
+
+ 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);
+ 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);
}
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 %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
ntStatus = STATUS_SUCCESS;
if( pDirNode == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOAD_LIBRARY | AFS_SUBSYSTEM_INIT_PROCESSING | AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ 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");
+ "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);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeGlobalDirectoryEntries AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
+
+ 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);
+ 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);
- ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDirEntry = NULL;
}
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);
- ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDotDirEntry = NULL;
}
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG ulEntryLength = 0;
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
ullIndex,
(AFSBTreeEntry **)&pObjectInfoCB);
- if( !NT_SUCCESS( ntStatus) ||
- pObjectInfoCB == NULL)
+ if( !NT_SUCCESS( ntStatus))
{
//
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- bAllocatedObjectCB = TRUE;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry initialized object %p Parent Object %p for %wZ\n",
pObjectInfoCB,
ParentObjectInfo,
- FileName);
+ FileName));
+
+ //
+ // If we allocated the object information cb then set the information
+ //
+
+ pObjectInfoCB->FileId = DirEnumEntry->FileId;
+
+ pObjectInfoCB->TargetFileId = DirEnumEntry->TargetFileId;
+
+ pObjectInfoCB->FileType = DirEnumEntry->FileType;
+
+ pObjectInfoCB->FileAttributes = DirEnumEntry->FileAttributes;
+
+ if( pObjectInfoCB->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+ pObjectInfoCB->FileType == AFS_FILE_TYPE_DFSLINK)
+ {
+
+ pObjectInfoCB->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+
+ if (pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK)
+ {
+
+ if ( pObjectInfoCB->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ pObjectInfoCB->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ }
+
+ //
+ // Check for the case where we have a filetype of SymLink but both the TargetFid and the
+ // TargetName are empty. In this case set the filetype to zero so we evaluate it later in
+ // the code
+ //
+
+ if( pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK &&
+ pObjectInfoCB->TargetFileId.Vnode == 0 &&
+ pObjectInfoCB->TargetFileId.Unique == 0 &&
+ (TargetName == NULL || TargetName->Length == 0))
+ {
+
+ //
+ // This will ensure we perform a validation on the node
+ //
+
+ pObjectInfoCB->FileType = AFS_FILE_TYPE_UNKNOWN;
+ }
+
+ if( pObjectInfoCB->FileType == AFS_FILE_TYPE_UNKNOWN)
+ {
+
+ SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
+ }
+
+ SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
+ if ( BooleanFlagOn( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ pObjectInfoCB->CreationTime = DirEnumEntry->CreationTime;
+
+ pObjectInfoCB->LastAccessTime = DirEnumEntry->LastAccessTime;
+
+ pObjectInfoCB->LastWriteTime = DirEnumEntry->LastWriteTime;
+
+ pObjectInfoCB->ChangeTime = DirEnumEntry->ChangeTime;
+
+ pObjectInfoCB->EndOfFile = DirEnumEntry->EndOfFile;
+
+ pObjectInfoCB->AllocationSize = DirEnumEntry->AllocationSize;
+
+ pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
+
+ pObjectInfoCB->Links = DirEnumEntry->Links;
+
+ pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
+
+ pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInitDirEntry FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfoCB->FileId.Cell,
+ pObjectInfoCB->FileId.Volume,
+ pObjectInfoCB->FileId.Vnode,
+ pObjectInfoCB->FileId.Unique));
+
+ ClearFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
+
+ //
+ // This reference count is either stored into the return DirectoryCB
+ // or released before function exit.
+ //
+
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_DIRENTRY);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
+
+ KeQueryTickCount( &pObjectInfoCB->LastAccessCount);
AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
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)
pDirNode->NameInformation.TargetName.Length);
}
- //
- // If we allocated the object information cb then update the information
- //
-
- if( bAllocatedObjectCB)
- {
-
- //
- // Populate the rest of the data
- //
-
- pObjectInfoCB->FileId = DirEnumEntry->FileId;
-
- pObjectInfoCB->TargetFileId = DirEnumEntry->TargetFileId;
-
- pObjectInfoCB->FileType = DirEnumEntry->FileType;
-
- pObjectInfoCB->CreationTime = DirEnumEntry->CreationTime;
-
- pObjectInfoCB->LastAccessTime = DirEnumEntry->LastAccessTime;
-
- pObjectInfoCB->LastWriteTime = DirEnumEntry->LastWriteTime;
-
- pObjectInfoCB->ChangeTime = DirEnumEntry->ChangeTime;
-
- pObjectInfoCB->EndOfFile = DirEnumEntry->EndOfFile;
-
- pObjectInfoCB->AllocationSize = DirEnumEntry->AllocationSize;
-
- pObjectInfoCB->FileAttributes = DirEnumEntry->FileAttributes;
-
- if( pObjectInfoCB->FileType == AFS_FILE_TYPE_MOUNTPOINT)
- {
-
- pObjectInfoCB->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
- }
-
- if (pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK ||
- pObjectInfoCB->FileType == AFS_FILE_TYPE_DFSLINK)
- {
-
- pObjectInfoCB->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
- }
-
- pObjectInfoCB->EaSize = DirEnumEntry->EaSize;
-
- //
- // Check for the case where we have a filetype of SymLink but both the TargetFid and the
- // TargetName are empty. In this case set the filetype to zero so we evaluate it later in
- // the code
- //
-
- if( pObjectInfoCB->FileType == AFS_FILE_TYPE_SYMLINK &&
- pObjectInfoCB->TargetFileId.Vnode == 0 &&
- pObjectInfoCB->TargetFileId.Unique == 0 &&
- pDirNode->NameInformation.TargetName.Length == 0)
- {
-
- //
- // This will ensure we perform a validation on the node
- //
-
- pObjectInfoCB->FileType = AFS_FILE_TYPE_UNKNOWN;
- }
-
- if( pObjectInfoCB->FileType == AFS_FILE_TYPE_UNKNOWN)
- {
-
- SetFlag( pObjectInfoCB->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
- }
- }
-
- //
- // Object specific information
- //
-
- pObjectInfoCB->Links = DirEnumEntry->Links;
-
- pObjectInfoCB->Expiration = DirEnumEntry->Expiration;
-
- pObjectInfoCB->DataVersion = DirEnumEntry->DataVersion;
try_exit:
if( pDirNode != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitDirEntry AFS_DIR_ENTRY_TAG deallocating %p\n",
- pDirNode);
+ pDirNode));
AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
if( pObjectInfoCB != NULL)
{
+ AFSAcquireShared( pObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
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 %p Cnt %d\n",
pObjectInfoCB,
- lCount);
-
- if( bAllocatedObjectCB)
- {
-
- ASSERT( pObjectInfoCB->ObjectReferenceCount == 0);
+ lCount));
- AFSDeleteObjectInfo( &pObjectInfoCB);
- }
+ AFSReleaseResource( pObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
}
}
}
DirEntry->ObjectInformation->FileAttributes = pDirEntry->FileAttributes;
- if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+ if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+ pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
{
- DirEntry->ObjectInformation->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
}
- if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
- pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
+ if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
{
- DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ 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;
pDirEntry->FileType == AFS_FILE_TYPE_INVALID)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSValidateSymLink Invalid type Status %08lX\n",
- STATUS_OBJECT_NAME_NOT_FOUND);
+ 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)
+ if( pDirEntry->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+ pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
{
- DirEntry->ObjectInformation->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ DirEntry->ObjectInformation->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
}
- if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK ||
- pDirEntry->FileType == AFS_FILE_TYPE_DFSLINK)
+ if( pDirEntry->FileType == AFS_FILE_TYPE_SYMLINK)
{
- DirEntry->ObjectInformation->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ 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;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
IO_STATUS_BLOCK stIoStatus;
ULONG ulFilter = 0;
AFSObjectInfoCB * pParentObjectInfo = NULL;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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.Volume,
(*ppObjectInfo)->FileId.Vnode,
(*ppObjectInfo)->FileId.Unique,
- Reason);
+ Reason));
if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
pParentObjectInfo = AFSFindObjectInfo( (*ppObjectInfo)->VolumeCB,
- &(*ppObjectInfo)->ParentFileId);
+ &(*ppObjectInfo)->ParentFileId,
+ FALSE);
}
if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_SYMLINK ||
{
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
-
- SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
(*ppObjectInfo)->Expiration.QuadPart = 0;
(*ppObjectInfo)->TargetFileId.Unique = 0;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_DELETED);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
if( pParentObjectInfo != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateObject Set VERIFY flag on parent fid %08lX-%08lX-%08lX-%08lX\n",
pParentObjectInfo->FileId.Cell,
pParentObjectInfo->FileId.Volume,
pParentObjectInfo->FileId.Vnode,
- pParentObjectInfo->FileId.Unique);
+ pParentObjectInfo->FileId.Unique));
SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
(*ppObjectInfo)->Fcb != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Acquiring Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
TRUE);
if( !NT_SUCCESS( stIoStatus.Status))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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.Vnode,
(*ppObjectInfo)->FileId.Unique,
stIoStatus.Status,
- stIoStatus.Information);
+ stIoStatus.Information));
ntStatus = stIoStatus.Status;
}
FALSE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( 0,
+ 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);
+ ntStatus));
SetFlag( (*ppObjectInfo)->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
- //
- // Clear out the extents
- // Get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSInvalidateObject Flush/purge Releasing Fcb lock %p EXCL %08lX\n",
+ &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
- NULL);
+ AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ //
+ // Clear out the extents
+ // Get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
+
+ AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+ NULL);
+ }
}
(*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
if( (*ppObjectInfo)->FileType == AFS_FILE_TYPE_FILE)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
(*ppObjectInfo)->Expiration.QuadPart = 0;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ (*ppObjectInfo)->FileId.Unique));
SetFlag( (*ppObjectInfo)->Flags, AFS_OBJECT_FLAGS_VERIFY);
__Enter
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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.Unique,
InvalidateCB->FileType,
InvalidateCB->WholeVolume,
- InvalidateCB->Reason);
+ InvalidateCB->Reason));
//
// Need to locate the Fcb for the directory to purge
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateCache Acquiring RDR VolumeTreeLock lock %p SHARED %08lX\n",
&pDevExt->Specific.RDR.VolumeTreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
//
// Starve any exclusive waiters on this paticular call
lCount = AFSVolumeIncrement( pVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateCache Increment count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
pVolumeCB == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ ntStatus));
try_return( ntStatus = STATUS_SUCCESS);
}
try_return( ntStatus);
}
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+ AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
TRUE);
if ( AFSIsVolumeFID( &InvalidateCB->FileID))
lCount = AFSObjectInfoIncrement( pObjectInfo,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateCache Increment count on object %p Cnt %d\n",
pObjectInfo,
- lCount);
+ lCount));
}
AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
pObjectInfo == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ ntStatus));
try_return( ntStatus = STATUS_SUCCESS);
}
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 %p Cnt %d\n",
pObjectInfo,
- lCount);
+ lCount));
}
if ( pVolumeCB != NULL)
lCount = AFSVolumeDecrement( pVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateCache Decrement count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
}
}
}
pParentObjectInfo = AFSFindObjectInfo( pCurrentFcb->ObjectInformation->VolumeCB,
- &pCurrentFcb->ObjectInformation->ParentFileId);
+ &pCurrentFcb->ObjectInformation->ParentFileId,
+ FALSE);
if ( pParentObjectInfo != NULL)
{
#endif
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSubstituteSysName Acquiring SysName lock %p SHARED %08lX\n",
pSysNameLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( pSysNameLock,
TRUE);
if( pSysName == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSSubstituteSysName No sysname %wZ Status %08lX\n",
- &ComponentName,
- STATUS_OBJECT_NAME_NOT_FOUND);
+ ComponentName,
+ STATUS_OBJECT_NAME_NOT_FOUND));
try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
}
__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
}
}
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
//
// Invalidate the volume root directory
//
lCount = AFSObjectInfoIncrement( pCurrentObject,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pCurrentObject,
- lCount);
+ lCount));
+
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
AFSInvalidateObject( &pCurrentObject,
Reason);
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
if ( pCurrentObject)
{
lCount = AFSObjectInfoDecrement( pCurrentObject,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
pCurrentObject,
- lCount);
+ lCount));
}
}
// Apply invalidation to all other volume objects
//
- AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
pCurrentObject = VolumeCB->ObjectInfoListHead;
if ( pCurrentObject)
lCount = AFSObjectInfoIncrement( pCurrentObject,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pCurrentObject,
- lCount);
+ lCount));
}
while( pCurrentObject != NULL)
lCount = AFSObjectInfoIncrement( pNextObject,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolumeObjects Increment count on object %p Cnt %d\n",
pNextObject,
- lCount);
+ lCount));
}
AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
AFSInvalidateObject( &pCurrentObject,
Reason);
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
if ( pCurrentObject )
{
lCount = AFSObjectInfoDecrement( pCurrentObject,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateVolumeObjects Decrement count on object %p Cnt %d\n",
pCurrentObject,
- lCount);
+ lCount));
}
- AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
-
pCurrentObject = pNextObject;
}
pRDRDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateAllVolumes Acquiring RDR VolumeListLock lock %p SHARED %08lX\n",
&pRDRDeviceExt->Specific.RDR.VolumeListLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pRDRDeviceExt->Specific.RDR.VolumeListLock,
TRUE);
if ( pVolumeCB)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateAllVolumes Acquiring VolumeRoot ObjectInfoTree lock %p SHARED %08lX\n",
pVolumeCB->ObjectInfoTree.TreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
lCount = AFSVolumeIncrement( pVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
}
while( pVolumeCB != NULL)
lCount = AFSVolumeIncrement( pNextVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateAllVolumes Increment count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
}
AFSReleaseResource( &pRDRDeviceExt->Specific.RDR.VolumeListLock);
lCount = AFSVolumeDecrement( pVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInvalidateAllVolumes Decrement count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
pVolumeCB = pNextVolumeCB;
}
NTSTATUS
AFSVerifyEntry( IN GUID *AuthGroup,
- IN AFSDirectoryCB *DirEntry)
+ IN AFSDirectoryCB *DirEntry,
+ IN BOOLEAN bFollowMountPoint)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
IO_STATUS_BLOCK stIoStatus;
__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,
- FALSE,
+ bFollowMountPoint ? FALSE : TRUE,
&pDirEnumEntry);
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSVerifyEntry Evaluate Target failed %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
&DirEntry->NameInformation.FileName,
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)
- {
- if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
- {
+ if( pObjectInfo->DataVersion.QuadPart == pDirEnumEntry->DataVersion.QuadPart &&
+ !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 Clearing Verify Flag\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);
}
//
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
case AFS_FILE_TYPE_FILE:
{
FILE_OBJECT * pCCFileObject = NULL;
- BOOLEAN bPurgeExtents = FALSE;
-
- if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- pObjectInfo->DataVersion.LowPart,
- pDirEnumEntry->DataVersion.LowPart
- );
-
- bPurgeExtents = TRUE;
- }
if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
{
- 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",
&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_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));
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
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 &&
- pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ if ( pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
{
if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
FALSE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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);
+ pObjectInfo->FileId.Unique));
SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( 0,
+ AFSDbgTrace(( 0,
0,
"EXCEPTION - AFSVerifyEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
- if ( bPurgeExtents)
- {
- AFSFlushExtents( pObjectInfo->Fcb,
- AuthGroup);
- }
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- //
- // Reacquire the Fcb to purge the cache
- //
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->Resource,
- PsGetCurrentThread());
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
+ AFSFlushExtents( pObjectInfo->Fcb,
+ AuthGroup);
+
+ //
+ // Acquire the Fcb to purge the cache
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+ }
//
// Update the metadata for the entry
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
-
- break;
+ ntStatus));
}
-
- //
- // 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;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
-
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- TRUE);
-
- pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
-
- if ( pCCFileObject != NULL)
- {
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ else
+ {
+
+ //
+ // Update file sizes
+ //
+
+ pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
+ pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+
+ if ( pCCFileObject != NULL)
+ {
+ CcSetFileSizes( pCCFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSVerifyEntry CcSetFileSized failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ 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);
+ "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+ &pObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
}
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
-
- break;
+ ntStatus));
}
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ else
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSVerifyEntry Fcb NULL %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+ }
}
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ if ( NT_SUCCESS( ntStatus))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry File FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ }
break;
}
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);
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry DFSLink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
}
default:
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSVerifyEntry Attempt to verify node of type %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
pObjectInfo->FileType,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
break;
}
__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 %p SHARED %08lX\n",
&pDevExt->Specific.RDR.VolumeTreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireShared( &pDevExt->Specific.RDR.VolumeTreeLock, TRUE);
lCount = AFSVolumeIncrement( pVolumeCB,
AFS_VOLUME_REFERENCE_INVALIDATE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSSetVolumeState Increment count on volume %p Cnt %d\n",
pVolumeCB,
- lCount);
+ lCount));
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
__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 %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 %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));
}
//
//
if( BooleanFlagOn( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_DELETED) &&
- pCurrentDirEntry->DirOpenReferenceCount <= 0)
+ pCurrentDirEntry->DirOpenReferenceCount <= 0 &&
+ pCurrentDirEntry->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Deleting dir entry %p name %wZ\n",
pCurrentDirEntry,
- &pCurrentDirEntry->NameInformation.FileName);
+ &pCurrentDirEntry->NameInformation.FileName));
AFSDeleteDirEntry( ObjectInfo,
- pCurrentDirEntry);
+ &pCurrentDirEntry);
}
else
{
ClearFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_VALID);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Clear VALID flag on DE %p Reference count %d\n",
pCurrentDirEntry,
- pCurrentDirEntry->DirOpenReferenceCount);
+ 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))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ &pCurrentDirEntry->NameInformation.FileName));
AFSRemoveShortNameDirEntry( &ObjectInfo->Specific.Directory.ShortNameTree,
pCurrentDirEntry);
ObjectInfo->Specific.Directory.ShortNameTree = pCurrentDirEntry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ &pCurrentDirEntry->NameInformation.FileName));
SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
}
if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ObjectInfo->Specific.Directory.ShortNameTree,
pCurrentDirEntry)))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ 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);
+ &pCurrentDirEntry->NameInformation.FileName));
}
else
{
SetFlag( pCurrentDirEntry->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Insert DE %p to shortname tree for %wZ\n",
pCurrentDirEntry,
- &pCurrentDirEntry->NameInformation.FileName);
+ &pCurrentDirEntry->NameInformation.FileName));
}
}
}
continue;
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateDirectoryCache Processing INVALID DE %p Reference count %d\n",
pCurrentDirEntry,
- pCurrentDirEntry->DirOpenReferenceCount);
+ pCurrentDirEntry->DirOpenReferenceCount));
- if( pCurrentDirEntry->DirOpenReferenceCount <= 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);
+ &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);
pObjectInfo->FileAttributes = DirEnumEntry->FileAttributes;
- if( pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT)
+ if( pObjectInfo->FileType == AFS_FILE_TYPE_MOUNTPOINT ||
+ pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK)
{
- pObjectInfo->FileAttributes = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
+ pObjectInfo->FileAttributes |= (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT);
}
- if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK ||
- pObjectInfo->FileType == AFS_FILE_TYPE_DFSLINK)
+ if( pObjectInfo->FileType == AFS_FILE_TYPE_SYMLINK)
{
- pObjectInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ if ( pObjectInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
+ {
+
+ pObjectInfo->FileAttributes = FILE_ATTRIBUTE_REPARSE_POINT;
+ }
+ else
+ {
+
+ pObjectInfo->FileAttributes |= FILE_ATTRIBUTE_REPARSE_POINT;
+ }
}
pObjectInfo->EaSize = DirEnumEntry->EaSize;
{
NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LARGE_INTEGER liSystemTime;
AFSDirEnumEntry *pDirEnumEntry = NULL;
AFSFcb *pCurrentFcb = NULL;
// 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 FastCall %u\n",
&DirEntry->NameInformation.FileName,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- FastCall);
+ FastCall));
//
// If this is a fake node then bail since the service knows nothing about it
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 FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
FastCall,
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 FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX DV %I64X returned DV %I64X FT %d\n",
FastCall,
pObjectInfo->FileId.Unique,
pObjectInfo->DataVersion.QuadPart,
pDirEnumEntry->DataVersion.QuadPart,
- pDirEnumEntry->FileType);
+ pDirEnumEntry->FileType));
//
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry MountPoint FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Symlink FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
if( !ExIsResourceAcquiredLite( &pCurrentFcb->NPFcb->Resource))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateEntry Acquiring Fcb lock %p EXCL %08lX\n",
&pCurrentFcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pCurrentFcb->NPFcb->Resource,
TRUE);
- bReleaseFcb = TRUE;
- }
-
- if( pCurrentFcb != NULL)
- {
-
- IO_STATUS_BLOCK stIoStatus;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE_2,
- "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
-
- if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- pObjectInfo->DataVersion.LowPart,
- pDirEnumEntry->DataVersion.LowPart
- );
-
- bPurgeExtents = TRUE;
- }
-
- if ( bSafeToPurge)
- {
-
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
- {
- bPurgeExtents = TRUE;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
-
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
-
- AFSDbgLogMsg( 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))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- stIoStatus.Status,
- stIoStatus.Information);
-
- ntStatus = stIoStatus.Status;
- }
-
- if ( bPurgeExtents &&
- pObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
- {
-
- if ( !CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
- }
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
- ntStatus = GetExceptionCode();
-
- AFSDbgLogMsg( 0,
- 0,
- "EXCEPTION - AFSValidateEntry CcFlushCache or CcPurgeCacheSection %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
- &DirEntry->NameInformation.FileName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique,
- ntStatus);
-
- SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
-
- AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
-
- AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
- }
- else
- {
-
- if ( bPurgeExtents)
- {
-
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
- }
- }
-
-
- AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
- bReleaseFcb = FALSE;
-
- if ( bPurgeExtents &&
- bSafeToPurge)
- {
- AFSFlushExtents( pCurrentFcb,
- AuthGroup);
- }
- }
- }
+ bReleaseFcb = TRUE;
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE_2,
+ "AFSValidateEntry Flush/purge entry %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ if ( pObjectInfo->DataVersion.QuadPart != pDirEnumEntry->DataVersion.QuadPart)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry DV Change %wZ FID %08lX-%08lX-%08lX-%08lX (%08lX != %08lX)\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ pObjectInfo->DataVersion.LowPart,
+ pDirEnumEntry->DataVersion.LowPart));
+
+ bPurgeExtents = TRUE;
+ }
+
+ if ( bSafeToPurge)
+ {
+
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA))
+ {
+ bPurgeExtents = TRUE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyEntry Clearing VERIFY_DATA flag %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &pCurrentFcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __try
+ {
+
+ IO_STATUS_BLOCK stIoStatus;
+
+ CcFlushCache( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ &stIoStatus);
+
+ if( !NT_SUCCESS( stIoStatus.Status))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSValidateEntry CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ stIoStatus.Status,
+ stIoStatus.Information));
+
+ ntStatus = stIoStatus.Status;
+ }
+
+ if ( bPurgeExtents &&
+ pCurrentFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
+ {
+
+ if ( !CcPurgeCacheSection( &pCurrentFcb->NPFcb->SectionObjectPointers,
+ NULL,
+ 0,
+ FALSE))
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+ AFS_TRACE_LEVEL_WARNING,
+ "AFSValidateEntry CcPurgeCacheSection failure %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+ &DirEntry->NameInformation.FileName,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
+ SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+ }
+ }
+ __except( 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( pCurrentFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &pCurrentFcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &pCurrentFcb->NPFcb->SectionObjectResource);
+ }
+ else
+ {
+
+ if ( bPurgeExtents)
+ {
+
+ SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+ }
+
+ if (bReleaseFcb)
+ {
+ AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
+
+ bReleaseFcb = FALSE;
+ }
+
+ if ( bPurgeExtents &&
+ bSafeToPurge)
+ {
+
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ AFSFlushExtents( pCurrentFcb,
+ AuthGroup);
+ }
+ }
+ }
//
// Update the metadata for the entry but only if it is safe to do so.
if( !NT_SUCCESS( ntStatus))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( 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.Volume,
pObjectInfo->FileId.Vnode,
pObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
break;
}
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry File FID %08lX-%08lX-%08lX-%08lX No Purge Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
//
{
FILE_OBJECT *pCCFileObject;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
TRUE);
- pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+ __try
+ {
- pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
- pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
- pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
- if ( pCCFileObject != NULL)
+ pObjectInfo->Fcb->Header.AllocationSize.QuadPart = pObjectInfo->AllocationSize.QuadPart;
+ pObjectInfo->Fcb->Header.FileSize.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+ pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+ if ( pCCFileObject != NULL)
+ {
+ CcSetFileSizes( pCCFileObject,
+ (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+ }
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
{
- CcSetFileSizes( pCCFileObject,
- (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSValidateEntry CcSetFileSizes failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSValidateEntry Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&pObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
}
// the directory enumeration.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"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);
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;
}
if( NT_SUCCESS( ntStatus))
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSValidateEntry Directory FID %08lX-%08lX-%08lX-%08lX Clearing Verify Flag\n",
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique));
+
ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY | AFS_OBJECT_FLAGS_NOT_EVALUATED);
}
default:
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSValidateEntry Attempt to verify node of type %d FastCall %d %wZ FID %08lX-%08lX-%08lX-%08lX\n",
pObjectInfo->FileType,
pObjectInfo->FileId.Cell,
pObjectInfo->FileId.Volume,
pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ pObjectInfo->FileId.Unique));
break;
}
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeSpecialShareNameList (srvsvc) Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
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);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeSpecialShareNameList (srvsvc) AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
+
+ 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);
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeSpecialShareNameList (ipc$) Incrementing count on object %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_SPECIAL_SHARE_NAME;
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);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeSpecialShareNameList (ipc$) AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSLibExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
if( pNonPagedDirEntry == NULL)
{
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
+
+ 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);
+ 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);
- ExFreePool( pDirNode->NonPaged);
+ AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
pDirNode = pLastDirNode;
}
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSGetSpecialShareNameEntry share name %wZ secondary name %wZ\n",
ShareName,
- SecondaryName);
+ SecondaryName));
uniFullShareName = *ShareName;
pNextDirEntry = (AFSDirectoryCB *)pCurrentDirEntry->ListEntry.fLink;
- if( pCurrentDirEntry->DirOpenReferenceCount <= 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);
+ &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 %p EXCL %08lX\n",
AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( AFSGlobalRoot->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
pDirGlobalDirNode = (AFSDirectoryCB *)pDirGlobalDirNode->ListEntry.fLink;
}
- AFSExFreePoolWithTag( uniFullName.Buffer, 0);
+ AFSLibExFreePoolWithTag( uniFullName.Buffer,
+ AFS_GENERIC_MEMORY_12_TAG);
try_exit:
return ntStatus;
}
-AFSNameArrayHdr *
-AFSInitNameArray( IN AFSDirectoryCB *DirectoryCB,
- IN ULONG InitialElementCount)
+void
+AFSSetEnumerationEvent( IN AFSFcb *Fcb)
{
-
- AFSNameArrayHdr *pNameArray = NULL;
- AFSNameArrayCB *pCurrentElement = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
LONG lCount;
- __Enter
+ //
+ // Depending on the type of node, set the event
+ //
+
+ switch( Fcb->Header.NodeTypeCode)
{
- if( InitialElementCount == 0)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- InitialElementCount = pDevExt->Specific.RDR.NameArrayLength;
- }
+ lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- pNameArray = (AFSNameArrayHdr *)AFSExAllocatePoolWithTag( PagedPool,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)),
- AFS_NAME_ARRAY_TAG);
+ break;
+ }
+ }
- if( pNameArray == NULL)
- {
+ return;
+}
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInitNameArray Failed to allocate name array\n");
+void
+AFSClearEnumerationEvent( IN AFSFcb *Fcb)
+{
- try_return( pNameArray);
- }
+ LONG lCount;
- RtlZeroMemory( pNameArray,
- sizeof( AFSNameArrayHdr) +
- (InitialElementCount * sizeof( AFSNameArrayCB)));
+ //
+ // Depending on the type of node, set the event
+ //
- pNameArray->MaxElementCount = InitialElementCount;
+ switch( Fcb->Header.NodeTypeCode)
+ {
- if( DirectoryCB != NULL)
+ case AFS_DIRECTORY_FCB:
+ case AFS_ROOT_FCB:
+ case AFS_ROOT_ALL:
{
- pCurrentElement = &pNameArray->ElementArray[ 0];
-
- pNameArray->CurrentEntry = pCurrentElement;
+ ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
- pNameArray->Count = 1;
+ lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
- pNameArray->LinkCount = 0;
+ break;
+ }
+ }
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- pNameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount);
-
- pCurrentElement->DirectoryCB = DirectoryCB;
-
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInitNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- pNameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
- }
-
-try_exit:
-
- NOTHING;
- }
-
- return pNameArray;
-}
-
-NTSTATUS
-AFSPopulateNameArray( IN AFSNameArrayHdr *NameArray,
- IN UNICODE_STRING *Path,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] passed Path %wZ DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- &Path,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType);
-
- //
- // Init some info in the header
- //
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- NameArray->CurrentEntry = pCurrentElement;
-
- //
- // The first entry points at the root
- //
-
- pCurrentElement->DirectoryCB = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB;
-
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] Increment count on volume %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount);
-
- pCurrentElement->Component = DirectoryCB->ObjectInformation->VolumeCB->DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation.FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- NameArray->Count = 1;
-
- NameArray->LinkCount = 0;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
- //
- // If the root is the parent then we are done ...
- //
-
- if( &DirectoryCB->ObjectInformation->VolumeCB->ObjectInformation == DirectoryCB->ObjectInformation)
- {
- try_return( ntStatus);
- }
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSPopulateNameArrayFromRelatedArray( IN AFSNameArrayHdr *NameArray,
- IN AFSNameArrayHdr *RelatedNameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL, *pCurrentRelatedElement = NULL;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArray [NA:%p] passed RelatedNameArray %p DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- RelatedNameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType);
-
- //
- // Init some info in the header
- //
-
- pCurrentElement = &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;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- lCount = InterlockedIncrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount);
-
- lCount = InterlockedIncrement( &NameArray->Count);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPopulateNameArrayFromRelatedArray [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- lCount - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
- if( pCurrentElement->DirectoryCB == DirectoryCB ||
- NameArray->Count == RelatedNameArray->Count)
- {
-
- //
- // Done ...
- //
-
- break;
- }
-
- pCurrentElement++;
-
- pCurrentRelatedElement++;
- }
-
- NameArray->CurrentEntry = NameArray->Count > 0 ? pCurrentElement : NULL;
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSFreeNameArray( IN AFSNameArrayHdr *NameArray)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount, lElement;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray [NA:%p]\n",
- NameArray);
-
- for ( lElement = 0; lElement < NameArray->Count; lElement++)
- {
-
- pCurrentElement = &NameArray->ElementArray[ lElement];
-
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSFreeNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount);
-
- ASSERT( lCount >= 0);
- }
-
- AFSExFreePoolWithTag( NameArray, AFS_NAME_ARRAY_TAG);
- }
-
- return ntStatus;
-}
-
-NTSTATUS
-AFSInsertNextElement( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSNameArrayCB *pCurrentElement = NULL;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType);
-
- if( NameArray->Count == (LONG) NameArray->MaxElementCount)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSInsertNextElement [NA:%p] Name has reached Maximum Size\n",
- NameArray);
-
- try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
- }
-
- for ( lCount = 0; lCount < NameArray->Count; lCount++)
- {
-
- if ( AFSIsEqualFID( &NameArray->ElementArray[ lCount].FileId,
- &DirectoryCB->ObjectInformation->FileId) )
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSInsertNextElement [NA:%p] DE %p recursion Status %08X\n",
- NameArray,
- DirectoryCB,
- STATUS_ACCESS_DENIED);
-
- try_return( ntStatus = STATUS_ACCESS_DENIED);
- }
- }
-
- if( NameArray->Count > 0)
- {
-
- NameArray->CurrentEntry++;
- }
- else
- {
- NameArray->CurrentEntry = &NameArray->ElementArray[ 0];
- }
-
- pCurrentElement = NameArray->CurrentEntry;
-
- lCount = InterlockedIncrement( &NameArray->Count);
-
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount);
-
- ASSERT( lCount > 0);
-
- pCurrentElement->DirectoryCB = DirectoryCB;
-
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSInsertNextElement [NA:%p] Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
-try_exit:
-
- NOTHING;
- }
-
- return ntStatus;
-}
-
-AFSDirectoryCB *
-AFSBackupEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pDirectoryCB = NULL;
- AFSNameArrayCB *pCurrentElement = NULL;
- BOOLEAN bVolumeRoot = FALSE;
- LONG lCount;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p]\n",
- NameArray);
-
- if( NameArray->Count == 0)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSBackupEntry [NA:%p] No more entries\n",
- NameArray);
-
- try_return( pCurrentElement);
- }
-
- lCount = InterlockedDecrement( &NameArray->CurrentEntry->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &NameArray->CurrentEntry->DirectoryCB->NameInformation.FileName,
- NameArray->CurrentEntry->DirectoryCB,
- lCount);
-
- ASSERT( lCount >= 0);
-
- NameArray->CurrentEntry->DirectoryCB = NULL;
-
- lCount = InterlockedDecrement( &NameArray->Count);
-
- if( lCount == 0)
- {
- NameArray->CurrentEntry = NULL;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSBackupEntry [NA:%p] No more entries\n",
- NameArray);
- }
- else
- {
-
- bVolumeRoot = BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
-
- NameArray->CurrentEntry--;
-
- pCurrentElement = NameArray->CurrentEntry;
-
- pDirectoryCB = pCurrentElement->DirectoryCB;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSBackupEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 1,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
-
- //
- // If the entry we are removing is a volume root,
- // we must remove the mount point entry as well.
- // If the NameArray was constructed by checking the
- // share name via the service, the name array can
- // contain two volume roots in sequence without a
- // mount point separating them.
- //
-
- if ( bVolumeRoot &&
- !BooleanFlagOn( NameArray->CurrentEntry->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT))
- {
-
- pDirectoryCB = AFSBackupEntry( NameArray);
- }
- }
-
-
-try_exit:
-
- NOTHING;
- }
-
- return pDirectoryCB;
-}
-
-AFSDirectoryCB *
-AFSGetParentEntry( IN AFSNameArrayHdr *NameArray)
-{
-
- AFSDirectoryCB *pDirEntry = NULL;
- AFSNameArrayCB *pElement = NULL;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetParentEntry [NA:%p]\n",
- NameArray);
-
- if( NameArray->Count == 0 ||
- NameArray->Count == 1)
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_ERROR,
- "AFSGetParentEntry [NA:%p] No more entries\n",
- NameArray);
-
- try_return( pDirEntry = NULL);
- }
-
- pElement = &NameArray->ElementArray[ NameArray->Count - 2];
-
- pDirEntry = pElement->DirectoryCB;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetParentEntry [NA:%p] Returning Element[%d] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- NameArray->Count - 2,
- pElement->DirectoryCB,
- pElement->FileId.Cell,
- pElement->FileId.Volume,
- pElement->FileId.Vnode,
- pElement->FileId.Unique,
- &pElement->DirectoryCB->NameInformation.FileName,
- pElement->DirectoryCB->ObjectInformation->FileType);
-
-try_exit:
-
- NOTHING;
- }
-
- return pDirEntry;
-}
-
-void
-AFSResetNameArray( IN AFSNameArrayHdr *NameArray,
- IN AFSDirectoryCB *DirectoryCB)
-{
-
- AFSNameArrayCB *pCurrentElement = NULL;
- AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
- LONG lCount, lElement;
-
- __Enter
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] passed DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- DirectoryCB,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileType);
- //
- // Dereference previous name array contents
- //
-
- for ( lElement = 0; lElement < NameArray->Count; lElement++)
- {
-
- pCurrentElement = &NameArray->ElementArray[ lElement];
-
- lCount = InterlockedDecrement( &pCurrentElement->DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Decrement count on %wZ DE %p Cnt %d\n",
- NameArray,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB,
- lCount);
-
- ASSERT( lCount >= 0);
- }
-
- RtlZeroMemory( NameArray,
- sizeof( AFSNameArrayHdr) +
- ((pDevExt->Specific.RDR.NameArrayLength - 1) * sizeof( AFSNameArrayCB)));
-
- NameArray->MaxElementCount = pDevExt->Specific.RDR.NameArrayLength;
-
- if( DirectoryCB != NULL)
- {
-
- pCurrentElement = &NameArray->ElementArray[ 0];
-
- NameArray->CurrentEntry = pCurrentElement;
-
- NameArray->Count = 1;
-
- NameArray->LinkCount = 0;
-
- lCount = InterlockedIncrement( &DirectoryCB->NameArrayReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Increment count on %wZ DE %p Cnt %d\n",
- NameArray,
- &DirectoryCB->NameInformation.FileName,
- DirectoryCB,
- lCount);
-
- pCurrentElement->DirectoryCB = DirectoryCB;
-
- pCurrentElement->Component = DirectoryCB->NameInformation.FileName;
-
- pCurrentElement->FileId = DirectoryCB->ObjectInformation->FileId;
-
- pCurrentElement->Flags = 0;
-
- if( pCurrentElement->FileId.Vnode == 1)
- {
-
- SetFlag( pCurrentElement->Flags, AFS_NAME_ARRAY_FLAG_ROOT_ELEMENT);
- }
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_NAME_ARRAY_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSResetNameArray [NA:%p] Element[0] DE %p FID %08lX-%08lX-%08lX-%08lX %wZ Type %d\n",
- NameArray,
- pCurrentElement->DirectoryCB,
- pCurrentElement->FileId.Cell,
- pCurrentElement->FileId.Volume,
- pCurrentElement->FileId.Vnode,
- pCurrentElement->FileId.Unique,
- &pCurrentElement->DirectoryCB->NameInformation.FileName,
- pCurrentElement->DirectoryCB->ObjectInformation->FileType);
- }
- }
-
- 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)
-{
- LONG lCount;
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- lCount = InterlockedIncrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
- }
-
- return;
-}
-
-void
-AFSClearEnumerationEvent( IN AFSFcb *Fcb)
-{
-
- LONG lCount;
-
- //
- // Depending on the type of node, set the event
- //
-
- switch( Fcb->Header.NodeTypeCode)
- {
-
- case AFS_DIRECTORY_FCB:
- case AFS_ROOT_FCB:
- case AFS_ROOT_ALL:
- {
-
- ASSERT( Fcb->NPFcb->Specific.Directory.DirectoryEnumCount > 0);
-
- lCount = InterlockedDecrement( &Fcb->NPFcb->Specific.Directory.DirectoryEnumCount);
-
- break;
- }
- }
-
- return;
-}
+ return;
+}
BOOLEAN
AFSIsEnumerationInProcess( IN AFSObjectInfoCB *ObjectInfo)
__Enter
{
+ AFSAcquireExcl( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
pObjectInfoCB = AFSAllocateObjectInfo( ParentObjectInfo,
0);
if( pObjectInfoCB == NULL)
{
+ AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
lCount = AFSObjectInfoIncrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
+ AFS_OBJECT_REFERENCE_PIOCTL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitPIOCtlDirectoryCB Increment count on object %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
+
+ AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
pObjectInfoCB->FileType = (ULONG) AFS_FILE_TYPE_PIOCTL;
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG allocated %p\n",
- pDirNode);
+ pDirNode));
pNonPagedDirEntry = (AFSNonPagedDirectoryCB *)AFSExAllocatePoolWithTag( NonPagedPool,
sizeof( AFSNonPagedDirectoryCB),
if ( InterlockedCompareExchangePointer( (PVOID *)&ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB, pDirNode, NULL) != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSInitPIOCtlDirectoryCB Raced PIOCtlDirectoryCB %p pFcb %p\n",
ParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
- pDirNode);
+ pDirNode));
try_return( ntStatus = STATUS_REPARSE);
}
if ( pDirNode != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_ALLOCATION,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitPIOCtlDirectoryCB AFS_DIR_ENTRY_TAG deallocating %p\n",
- pDirNode);
+ pDirNode));
AFSExFreePoolWithTag( pDirNode, AFS_DIR_ENTRY_TAG);
}
{
lCount = AFSObjectInfoDecrement( pObjectInfoCB,
- AFS_OBJECT_REFERENCE_DIRENTRY);
+ AFS_OBJECT_REFERENCE_PIOCTL);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitPIOCtlDirectoryCB Decrement count on object %p Cnt %d\n",
pObjectInfoCB,
- lCount);
+ lCount));
- AFSDeleteObjectInfo( &pObjectInfoCB);
+ if ( lCount == 0)
+ {
+
+ AFSDeleteObjectInfo( &pObjectInfoCB);
+ }
}
}
}
UNICODE_STRING uniComponentName, uniRemainingPath, uniParsedName;
ULONG ulNameDifference = 0;
LONG lCount;
+ UNICODE_STRING uniDFSTargetName;
__Enter
{
- //
+ uniDFSTargetName.Length = 0;
+ uniDFSTargetName.MaximumLength = 0;
+ uniDFSTargetName.Buffer = NULL;
+
+ //
// Retrieve a target name for the entry
//
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);
}
lCount = AFSVolumeIncrement( pVolumeCB,
VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSRetrieveFileAttributes Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
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,
- lCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&NewVolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ &uniDFSTargetName);
- //
- // 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 ( pNewVolumeCB != NULL)
+ {
+ //
+ // 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.
+ //
- lCount = AFSVolumeDecrement( pVolumeCB,
- VolumeReferenceReason);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
- pVolumeCB,
- VolumeReferenceReason,
- lCount);
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSRetrieveFileAttributes Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- pVolumeCB = pNewVolumeCB;
+ pVolumeCB = pNewVolumeCB;
- pNewVolumeCB = NULL;
+ pNewVolumeCB = NULL;
- VolumeReferenceReason = NewVolumeReferenceReason;
+ VolumeReferenceReason = NewVolumeReferenceReason;
- NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
//
// AFSLocateNameEntry does not alter the reference count of
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
pParentDirEntry = pNewParentDirEntry;
pNewParentDirEntry = NULL;
- if( !NT_SUCCESS( ntStatus) ||
- ntStatus == STATUS_REPARSE)
+ if( !NT_SUCCESS( ntStatus))
+ {
+ try_return( ntStatus);
+ }
+
+ //
+ // If the status is STATUS_REPARSE then attempt to retrieve the attributes from the target name returned
+ //
+
+ if( ntStatus == STATUS_REPARSE)
{
+ ntStatus = AFSRetrieveTargetFileInfo( &uniDFSTargetName,
+ FileInfo);
+
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);
+ 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)
{
if ( FileInfo->FileAttributes == FILE_ATTRIBUTE_NORMAL)
lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
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 %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
}
if( pNameArray != NULL)
AFSExFreePoolWithTag( pwchBuffer, 0);
}
+
+ if ( uniDFSTargetName.Buffer != NULL)
+ {
+
+ AFSExFreePoolWithTag( uniDFSTargetName.Buffer,
+ AFS_REPARSE_NAME_TAG);
+ }
}
return ntStatus;
SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+ AFSAcquireShared( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
lCount = AFSObjectInfoIncrement( ParentObjectInfo,
AFS_OBJECT_REFERENCE_CHILD);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSAllocateObjectInfo Increment count on parent object %p Cnt %d\n",
ParentObjectInfo,
- lCount);
+ lCount));
+
+ AFSReleaseResource( ParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
}
//
AFSObjectInfoCB *
AFSFindObjectInfo( IN AFSVolumeCB *VolumeCB,
- IN AFSFileID *FileId)
+ IN AFSFileID *FileId,
+ IN BOOLEAN bUpdateLastUse)
{
DWORD ntStatus = STATUS_SUCCESS;
ULONGLONG ullIndex;
AFSObjectInfoCB *pObjectInfo = NULL;
+ LONG lCount;
+
+ ullIndex = AFSCreateLowIndex( FileId);
+
+ AFSAcquireShared( VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
if ( AFSIsEqualFID( &VolumeCB->ObjectInformation.FileId, FileId))
{
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)) {
- AFSObjectInfoIncrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_FIND);
+ 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));
+
+ if ( bUpdateLastUse)
+ {
+
+ KeQueryTickCount( &pObjectInfo->LastAccessCount);
+ }
}
+ AFSReleaseResource( VolumeCB->ObjectInfoTree.TreeLock);
+
return pObjectInfo;
}
void
AFSReleaseObjectInfo( IN AFSObjectInfoCB **ppObjectInfo)
{
+ LONG lCount;
- AFSObjectInfoDecrement( *ppObjectInfo,
- AFS_OBJECT_REFERENCE_FIND);
+ 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 **ppObjectInfo)
{
-
BOOLEAN bAcquiredTreeLock = FALSE;
- AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo);
- BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSVolumeCB * pVolume = NULL;
+ BOOLEAN bHeldInService;
AFSObjectInfoCB * pParentObjectInfo = NULL;
AFSFileID FileId;
LONG lCount;
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME))
+ __Enter
{
+ if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME))
+ {
- //
- // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
- // embedded in the VolumeCB.
- //
+ //
+ // AFSDeleteObjectInfo should never be called on the ObjectInformationCB
+ // embedded in the VolumeCB.
+ //
- ASSERT( TRUE);
+ ASSERT( FALSE);
- return;
- }
+ return;
+ }
- ASSERT( pObjectInfo->ObjectReferenceCount == 0);
+ pVolume = (*ppObjectInfo)->VolumeCB;
- (*ppObjectInfo) = NULL;
+ if( !ExIsResourceAcquiredExclusiveLite( pVolume->ObjectInfoTree.TreeLock))
+ {
- if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock))
- {
+ ASSERT( !ExIsResourceAcquiredLite( pVolume->ObjectInfoTree.TreeLock));
- ASSERT( !ExIsResourceAcquiredLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock));
+ AFSAcquireExcl( pVolume->ObjectInfoTree.TreeLock,
+ TRUE);
- AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ bAcquiredTreeLock = TRUE;
+ }
- bAcquiredTreeLock = TRUE;
- }
+ for ( lCount = 0; lCount < AFS_OBJECT_REFERENCE_MAX; lCount++)
+ {
- if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
- {
+ ASSERT( (*ppObjectInfo)->ObjectReferences[ lCount] >= 0);
+ }
- pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
- &pObjectInfo->ParentFileId);
- }
+ ASSERT( (*ppObjectInfo)->ObjectReferenceCount == 0);
- //
- // Remove it from the tree and list if it was inserted
- //
+ pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo,
+ NULL,
+ *ppObjectInfo);
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
- {
+ if ( pObjectInfo == NULL)
+ {
- AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
- &pObjectInfo->TreeEntry);
- }
+ try_return( NOTHING);
+ }
- if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
- {
+ ASSERT( *ppObjectInfo == NULL);
- if( pObjectInfo->ListEntry.fLink == NULL)
+ if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- pObjectInfo->VolumeCB->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
+ pParentObjectInfo = AFSFindObjectInfo( pVolume,
+ &pObjectInfo->ParentFileId,
+ FALSE);
- if( pObjectInfo->VolumeCB->ObjectInfoListTail != NULL)
+ if( pParentObjectInfo != NULL)
{
- pObjectInfo->VolumeCB->ObjectInfoListTail->ListEntry.fLink = NULL;
+ ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+
+ AFSAcquireShared( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ 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));
+
+ AFSReleaseResource( pParentObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
}
}
- else
+
+ //
+ // Remove it from the tree and list if it was inserted
+ //
+
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
{
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
+ AFSRemoveHashEntry( &pVolume->ObjectInfoTree.TreeHead,
+ &pObjectInfo->TreeEntry);
}
- if( pObjectInfo->ListEntry.bLink == NULL)
+ if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_VOLUME_LIST))
{
- pObjectInfo->VolumeCB->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
+ if( pObjectInfo->ListEntry.fLink == NULL)
+ {
+
+ pVolume->ObjectInfoListTail = (AFSObjectInfoCB *)pObjectInfo->ListEntry.bLink;
- if( pObjectInfo->VolumeCB->ObjectInfoListHead != NULL)
+ if( pVolume->ObjectInfoListTail != NULL)
+ {
+
+ pVolume->ObjectInfoListTail->ListEntry.fLink = NULL;
+ }
+ }
+ else
{
- pObjectInfo->VolumeCB->ObjectInfoListHead->ListEntry.bLink = NULL;
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.fLink))->ListEntry.bLink = pObjectInfo->ListEntry.bLink;
}
- }
- else
- {
- ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
- }
- }
+ if( pObjectInfo->ListEntry.bLink == NULL)
+ {
- if( pParentObjectInfo != NULL)
- {
+ pVolume->ObjectInfoListHead = (AFSObjectInfoCB *)pObjectInfo->ListEntry.fLink;
- ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID);
+ if( pVolume->ObjectInfoListHead != NULL)
+ {
- lCount = AFSObjectInfoDecrement( pParentObjectInfo,
- AFS_OBJECT_REFERENCE_CHILD);
+ pVolume->ObjectInfoListHead->ListEntry.bLink = NULL;
+ }
+ }
+ else
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSDeleteObjectInfo Decrement count on parent object %p Cnt %d\n",
- pParentObjectInfo,
- lCount);
+ ((AFSObjectInfoCB *)(pObjectInfo->ListEntry.bLink))->ListEntry.fLink = pObjectInfo->ListEntry.fLink;
+ }
+ }
- AFSReleaseObjectInfo( &pParentObjectInfo);
- }
+ bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE);
- if( bAcquiredTreeLock)
- {
+ if( bHeldInService)
+ {
- AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
- }
+ FileId = pObjectInfo->FileId;
+ }
- if( bHeldInService)
- {
+ ASSERT( pObjectInfo->ObjectReferenceCount == 0);
- FileId = pObjectInfo->FileId;
- }
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
+ ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
- ExDeleteResourceLite( &pObjectInfo->NonPagedInfo->DirectoryNodeHdrLock);
+ AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo->NonPagedInfo, AFS_NP_OBJECT_INFO_TAG);
+ AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
- AFSExFreePoolWithTag( pObjectInfo, AFS_OBJECT_INFO_TAG);
+try_exit:
- //
- // Release the fid in the service
- //
+ if( bAcquiredTreeLock)
+ {
- if( bHeldInService)
- {
+ AFSReleaseResource( pVolume->ObjectInfoTree.TreeLock);
+ }
+
+ //
+ // Release the fid in the service
+ //
+
+ if( bHeldInService)
+ {
- AFSReleaseFid( &FileId);
+ AFSReleaseFid( &FileId);
+ }
}
return;
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 %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
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,
- lCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&VolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ NULL);
- //
- // 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 ( pNewVolumeCB != NULL)
+ {
+ //
+ // 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.
+ //
- lCount = AFSVolumeDecrement( pVolumeCB,
- VolumeReferenceReason);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
- pVolumeCB,
- VolumeReferenceReason,
- lCount);
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEvaluateRootEntry Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- pVolumeCB = pNewVolumeCB;
+ pVolumeCB = pNewVolumeCB;
- pNewVolumeCB = NULL;
+ pNewVolumeCB = NULL;
- VolumeReferenceReason = NewVolumeReferenceReason;
+ VolumeReferenceReason = NewVolumeReferenceReason;
- NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
//
// AFSLocateNameEntry does not alter the reference count of
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
pParentDirEntry = pNewParentDirEntry;
lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
lCount = AFSVolumeDecrement( pVolumeCB,
VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEvaluateRootEntry Decrement2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
}
if( pNameArray != NULL)
!BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Acquiring Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
- AFSAcquireShared( &Fcb->NPFcb->Resource,
+ AFSAcquireExcl( &Fcb->NPFcb->Resource,
TRUE);
if( Fcb->OpenReferenceCount > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource,
TRUE);
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;
}
FALSE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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);
+ Fcb->ObjectInformation->FileId.Unique));
SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( 0,
+ 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);
+ ntStatus));
SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
- "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+ "AFSCleanupEntry Releasing Fcb lock %p EXCL %08lX\n",
&Fcb->NPFcb->Resource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &Fcb->NPFcb->Resource);
- //
- // Wait for any currently running flush or release requests to complete
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // Wait for any currently running flush or release requests to complete
+ //
- AFSWaitOnQueuedFlushes( Fcb);
+ AFSWaitOnQueuedFlushes( Fcb);
- //
- // Now perform another flush on the file
- //
+ //
+ // Now perform another flush on the file
+ //
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)))
- {
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)))
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
- }
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
+ }
- if( Fcb->OpenReferenceCount == 0 ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( Fcb->OpenReferenceCount == 0 ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
try_return( ntStatus);
}
KeQueryTickCount( &liTime);
- //
- // First up are there dirty extents in the cache to flush?
- //
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+ //
+ // First up are there dirty extents in the cache to flush?
+ //
- if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
- BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
- {
+ if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+ BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+ {
- //
- // The file has been marked as invalid. Dump it
- //
+ //
+ // The file has been marked as invalid. Dump it
+ //
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
- else if( ForceFlush ||
- ( ( Fcb->Specific.File.ExtentsDirtyCount ||
- Fcb->Specific.File.ExtentCount) &&
- (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
- >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
- {
- if( !NT_SUCCESS( AFSFlushExtents( Fcb,
- NULL)) &&
- Fcb->OpenReferenceCount == 0)
- {
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ else if( ForceFlush ||
+ ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+ Fcb->Specific.File.ExtentCount) &&
+ (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+ >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+ {
- AFSReleaseExtentsWithFlush( Fcb,
- NULL,
- TRUE);
- }
+ if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+ NULL)) &&
+ Fcb->OpenReferenceCount == 0)
+ {
+
+ AFSReleaseExtentsWithFlush( Fcb,
+ NULL,
+ TRUE);
+ }
+ }
}
//
(AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Acquiring Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush) == FALSE)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Failed to Acquire Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ try_return( ntStatus = STATUS_RETRY);
+ }
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
if ( AFSAcquireExcl( &Fcb->NPFcb->SectionObjectResource, ForceFlush))
{
if( !NT_SUCCESS( stIoStatus.Status))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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.Vnode,
Fcb->ObjectInformation->FileId.Unique,
stIoStatus.Status,
- stIoStatus.Information);
+ stIoStatus.Information));
ntStatus = stIoStatus.Status;
}
FALSE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+ 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);
+ Fcb->ObjectInformation->FileId.Unique));
SetFlag( Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
}
- __except( EXCEPTION_EXECUTE_HANDLER)
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
ntStatus = GetExceptionCode();
- AFSDbgLogMsg( 0,
+ 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,
- ntStatus);
+ ntStatus));
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSCleanupFcb Releasing Fcb SectionObject lock %p EXCL %08lX\n",
&Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ PsGetCurrentThread()));
AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
- if( Fcb->OpenReferenceCount <= 0)
- {
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- //
- // Tear em down we'll not be needing them again
- //
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
- AFSTearDownFcbExtents( Fcb,
- NULL);
- }
+ if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
+
+ if( Fcb->OpenReferenceCount <= 0)
+ {
+
+ //
+ // Tear em down we'll not be needing them again
+ //
+
+ AFSTearDownFcbExtents( Fcb,
+ NULL);
+ }
+ }
}
else
{
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Failed to Acquire Fcb SectionObject lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+ &Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &Fcb->NPFcb->Resource);
+
ntStatus = STATUS_RETRY;
}
}
__Enter
{
+ ASSERT( Fcb->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY);
+
AFSAcquireShared( Fcb->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
if( BooleanFlagOn( DirEntry->Flags, AFS_DIR_ENTRY_NOT_IN_PARENT_TREE))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_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_CLEANUP_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_CLEANUP_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);
// From the short name tree
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_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_CLEANUP_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);
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:
UNREFERENCED_PARAMETER(Fcb);
if( Ccb->FileUnwindInfo.FileAttributes != (ULONG)-1)
{
- Ccb->DirectoryCB->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
+ Fcb->ObjectInformation->FileAttributes = Ccb->FileUnwindInfo.FileAttributes;
}
if( Ccb->FileUnwindInfo.CreationTime.QuadPart != (ULONGLONG)-1)
{
- Ccb->DirectoryCB->ObjectInformation->CreationTime.QuadPart = Ccb->FileUnwindInfo.CreationTime.QuadPart;
+ Fcb->ObjectInformation->CreationTime.QuadPart = Ccb->FileUnwindInfo.CreationTime.QuadPart;
}
if( Ccb->FileUnwindInfo.LastAccessTime.QuadPart != (ULONGLONG)-1)
{
- Ccb->DirectoryCB->ObjectInformation->LastAccessTime.QuadPart = Ccb->FileUnwindInfo.LastAccessTime.QuadPart;
+ Fcb->ObjectInformation->LastAccessTime.QuadPart = Ccb->FileUnwindInfo.LastAccessTime.QuadPart;
}
if( Ccb->FileUnwindInfo.LastWriteTime.QuadPart != (ULONGLONG)-1)
{
- Ccb->DirectoryCB->ObjectInformation->LastWriteTime.QuadPart = Ccb->FileUnwindInfo.LastWriteTime.QuadPart;
+ Fcb->ObjectInformation->LastWriteTime.QuadPart = Ccb->FileUnwindInfo.LastWriteTime.QuadPart;
}
if( Ccb->FileUnwindInfo.ChangeTime.QuadPart != (ULONGLONG)-1)
{
- Ccb->DirectoryCB->ObjectInformation->ChangeTime.QuadPart = Ccb->FileUnwindInfo.ChangeTime.QuadPart;
+ Fcb->ObjectInformation->ChangeTime.QuadPart = Ccb->FileUnwindInfo.ChangeTime.QuadPart;
}
return;
AFSDbgLogMsg = LibraryInit->AFSDbgLogMsg;
+ AFSDebugTraceFnc = AFSDbgLogMsg;
+
AFSAddConnectionEx = LibraryInit->AFSAddConnectionEx;
AFSExAllocatePoolWithTag = LibraryInit->AFSExAllocatePoolWithTag;
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);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
AFSGlobalRoot,
- lCount);
+ lCount));
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
lCount = AFSVolumeDecrement( AFSGlobalRoot,
AFS_VOLUME_REFERENCE_GLOBAL_ROOT);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSInitializeLibrary Decrement count on volume %p Cnt %d\n",
AFSGlobalRoot,
- lCount);
+ lCount));
AFSReleaseResource( AFSGlobalRoot->VolumeLock);
lCount = AFSObjectInfoDecrement( AFSGlobalDotDirEntry->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &AFSGlobalDotDirEntry->ObjectInformation);
+ 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);
- ExFreePool( AFSGlobalDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDirEntry = NULL;
}
lCount = AFSObjectInfoDecrement( AFSGlobalDotDotDirEntry->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &AFSGlobalDotDotDirEntry->ObjectInformation);
+ 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);
- ExFreePool( AFSGlobalDotDotDirEntry->NonPaged);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( AFSGlobalDotDotDirEntry);
+ AFSLibExFreePoolWithTag( AFSGlobalDotDotDirEntry,
+ AFS_DIR_ENTRY_TAG);
AFSGlobalDotDotDirEntry = NULL;
}
lCount = AFSObjectInfoDecrement( pDirNode->ObjectInformation,
AFS_OBJECT_REFERENCE_GLOBAL);
- AFSDeleteObjectInfo( &pDirNode->ObjectInformation);
+ 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);
- ExFreePool( pDirNode->NonPaged);
+ AFSLibExFreePoolWithTag( pDirNode->NonPaged,
+ AFS_DIR_ENTRY_NP_TAG);
- ExFreePool( pDirNode);
+ AFSLibExFreePoolWithTag( pDirNode,
+ AFS_DIR_ENTRY_TAG);
pDirNode = pLastDirNode;
}
lCount = AFSVolumeIncrement( pVolumeCB,
VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
}
AFSReleaseResource( &pDevExt->Specific.RDR.VolumeTreeLock);
pObjectInfo = &pVolumeCB->ObjectInformation;
+ AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
lCount = AFSObjectInfoIncrement( pObjectInfo,
AFS_OBJECT_REFERENCE_STATUS);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment1 count on object %p Cnt %d\n",
pObjectInfo,
- lCount);
+ lCount));
+
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
}
else
{
- AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ AFSAcquireExcl( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
ullIndex = AFSCreateLowIndex( &GetStatusInfo->FileID);
lCount = AFSObjectInfoIncrement( pObjectInfo,
AFS_OBJECT_REFERENCE_STATUS);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment2 count on object %p Cnt %d\n",
pObjectInfo,
- lCount);
+ lCount));
+
+ KeQueryTickCount( &pObjectInfo->LastAccessCount);
}
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);
}
lCount = AFSVolumeIncrement( pVolumeCB,
VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment2 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
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,
- lCount);
+ lCount));
ntStatus = AFSLocateNameEntry( NULL,
NULL,
&NewVolumeReferenceReason,
&pNewParentDirEntry,
&pDirectoryEntry,
- NULL);
+ NULL,
+ NULL);
- //
- // 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 ( pNewVolumeCB != NULL)
+ {
- lCount = AFSVolumeDecrement( pVolumeCB,
- VolumeReferenceReason);
+ //
+ // 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.
+ //
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
- pVolumeCB,
- VolumeReferenceReason,
- lCount);
+ lCount = AFSVolumeDecrement( pVolumeCB,
+ VolumeReferenceReason);
- pVolumeCB = pNewVolumeCB;
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on volume %p Reason %u Cnt %d\n",
+ pVolumeCB,
+ VolumeReferenceReason,
+ lCount));
- pNewVolumeCB = NULL;
+ pVolumeCB = pNewVolumeCB;
- VolumeReferenceReason = NewVolumeReferenceReason;
+ pNewVolumeCB = NULL;
- NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ VolumeReferenceReason = NewVolumeReferenceReason;
+
+ NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+ }
//
// AFSLocateNameEntry does not alter the reference count of
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
pParentDirEntry = pNewParentDirEntry;
pObjectInfo = pDirectoryEntry->ObjectInformation;
+ AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
lCount = AFSObjectInfoIncrement( pObjectInfo,
AFS_OBJECT_REFERENCE_STATUS);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Increment3 count on object %p Cnt %d\n",
pObjectInfo,
- lCount);
+ lCount));
+
+ AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
}
//
lCount = InterlockedDecrement( &pDirectoryEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
lCount = InterlockedDecrement( &pParentDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
- if( pObjectInfo != NULL)
+ if( pVolumeCB != NULL)
{
- lCount = AFSObjectInfoDecrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_STATUS);
+ if( pObjectInfo != NULL)
+ {
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
- pObjectInfo,
- lCount);
- }
+ AFSAcquireShared( pVolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
- if( pVolumeCB != NULL)
- {
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_STATUS);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSGetObjectStatus Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount));
+
+ AFSReleaseResource( pVolumeCB->ObjectInfoTree.TreeLock);
+ }
lCount = AFSVolumeDecrement( pVolumeCB,
VolumeReferenceReason);
- AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSGetObjectStatus Decrement4 count on volume %p Reason %u Cnt %d\n",
pVolumeCB,
VolumeReferenceReason,
- lCount);
+ lCount));
}
if( pNameArray != NULL)
// 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);
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,
{
lCount = InterlockedIncrement( &pDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
}
if( pDirEntry == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE_2,
"AFSCheckSymlinkAccess Failed to locate entry %wZ ntStatus %08X\n",
ComponentName,
- STATUS_OBJECT_NAME_NOT_FOUND);
+ 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 REPARSE_POINT_NOT_RESOLVED\n",
- ComponentName);
+ ComponentName));
ntStatus = STATUS_REPARSE_POINT_NOT_RESOLVED;
lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ 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);
+ lCount));
ASSERT( lCount >= 0);
if( pWorldSID == NULL)
{
AFSPrint( "AFSCreateDefaultSecurityDescriptor unable to allocate World SID\n");
+
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
try_return( ntStatus = STATUS_INVALID_PARAMETER);
}
- pRelativeSecurityDescr = (SECURITY_DESCRIPTOR *)ExAllocatePoolWithTag( NonPagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_27_TAG);
+ pRelativeSecurityDescr = (SECURITY_DESCRIPTOR *)AFSLibExAllocatePoolWithTag( NonPagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_27_TAG);
if( pRelativeSecurityDescr == NULL)
{
if( pRelativeSecurityDescr != NULL)
{
- ExFreePool( pRelativeSecurityDescr);
+
+ AFSLibExFreePoolWithTag( pRelativeSecurityDescr,
+ AFS_GENERIC_MEMORY_27_TAG);
}
}
if( pSecurityDescr != NULL)
{
- ExFreePool( pSecurityDescr);
+
+ AFSLibExFreePoolWithTag( pSecurityDescr,
+ AFS_GENERIC_MEMORY_27_TAG);
}
if( pSACL != NULL)
{
- ExFreePool( pSACL);
+
+ AFSLibExFreePoolWithTag( pSACL,
+ AFS_GENERIC_MEMORY_29_TAG);
}
if( pACE != NULL)
{
- ExFreePool( pACE);
+
+ AFSLibExFreePoolWithTag( pACE,
+ AFS_GENERIC_MEMORY_29_TAG);
}
if( pWorldSID != NULL)
{
- ExFreePool( pWorldSID);
+
+ AFSLibExFreePoolWithTag( pWorldSID,
+ AFS_GENERIC_MEMORY_29_TAG);
}
}
// If the final character is a \, jump over it
//
- if( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
+ if( ParentPath->Length >= sizeof( WCHAR)
+ && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] == L'\\')
{
ParentPath->Length -= sizeof( WCHAR);
}
- while( ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
+ while( ParentPath->Length >= sizeof( WCHAR)
+ && ParentPath->Buffer[ (ParentPath->Length/sizeof( WCHAR)) - 1] != L'\\')
{
ParentPath->Length -= sizeof( WCHAR);
}
// And the separator
//
- ParentPath->Length -= sizeof( WCHAR);
+ if ( ParentPath->Length >= sizeof( WCHAR))
+ {
+ ParentPath->Length -= sizeof( WCHAR);
+ }
return;
}
IN ULONG InvalidateReason)
{
+ AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
NTSTATUS ntStatus = STATUS_SUCCESS;
- LIST_ENTRY *le;
- AFSExtent *pEntry;
- ULONG ulProcessCount = 0;
- ULONG ulCount = 0;
LONG lCount;
__Enter
{
- switch( InvalidateReason)
+ switch( InvalidateReason)
{
case AFS_INVALIDATE_DELETED:
{
- if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
ObjectInfo->Fcb != NULL)
{
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
+ if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- ObjectInfo->Links = 0;
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
- ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+ ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
- KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
- 0,
- FALSE);
+ KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+ 0,
+ FALSE);
- //
- // Clear out the extents
- // And get rid of them (note this involves waiting
- // for any writes or reads to the cache to complete)
- //
+ //
+ // Clear out the extents
+ // And get rid of them (note this involves waiting
+ // for any writes or reads to the cache to complete)
+ //
- AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+ }
+ }
+
+ ObjectInfo->Links = 0;
break;
}
case AFS_INVALIDATE_DATA_VERSION:
{
- LARGE_INTEGER liCurrentOffset = {0,0};
- LARGE_INTEGER liFlushLength = {0,0};
- ULONG ulFlushLength = 0;
- BOOLEAN bLocked = FALSE;
- BOOLEAN bExtentsLocked = FALSE;
- BOOLEAN bCleanExtents = FALSE;
-
if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
ObjectInfo->Fcb != NULL)
{
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
- TRUE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB %0p\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ObjectInfo->Fcb));
+
+ if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+ {
- bLocked = TRUE;
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPerformObjectInvalidate Acquiring Fcb extents lock %p SHARED %08lX\n",
- &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- PsGetCurrentThread());
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
- AFSAcquireShared( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation DirectIO Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- bExtentsLocked = TRUE;
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ 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.
- //
+ __try
+ {
- if ( ObjectInfo->Fcb->Specific.File.ExtentCount != ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount)
- {
+ 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 DirectIO 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);
- if ( ObjectInfo->Fcb->Specific.File.ExtentsDirtyCount == 0)
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ ntStatus = GetExceptionCode();
- bExtentsLocked = FALSE;
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation DirectIO FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
- if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
- {
+ SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
- bLocked = FALSE;
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation DirectIO Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- AFSTearDownFcbExtents( ObjectInfo->Fcb,
- NULL);
- }
- else
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation DirectIO Releasing Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ }
+ else
+ {
+ LIST_ENTRY *le;
+ AFSExtent *pEntry;
+ ULONG ulProcessCount = 0;
+ ULONG ulCount = 0;
+ LARGE_INTEGER liCurrentOffset = {0,0};
+ LARGE_INTEGER liFlushLength = {0,0};
+ ULONG ulFlushLength = 0;
+ BOOLEAN bLocked = FALSE;
+ BOOLEAN bExtentsLocked = FALSE;
+ BOOLEAN bCleanExtents = FALSE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidate Acquiring Fcb lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->Resource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Resource,
+ TRUE);
+
+ bLocked = TRUE;
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "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)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
- TRUE);
+ bExtentsLocked = FALSE;
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ if ( ObjectInfo->Fcb->OpenReferenceCount == 0)
+ {
- bLocked = FALSE;
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
- __try
+ bLocked = FALSE;
+
+ AFSTearDownFcbExtents( ObjectInfo->Fcb,
+ NULL);
+ }
+ else
{
- if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
- !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE))
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
+
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
+
+ __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);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
+ else
+ {
+
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+ 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);
+ ObjectInfo->FileId.Unique,
+ ntStatus));
SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
- else
- {
- bCleanExtents = TRUE;
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
}
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
-
- ntStatus = GetExceptionCode();
- AFSDbgLogMsg( 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);
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
- AFSDbgLogMsg( 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->Resource);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+ bLocked = FALSE;
+ }
}
- }
- else
- {
+ else
+ {
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
- bExtentsLocked = FALSE;
+ bExtentsLocked = FALSE;
- AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
- &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
- PsGetCurrentThread());
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
- TRUE);
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ TRUE);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ //
+ // 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.
+ //
- bLocked = FALSE;
+ AFSByteRange * ByteRangeList = NULL;
+ ULONG ulByteRangeCount = 0;
+ ULONG ulIndex;
+ BOOLEAN bPurgeOnClose = 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.
- //
+ __try
+ {
- AFSByteRange * ByteRangeList = NULL;
- ULONG ulByteRangeCount = 0;
- ULONG ulIndex;
- BOOLEAN bPurgeOnClose = FALSE;
+ ulByteRangeCount = AFSConstructCleanByteRangeList( ObjectInfo->Fcb,
+ &ByteRangeList);
- __try
- {
+ if ( ByteRangeList != NULL ||
+ ulByteRangeCount == 0)
+ {
- ulByteRangeCount = AFSConstructCleanByteRangeList( ObjectInfo->Fcb,
- &ByteRangeList);
+ for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
+ {
- if ( ByteRangeList != NULL ||
- ulByteRangeCount == 0)
- {
+ ULONG ulSize;
- for ( ulIndex = 0; ulIndex < ulByteRangeCount; ulIndex++)
- {
+ do {
- ULONG ulSize;
+ ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
- do {
+ __try
+ {
- 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))
+ {
- 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));
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ bPurgeOnClose = TRUE;
+ }
+ else
+ {
- bPurgeOnClose = TRUE;
- }
- else
- {
+ bCleanExtents = TRUE;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
- bCleanExtents = TRUE;
- }
+ ntStatus = GetExceptionCode();
- ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (1) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
- ByteRangeList[ulIndex].FileOffset.QuadPart += ulSize;
+ ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
- } while ( ByteRangeList[ulIndex].Length.QuadPart > 0);
- }
- }
- else
- {
+ ByteRangeList[ulIndex].FileOffset.QuadPart += ulSize;
- //
- // 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.
- //
+ } while ( ByteRangeList[ulIndex].Length.QuadPart > 0);
+ }
+ }
+ else
+ {
- AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
- TRUE);
- bExtentsLocked = TRUE;
+ //
+ // 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.
+ //
- le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
+ AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+ TRUE);
+ bExtentsLocked = TRUE;
- ulProcessCount = 0;
+ le = ObjectInfo->Fcb->Specific.File.ExtentsLists[AFS_EXTENTS_LIST].Flink;
- ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount;
+ ulProcessCount = 0;
- if( ulCount > 0)
- {
- pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
+ ulCount = (ULONG)ObjectInfo->Fcb->Specific.File.ExtentCount;
- while( ulProcessCount < ulCount)
+ if( ulCount > 0)
{
pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
- if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
+ while( ulProcessCount < ulCount)
{
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &pEntry->FileOffset,
- pEntry->Size,
- FALSE))
- {
+ pEntry = ExtentFor( le, AFS_EXTENTS_LIST );
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
-
- bPurgeOnClose = TRUE;
- }
- else
+ if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
{
-
- bCleanExtents = TRUE;
+ __try
+ {
+ 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;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (2) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
}
- }
-
- if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
- {
- liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart;
-
- while( liFlushLength.QuadPart > 0)
+ if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
{
- if( liFlushLength.QuadPart > 512 * 1024000)
- {
- ulFlushLength = 512 * 1024000;
- }
- else
- {
- ulFlushLength = liFlushLength.LowPart;
- }
-
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- &liCurrentOffset,
- ulFlushLength,
- FALSE))
- {
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
+ liFlushLength.QuadPart = pEntry->FileOffset.QuadPart - liCurrentOffset.QuadPart;
- bPurgeOnClose = TRUE;
- }
- else
+ while( liFlushLength.QuadPart > 0)
{
- bCleanExtents = TRUE;
+ if( liFlushLength.QuadPart > 512 * 1024000)
+ {
+ ulFlushLength = 512 * 1024000;
+ }
+ else
+ {
+ ulFlushLength = liFlushLength.LowPart;
+ }
+
+ __try
+ {
+ 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;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (3) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
+
+ liFlushLength.QuadPart -= ulFlushLength;
}
-
- liFlushLength.QuadPart -= ulFlushLength;
}
- }
- liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size;
+ liCurrentOffset.QuadPart = pEntry->FileOffset.QuadPart + pEntry->Size;
- ulProcessCount++;
- le = le->Flink;
+ ulProcessCount++;
+ le = le->Flink;
+ }
}
- }
- else
- {
- if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
- NULL,
- 0,
- FALSE))
+ else
{
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
- AFS_TRACE_LEVEL_WARNING,
- "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
- ObjectInfo->FileId.Cell,
- ObjectInfo->FileId.Volume,
- ObjectInfo->FileId.Vnode,
- ObjectInfo->FileId.Unique);
-
- bPurgeOnClose = TRUE;
+ __try
+ {
+ 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;
+ }
+ }
+ __except( EXCEPTION_EXECUTE_HANDLER)
+ {
+
+ ntStatus = GetExceptionCode();
+
+ AFSDbgTrace(( 0,
+ 0,
+ "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (4) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+ }
}
- else
+
+ if ( bPurgeOnClose)
{
- bCleanExtents = TRUE;
+ SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
}
}
+ }
+ __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+ {
- if ( bPurgeOnClose)
- {
+ ntStatus = GetExceptionCode();
- SetFlag( ObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
- }
+ 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));
}
- }
- __except( EXCEPTION_EXECUTE_HANDLER)
- {
- ntStatus = GetExceptionCode();
+ AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+ &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
+ PsGetCurrentThread()));
- AFSDbgLogMsg( 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);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
- AFSDbgLogMsg( 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->Resource);
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+ bLocked = FALSE;
+ }
}
- }
- if ( bExtentsLocked)
- {
+ if ( bExtentsLocked)
+ {
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource );
+ }
- if ( bLocked)
- {
+ if ( bLocked)
+ {
- AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
- }
+ AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+ }
- if ( bCleanExtents)
- {
+ if ( bCleanExtents)
+ {
- AFSReleaseCleanExtents( ObjectInfo->Fcb,
- NULL);
- }
+ AFSReleaseCleanExtents( ObjectInfo->Fcb,
+ NULL);
+ }
+ }
}
+ else if ( ObjectInfo->FileType == AFS_FILE_TYPE_FILE)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DATA_VERSION FCB NULL\n",
+ ObjectInfo->FileType,
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique));
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
+ }
break;
}
- }
+ }
//
// Destroy the reference passed in by the caller to AFSInvalidateObject
// or AFSQueueInvalidateObject
//
+ AFSAcquireShared( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
lCount = AFSObjectInfoDecrement( ObjectInfo,
AFS_OBJECT_REFERENCE_INVALIDATION);
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSPerformObjectInvalidation Decrement count on object %p Cnt %d\n",
ObjectInfo,
- lCount);
+ lCount));
+
+ AFSReleaseResource( ObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+ }
+
+ return ntStatus;
+}
+
+BOOLEAN
+AFSIgnoreReparsePointToFile( void)
+{
+ AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
+ BOOLEAN bIgnoreReparsePoint;
+
+ {
+
+ bIgnoreReparsePoint = BooleanFlagOn( pDeviceExt->Specific.RDR.ReparsePointPolicy,
+ AFS_REPARSE_POINT_TO_FILE_AS_FILE);
+ }
+
+ return bIgnoreReparsePoint;
+}
+
+NTSTATUS
+AFSRetrieveTargetFileInfo( IN PUNICODE_STRING TargetName,
+ OUT AFSFileInfoCB *FileInfo)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ OBJECT_ATTRIBUTES stObjectAttribs;
+ HANDLE hFile = NULL;
+ IO_STATUS_BLOCK stIoStatus;
+ FILE_NETWORK_OPEN_INFORMATION stFileInfo;
+
+ __Enter
+ {
+
+ InitializeObjectAttributes( &stObjectAttribs,
+ TargetName,
+ OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ ntStatus = ZwCreateFile( &hFile,
+ FILE_READ_ATTRIBUTES,
+ &stObjectAttribs,
+ &stIoStatus,
+ NULL,
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_SYNCHRONOUS_IO_NONALERT,
+ NULL,
+ 0);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ try_return( ntStatus);
+ }
+
+ ntStatus = ZwQueryInformationFile( hFile,
+ &stIoStatus,
+ &stFileInfo,
+ sizeof( FILE_NETWORK_OPEN_INFORMATION),
+ FileNetworkOpenInformation);
+
+ if( !NT_SUCCESS( ntStatus))
+ {
+
+ try_return( ntStatus);
+ }
+
+ FileInfo->FileAttributes = stFileInfo.FileAttributes;
+
+ FileInfo->AllocationSize = stFileInfo.AllocationSize;
+
+ FileInfo->EndOfFile = stFileInfo.EndOfFile;
+
+ FileInfo->CreationTime = stFileInfo.CreationTime;
+
+ FileInfo->LastAccessTime = stFileInfo.LastAccessTime;
+
+ FileInfo->LastWriteTime = stFileInfo.LastWriteTime;
+
+ FileInfo->ChangeTime = stFileInfo.ChangeTime;
+
+try_exit:
+
+ if( hFile != NULL)
+ {
+ ZwClose( hFile);
+ }
}
return ntStatus;
}
+
+BOOLEAN
+AFSIsShareName( IN UNICODE_STRING *FileName)
+{
+
+ BOOLEAN bIsShareName = TRUE;
+ USHORT usIndex = 1; // Skip the first \
+
+ //
+ // A share name will be of the form \Share so only a single \ at the beginning
+ //
+
+ while( usIndex < FileName->Length/sizeof( WCHAR))
+ {
+
+ if( FileName->Buffer[ usIndex] == L'\\')
+ {
+ bIsShareName = FALSE;
+ break;
+ }
+
+ usIndex++;
+ }
+
+ return bIsShareName;
+}
\ No newline at end of file