/*
- * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
- * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Kernel Drivers, LLC.
+ * 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
ASSERT( ExIsResourceAcquiredExclusiveLite( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock));
+ if( BooleanFlagOn( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
+ {
+
+ try_return( ntStatus = STATUS_SUCCESS);
+ }
+
uniGUID.Length = 0;
uniGUID.MaximumLength = 0;
uniGUID.Buffer = NULL;
&uniGUID);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Enumerating FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
- &uniGUID);
+ &uniGUID));
if( AuthGroup != NULL)
{
// Initialize the directory enumeration buffer for the directory
//
- pBuffer = AFSExAllocatePoolWithTag( PagedPool,
- AFS_DIR_ENUM_BUFFER_LEN,
- AFS_DIR_BUFFER_TAG);
+ pBuffer = AFSLibExAllocatePoolWithTag( PagedPool,
+ AFS_DIR_ENUM_BUFFER_LEN,
+ AFS_DIR_BUFFER_TAG);
if( pBuffer == NULL)
{
AuthGroup,
NULL,
&ObjectInfoCB->FileId,
+ ObjectInfoCB->VolumeCB->VolumeInformation.Cell,
+ ObjectInfoCB->VolumeCB->VolumeInformation.CellLength,
(void *)pDirQueryCB,
sizeof( AFSDirQueryCB),
pBuffer,
AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
ObjectInfoCB->FileId.Cell,
pDirEnumResponse->SnapshotDataVersion.LowPart,
pDirEnumResponse->CurrentDataVersion.HighPart,
pDirEnumResponse->CurrentDataVersion.LowPart,
- ntStatus);
+ ntStatus));
ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Force Verify due to DV change during enumeration FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
}
AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Failed to enumerate directory FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ Status %08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
&uniGUID,
- ntStatus);
+ ntStatus));
}
break;
pCurrentDirEntry = (AFSDirEnumEntry *)pDirEnumResponse->Entry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Enumerating FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX\n",
ObjectInfoCB->FileId.Cell,
pDirEnumResponse->SnapshotDataVersion.HighPart,
pDirEnumResponse->SnapshotDataVersion.LowPart,
pDirEnumResponse->CurrentDataVersion.HighPart,
- pDirEnumResponse->CurrentDataVersion.LowPart);
+ pDirEnumResponse->CurrentDataVersion.LowPart));
//
// Remove the leading header from the processed length
if( pDirNode->ObjectInformation->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
{
- LONG lCount;
- AFSObjectInfoCB *pObjectInfo = pDirNode->ObjectInformation;
-
- //
- // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
- //
-
- lCount = AFSObjectInfoIncrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_INVALIDATION);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSEnumerateDirectory calling AFSPerformObjectInvalidate Increment count on object %p Cnt %d\n",
- pObjectInfo,
- lCount);
-
- AFSPerformObjectInvalidate( pObjectInfo,
- AFS_INVALIDATE_DATA_VERSION);
- }
- else
- {
-
AFSUpdateMetaData( pDirNode,
pCurrentDirEntry);
}
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
AFSDeleteDirEntry( ObjectInfoCB,
- pDirNode);
+ &pDirNode);
}
else
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
AFSRemoveNameEntry( ObjectInfoCB,
pDirNode);
if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
&uniDirName,
pDirNode->ObjectInformation->FileId.Cell,
pDirNode->ObjectInformation->FileId.Volume,
pDirNode->ObjectInformation->FileId.Vnode,
- pDirNode->ObjectInformation->FileId.Unique);
+ pDirNode->ObjectInformation->FileId.Unique));
AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Initialized short name %wZ for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&uniShortName,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
}
else
{
ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead = pDirNode;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to head of case sensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to case sensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
if( !NT_SUCCESS( AFSInsertCaseSensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
pDirNode)))
//
AFSDeleteDirEntry( ObjectInfoCB,
- pDirNode);
+ &pDirNode);
pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
if( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to head of case insensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead = pDirNode;
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to case insensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
AFSInsertCaseInsensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
pDirNode);
InterlockedIncrement( &ObjectInfoCB->Specific.Directory.DirectoryNodeCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Adding entry %wZ Inc Count %d to parent FID %08lX-%08lX-%08lX-%08lX\n",
&pDirNode->NameInformation.FileName,
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
if( pDirNode->Type.Data.ShortNameTreeEntry.HashIndex != 0)
{
if( ObjectInfoCB->Specific.Directory.ShortNameTree == NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to head of shortname tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
ObjectInfoCB->Specific.Directory.ShortNameTree = pDirNode;
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Insert DE %p to shortname tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
}
}
pDirQueryCB->EnumHandle = pDirEnumResponse->EnumHandle;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory EnumHandle %08lX\n",
- pDirQueryCB->EnumHandle);
+ pDirQueryCB->EnumHandle));
}
try_exit:
AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
}
- //
- // If the processing failed then we should reset the directory content in the event
- // it is re-enumerated
- //
+ if ( NT_SUCCESS( ntStatus))
+ {
- if( !NT_SUCCESS( ntStatus))
+ SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+ }
+ else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ //
+ // If the processing failed then we should reset the directory
+ // content in the event it is re-enumerated
+ //
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSEnumerateDirectory Resetting content for FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
- ntStatus);
+ ntStatus));
AFSResetDirectoryContent( ObjectInfoCB);
}
AuthGroup,
NULL,
FileId,
+ NULL,
+ 0,
(void *)&stDirQueryCB,
sizeof( AFSDirQueryCB),
NULL,
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSEnumerateDirectoryNoResponse Failed to enumerate directory Status %08lX\n",
- ntStatus);
+ ntStatus));
}
}
}
&uniGUID);
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Verifying content for FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
- &uniGUID);
+ &uniGUID));
if( AuthGroup != NULL)
{
// Initialize the directory enumeration buffer for the directory
//
- pBuffer = AFSExAllocatePoolWithTag( PagedPool,
- AFS_DIR_ENUM_BUFFER_LEN,
- AFS_DIR_BUFFER_TAG);
+ pBuffer = AFSLibExAllocatePoolWithTag( PagedPool,
+ AFS_DIR_ENUM_BUFFER_LEN,
+ AFS_DIR_BUFFER_TAG);
if( pBuffer == NULL)
{
AuthGroup,
NULL,
&ObjectInfoCB->FileId,
+ ObjectInfoCB->VolumeCB->VolumeInformation.Cell,
+ ObjectInfoCB->VolumeCB->VolumeInformation.CellLength,
(void *)pDirQueryCB,
sizeof( AFSDirQueryCB),
pBuffer,
AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Directory Complete FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX Status %08lX\n",
ObjectInfoCB->FileId.Cell,
pDirEnumResponse->SnapshotDataVersion.LowPart,
pDirEnumResponse->CurrentDataVersion.HighPart,
pDirEnumResponse->CurrentDataVersion.LowPart,
- ntStatus);
+ ntStatus));
ntStatus = STATUS_SUCCESS;
ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Force Verify due to DV change during enumeration FID %08lX-%08lX-%08lX-%08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
}
else
{
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSVerifyDirectoryContent Failed to enumerate directory FID %08lX-%08lX-%08lX-%08lX AuthGroup %wZ Status %08lX\n",
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
&uniGUID,
- ntStatus);
+ ntStatus));
}
break;
pCurrentDirEntry = (AFSDirEnumEntry *)pDirEnumResponse->Entry;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent EnumResponse FID %08lX-%08lX-%08lX-%08lX Snapshot-DV %08lX:%08lX Current-DV %08lX:%08lX\n",
ObjectInfoCB->FileId.Cell,
pDirEnumResponse->SnapshotDataVersion.HighPart,
pDirEnumResponse->SnapshotDataVersion.LowPart,
pDirEnumResponse->CurrentDataVersion.HighPart,
- pDirEnumResponse->CurrentDataVersion.LowPart);
+ pDirEnumResponse->CurrentDataVersion.LowPart));
//
// Remove the leading header from the processed length
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
+ KeQueryTickCount( &ObjectInfoCB->LastAccessCount);
+
if( pCurrentDirEntry->ShortNameLength > 0 &&
pDirNode->NameInformation.ShortNameLength > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name %S\n",
&uniDirName,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
pDirNode->NameInformation.ShortName,
- pCurrentDirEntry->ShortName);
+ pCurrentDirEntry->ShortName));
}
else if( pCurrentDirEntry->ShortNameLength == 0 &&
pDirNode->NameInformation.ShortNameLength > 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name %S New short name NULL\n",
&uniDirName,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
- pDirNode->NameInformation.ShortName);
+ pDirNode->NameInformation.ShortName));
}
else if( pCurrentDirEntry->ShortNameLength > 0 &&
pDirNode->NameInformation.ShortNameLength == 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name %S\n",
&uniDirName,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique,
- pCurrentDirEntry->ShortName);
+ pCurrentDirEntry->ShortName));
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Verified entry %wZ (%wZ) parent FID %08lX-%08lX-%08lX-%08lX old short name NULL New short name NULL\n",
&uniDirName,
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
}
//
if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
{
- //
- // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
- // if successfully queued. Cannot call AFSPerformObjectInvalidate directly
- // because ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock is
- // held during the sequence AFSVerifyEntry->AFSValidateDirectoryCache->
- // AFSVerifyDirectoryContent and AFSPerformObjectInvalidate requires the
- // Fcb->NPFcb->Resource which must be held prior to the TreeLock in the
- // lock hierarchy.
- //
-
- lCount = AFSObjectInfoIncrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_INVALIDATION);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyDirectoryContent calling AFSQueueInvalidateObject Increment count on object %p Cnt %d\n",
- pObjectInfo,
- lCount);
-
- if ( !NT_SUCCESS( AFSQueueInvalidateObject( pObjectInfo,
- AFS_INVALIDATE_DATA_VERSION)))
- {
-
- lCount = AFSObjectInfoDecrement( pObjectInfo,
- AFS_OBJECT_REFERENCE_INVALIDATION);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyDirectoryContent AFSQueueInvalidateObject failed Decrement count on object %p Cnt %d\n",
- pObjectInfo,
- lCount);
- }
- }
- else
- {
-
AFSUpdateMetaData( pDirNode,
pCurrentDirEntry);
}
// File name matches but FileID does not.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Processing dir entry %p %wZ with different FID, same name in parent FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
//
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
AFSDeleteDirEntry( ObjectInfoCB,
- pDirNode);
+ &pDirNode);
}
else
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSVerifyDirectoryContent Different FIDs - removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
AFSRemoveNameEntry( ObjectInfoCB,
pDirNode);
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent New entry %wZ for parent FID %08lX-%08lX-%08lX-%08lX\n",
&uniDirName,
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
}
pDirNode = AFSInitDirEntry( ObjectInfoCB,
if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
&uniDirName,
pDirNode->ObjectInformation->FileId.Cell,
pDirNode->ObjectInformation->FileId.Volume,
pDirNode->ObjectInformation->FileId.Vnode,
- pDirNode->ObjectInformation->FileId.Unique);
+ pDirNode->ObjectInformation->FileId.Unique));
AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Initialized short name %wZ for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
&uniShortName,
pCurrentDirEntry->FileId.Cell,
pCurrentDirEntry->FileId.Volume,
pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ pCurrentDirEntry->FileId.Unique));
}
else
{
ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead = pDirNode;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to head of case sensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
if( !NT_SUCCESS( AFSInsertCaseSensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
pDirNode)))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Failed to insert DE %p to case sensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
//
// Delete this dir entry and continue on
//
AFSDeleteDirEntry( ObjectInfoCB,
- pDirNode);
+ &pDirNode);
pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to case sensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
}
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_CASE_INSENSTIVE_LIST_HEAD);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to head of case insensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
AFSInsertCaseInsensitiveDirEntry( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.CaseInsensitiveTreeHead,
pDirNode);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to case insensitive tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
if( ObjectInfoCB->Specific.Directory.DirectoryNodeListHead == NULL)
InterlockedIncrement( &ObjectInfoCB->Specific.Directory.DirectoryNodeCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIR_NODE_COUNT,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIR_NODE_COUNT,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Adding entry %wZ Inc Count %d to parent FID %08lX-%08lX-%08lX-%08lX\n",
&pDirNode->NameInformation.FileName,
ObjectInfoCB->FileId.Cell,
ObjectInfoCB->FileId.Volume,
ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ ObjectInfoCB->FileId.Unique));
if( pDirNode->Type.Data.ShortNameTreeEntry.HashIndex != 0)
{
ObjectInfoCB->Specific.Directory.ShortNameTree = pDirNode;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to head of shortname tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
}
if( !NT_SUCCESS( AFSInsertShortNameDirEntry( ObjectInfoCB->Specific.Directory.ShortNameTree,
pDirNode)))
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Failed to insert DE %p (%08lX) to shortname tree for %wZ\n",
pDirNode,
pDirNode->Type.Data.ShortNameTreeEntry.HashIndex,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_INSERTED_SHORT_NAME);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Insert DE %p to shortname tree for %wZ\n",
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
}
}
// Allocate our return buffer
//
- pResultCB = (AFSFileCreateResultCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_1_TAG);
+ pResultCB = (AFSFileCreateResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_1_TAG);
if( pResultCB == NULL)
{
AuthGroup,
FileName,
NULL,
+ NULL,
+ 0,
&stCreateCB,
sizeof( AFSFileCreateCB),
pResultCB,
if( ParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSNotifyFileCreate Raced with an invalidate call and a re-enumeration for entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version (%08lX:%08lX != %08lX:%08lX - 1)\n",
FileName,
ParentObjectInfo->DataVersion.HighPart,
ParentObjectInfo->DataVersion.LowPart,
pResultCB->ParentDataVersion.HighPart,
- pResultCB->ParentDataVersion.LowPart);
+ pResultCB->ParentDataVersion.LowPart));
//
// We raced so go and lookup the directory entry in the parent
if( pDirNode != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Located dir entry %p for file %wZ\n",
pDirNode,
- FileName);
+ FileName));
if ( AFSIsEqualFID( &pDirNode->ObjectInformation->FileId,
&pResultCB->DirEnum.FileId))
// same as the one that was created for us by the file server.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSNotifyFileCreate Found matching name entry %wZ DE %p FID %08lX-%08lX-%08lX-%08lX != FID %08lX-%08lX-%08lX-%08lX\n",
FileName,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
AFSDeleteDirEntry( ParentObjectInfo,
- pDirNode);
+ &pDirNode);
}
else
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
AFSRemoveNameEntry( ParentObjectInfo,
pDirNode);
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Creating new entry %wZ\n",
- FileName);
+ FileName));
//
// Initialize the directory entry
pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Initialized short name %wZ for DE %p for %wZ\n",
&uniShortName,
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
FileName,
ParentObjectInfo->FileId.Volume,
ParentObjectInfo->FileId.Vnode,
ParentObjectInfo->FileId.Unique,
- ParentObjectInfo->DataVersion.QuadPart);
+ ParentObjectInfo->DataVersion.QuadPart));
}
//
lCount = InterlockedIncrement( &(*DirNode)->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
&(*DirNode)->NameInformation.FileName,
*DirNode,
- lCount);
+ lCount));
ASSERT( lCount >= 0);
}
stUpdateCB.LastWriteTime = ObjectInfo->LastWriteTime;
- pUpdateResultCB = (AFSFileUpdateResultCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_UPDATE_RESULT_TAG);
+ pUpdateResultCB = (AFSFileUpdateResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_UPDATE_RESULT_TAG);
if( pUpdateResultCB == NULL)
{
AuthGroup,
NULL,
&ObjectInfo->FileId,
+ ObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ObjectInfo->VolumeCB->VolumeInformation.CellLength,
&stUpdateCB,
sizeof( AFSFileUpdateCB),
pUpdateResultCB,
if( ntStatus != STATUS_SUCCESS)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSUpdateFileInformation failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
ObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
AFSFileDeleteCB stDelete;
AFSFileDeleteResultCB stDeleteResult;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+ AFSObjectInfoCB *pObjectInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
__Enter
{
- stDelete.ParentId = DirectoryCB->ObjectInformation->ParentObjectInformation->FileId;
+ pObjectInfo = DirectoryCB->ObjectInformation;
+
+ pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+ &pObjectInfo->ParentFileId,
+ FALSE);
+
+ stDelete.ParentId = pObjectInfo->ParentFileId;
stDelete.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
ulRequestFlags,
AuthGroup,
&DirectoryCB->NameInformation.FileName,
- &DirectoryCB->ObjectInformation->FileId,
+ &pObjectInfo->FileId,
+ pObjectInfo->VolumeCB->VolumeInformation.Cell,
+ pObjectInfo->VolumeCB->VolumeInformation.CellLength,
&stDelete,
sizeof( AFSFileDeleteCB),
&stDeleteResult,
if( ntStatus != STATUS_SUCCESS)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSNotifyDelete failed ParentFID %08lX-%08lX-%08lX-%08lX %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
stDelete.ParentId.Cell,
stDelete.ParentId.Vnode,
stDelete.ParentId.Unique,
&DirectoryCB->NameInformation.FileName,
- DirectoryCB->ObjectInformation->FileId.Cell,
- DirectoryCB->ObjectInformation->FileId.Volume,
- DirectoryCB->ObjectInformation->FileId.Vnode,
- DirectoryCB->ObjectInformation->FileId.Unique,
- ntStatus);
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
+ ntStatus));
try_return( ntStatus);
}
- AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
if( CheckOnly)
// Validate the parent data version
//
- if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
+ if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart)
{
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
}
else
// Update the parent data version
//
- if( DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
+ if( pParentObjectInfo->DataVersion.QuadPart != stDeleteResult.ParentDataVersion.QuadPart - 1)
{
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
else
{
// Directory data version number can be updated. Until then we must force
// a verification.
//
- // DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
+ // pParentObjectInfor->DataVersion.QuadPart = stDeleteResult.ParentDataVersion.QuadPart;
//
- SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
}
- AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
try_exit:
- NOTHING;
+ if ( pParentObjectInfo)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
}
return ntStatus;
// Init the control block for the request
//
- pHardLinkCB = (AFSFileHardLinkCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_HARDLINK_REQUEST_TAG);
+ pHardLinkCB = (AFSFileHardLinkCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_HARDLINK_REQUEST_TAG);
if( pHardLinkCB == NULL)
{
AuthGroup,
&SourceDirectoryCB->NameInformation.FileName,
&ObjectInfo->FileId,
+ ObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ObjectInfo->VolumeCB->VolumeInformation.CellLength,
pHardLinkCB,
sizeof( AFSFileHardLinkCB) + TargetName->Length,
pResultCB,
if( ntStatus != STATUS_SUCCESS)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSNotifyHardLink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
ObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_WARNING,
"AFSNotifyHardLink Raced with an invalidate call and a re-enumeration for entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version (%08lX:%08lX != %08lX:%08lX - 1)\n",
TargetName,
TargetParentObjectInfo->DataVersion.HighPart,
TargetParentObjectInfo->DataVersion.LowPart,
pResultCB->TargetParentDataVersion.HighPart,
- pResultCB->TargetParentDataVersion.LowPart);
+ pResultCB->TargetParentDataVersion.LowPart));
//
// We raced so go and lookup the directory entry in the parent
if( pDirNode != NULL)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Located dir entry %p for file %wZ\n",
pDirNode,
- TargetName);
+ TargetName));
if ( AFSIsEqualFID( &pDirNode->ObjectInformation->FileId,
&pResultCB->DirEnum.FileId))
// same as the one that was created for us by the file server.
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSNotifyHardLink Found matching name entry %wZ DE %p FID %08lX-%08lX-%08lX-%08lX != FID %08lX-%08lX-%08lX-%08lX\n",
TargetName,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
- if( pDirNode->DirOpenReferenceCount <= 0)
+ if( pDirNode->DirOpenReferenceCount <= 0 &&
+ pDirNode->NameArrayReferenceCount <= 0)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Different FIDs - Deleting DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
AFSDeleteDirEntry( TargetParentObjectInfo,
- pDirNode);
+ &pDirNode);
}
else
{
SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Different FIDs - Removing DE %p for %wZ Old FID %08lX-%08lX-%08lX-%08lX New FID %08lX-%08lX-%08lX-%08lX\n",
pDirNode,
pResultCB->DirEnum.FileId.Cell,
pResultCB->DirEnum.FileId.Volume,
pResultCB->DirEnum.FileId.Vnode,
- pResultCB->DirEnum.FileId.Unique);
+ pResultCB->DirEnum.FileId.Unique));
AFSRemoveNameEntry( TargetParentObjectInfo,
pDirNode);
// Create the hard link entry
//
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Creating new entry %wZ\n",
- TargetName);
+ TargetName));
//
// Initialize the directory entry
pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
TRUE);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Initialized short name %wZ for DE %p for %wZ\n",
&uniShortName,
pDirNode,
- &pDirNode->NameInformation.FileName);
+ &pDirNode->NameInformation.FileName));
}
else
{
TargetParentObjectInfo->DataVersion = pResultCB->TargetParentDataVersion;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
TargetName,
TargetParentObjectInfo->FileId.Volume,
TargetParentObjectInfo->FileId.Vnode,
TargetParentObjectInfo->FileId.Unique,
- TargetParentObjectInfo->DataVersion.QuadPart);
+ TargetParentObjectInfo->DataVersion.QuadPart));
}
try_exit:
lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyHardLink Increment count on %wZ DE %p Cnt %d\n",
&pDirNode->NameInformation.FileName,
pDirNode,
- lCount);
+ lCount));
ASSERT( lCount >= 0);
// Init the control block for the request
//
- pRenameCB = (AFSFileRenameCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_RENAME_REQUEST_TAG);
+ pRenameCB = (AFSFileRenameCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_RENAME_REQUEST_TAG);
if( pRenameCB == NULL)
{
AuthGroup,
&DirectoryCB->NameInformation.FileName,
&ObjectInfo->FileId,
+ ObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ObjectInfo->VolumeCB->VolumeInformation.CellLength,
pRenameCB,
sizeof( AFSFileRenameCB) + TargetName->Length,
pRenameResultCB,
if( ntStatus != STATUS_SUCCESS)
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
"AFSNotifyRename failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
ObjectInfo->FileId.Unique,
- ntStatus);
+ ntStatus));
try_return( ntStatus);
}
uniShortName.MaximumLength = uniShortName.Length;
uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyRename Update old short name %wZ for DE %p for %wZ\n",
&uniShortName,
DirectoryCB,
- &DirectoryCB->NameInformation.FileName);
+ &DirectoryCB->NameInformation.FileName));
DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
uniShortName.MaximumLength = uniShortName.Length;
uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyRename Initialized short name %wZ for DE %p for %wZ\n",
&uniShortName,
DirectoryCB,
- &DirectoryCB->NameInformation.FileName);
+ &DirectoryCB->NameInformation.FileName));
}
else
{
uniShortName.MaximumLength = uniShortName.Length;
uniShortName.Buffer = DirectoryCB->NameInformation.ShortName;
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSNotifyRename Removing old short name %wZ for DE %p for %wZ\n",
&uniShortName,
DirectoryCB,
- &DirectoryCB->NameInformation.FileName);
+ &DirectoryCB->NameInformation.FileName));
DirectoryCB->NameInformation.ShortNameLength = 0;
AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry *pDirEnumCB = NULL;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
- AFSObjectInfoCB *pParentInfo = NULL;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
__Enter
{
RtlZeroMemory( &stTargetID,
sizeof( AFSEvalTargetCB));
- pParentInfo = ObjectInfo->ParentObjectInformation;
-
- if( pParentInfo != NULL)
+ if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- stTargetID.ParentId = pParentInfo->FileId;
+ pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+ &ObjectInfo->ParentFileId,
+ TRUE);
+
+ stTargetID.ParentId = ObjectInfo->ParentFileId;
}
//
// Allocate our response buffer
//
- pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_30_TAG);
+ pEvalResultCB = (AFSFileEvalResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_30_TAG);
if( pEvalResultCB == NULL)
{
AuthGroup,
NULL,
&ObjectInfo->FileId,
+ ObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ObjectInfo->VolumeCB->VolumeInformation.CellLength,
&stTargetID,
sizeof( AFSEvalTargetCB),
pEvalResultCB,
if( ntStatus == STATUS_OBJECT_PATH_INVALID)
{
- if( pParentInfo != NULL)
+ if( pParentObjectInfo != NULL)
{
- AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
}
}
//
+ // A BSOD can occur if the pEvalResultCB->FileType is FILE but the
+ // ObjectInfo->FileType is something else. The same is true for
+ // pDirEnumEntry->FileType is DIRECTORY. Perform a sanity check
+ // to ensure consistency. An inconsistent pDirEnumEntry can be
+ // produced as a result of invalid status info received from a file
+ // server. If the types are inconsistent or if the type does not
+ // match the implied type derived from the vnode (odd values are
+ // directories and even values are other types), prevent the request
+ // from completing successfully. This may prevent access to the file or
+ // directory but will prevent a BSOD.
+ //
+
+ if ( !AFSIsEqualFID( &ObjectInfo->FileId,
+ &pEvalResultCB->DirEnum.FileId))
+ {
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ switch ( pEvalResultCB->DirEnum.FileType)
+ {
+
+ case AFS_FILE_TYPE_DIRECTORY:
+ if ( (pEvalResultCB->DirEnum.FileId.Vnode & 0x1) != 0x1)
+ {
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ if ( ObjectInfo->FileType != AFS_FILE_TYPE_UNKNOWN &&
+ ObjectInfo->FileType != AFS_FILE_TYPE_DIRECTORY)
+ {
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ break;
+
+ case AFS_FILE_TYPE_FILE:
+ if ( (pEvalResultCB->DirEnum.FileId.Vnode & 0x1) != 0x0)
+ {
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ if ( ObjectInfo->FileType != AFS_FILE_TYPE_UNKNOWN &&
+ ObjectInfo->FileType != AFS_FILE_TYPE_FILE)
+ {
+
+ try_return( ntStatus = STATUS_UNSUCCESSFUL);
+ }
+
+ break;
+ }
+
+ //
// Validate the parent data version
//
- if ( pParentInfo != NULL)
+ if ( pParentObjectInfo != NULL)
{
- AFSAcquireExcl( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
- if ( pParentInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ if ( pParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
{
- SetFlag( pParentInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pParentInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- AFSReleaseResource( pParentInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
if( DirEnumEntry != NULL)
{
- pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_2_TAG);
+ pDirEnumCB = (AFSDirEnumEntry *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_2_TAG);
if( pDirEnumCB == NULL)
{
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
if( pEvalResultCB != NULL)
{
AFSEvaluateTargetByName( IN GUID *AuthGroup,
IN AFSObjectInfoCB *ParentObjectInfo,
IN PUNICODE_STRING SourceName,
+ IN ULONG Flags,
OUT AFSDirEnumEntry **DirEnumEntry)
{
// Allocate our response buffer
//
- pEvalResultCB = (AFSFileEvalResultCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_31_TAG);
+ pEvalResultCB = (AFSFileEvalResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_31_TAG);
if( pEvalResultCB == NULL)
{
ulResultBufferLength = PAGE_SIZE;
ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_EVAL_TARGET_BY_NAME,
- AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AFS_REQUEST_FLAG_SYNCHRONOUS | Flags,
AuthGroup,
SourceName,
NULL,
+ ParentObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ParentObjectInfo->VolumeCB->VolumeInformation.CellLength,
&stTargetID,
sizeof( AFSEvalTargetCB),
pEvalResultCB,
if( DirEnumEntry != NULL)
{
- pDirEnumCB = (AFSDirEnumEntry *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_GENERIC_MEMORY_3_TAG);
+ pDirEnumCB = (AFSDirEnumEntry *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_GENERIC_MEMORY_3_TAG);
if( pDirEnumCB == NULL)
{
FileID,
NULL,
0,
+ NULL,
+ 0,
VolumeInformation,
&ulResultLen);
FileID,
NULL,
0,
+ NULL,
+ 0,
VolumeSizeInformation,
&ulResultLen);
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- pIoRequest = (AFSPipeIORequestCB *)AFSExAllocatePoolWithTag( PagedPool,
- sizeof( AFSPipeIORequestCB) +
+ pIoRequest = (AFSPipeIORequestCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ sizeof( AFSPipeIORequestCB) +
InputLength,
- AFS_GENERIC_MEMORY_4_TAG);
+ AFS_GENERIC_MEMORY_4_TAG);
if( pIoRequest == NULL)
{
&Ccb->AuthGroup,
&Ccb->DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
pIoRequest,
sizeof( AFSPipeIORequestCB) + InputLength,
pOutputSystemBuffer,
__Enter
{
- pInfoRequest = (AFSPipeInfoRequestCB *)AFSExAllocatePoolWithTag( PagedPool,
- sizeof( AFSPipeInfoRequestCB) +
+ pInfoRequest = (AFSPipeInfoRequestCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ sizeof( AFSPipeInfoRequestCB) +
InputLength,
- AFS_GENERIC_MEMORY_5_TAG);
+ AFS_GENERIC_MEMORY_5_TAG);
if( pInfoRequest == NULL)
{
&Ccb->AuthGroup,
&Ccb->DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
pInfoRequest,
sizeof( AFSPipeInfoRequestCB) + InputLength,
NULL,
&Ccb->AuthGroup,
&Ccb->DirectoryCB->NameInformation.FileName,
NULL,
+ NULL,
+ 0,
&stInfoRequest,
sizeof( AFSPipeInfoRequestCB),
DataBuffer,
NULL,
0,
NULL,
+ 0,
+ NULL,
NULL);
}
return bRequestQueued;
}
+
+NTSTATUS
+AFSCreateSymlink( IN GUID *AuthGroup,
+ IN AFSObjectInfoCB *ParentObjectInfo,
+ IN UNICODE_STRING *FileName,
+ IN AFSObjectInfoCB *ObjectInfo,
+ IN UNICODE_STRING *TargetName)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSCreateSymlinkCB *pSymlinkCreate = NULL;
+ ULONG ulResultLen = 0;
+ AFSCreateSymlinkResultCB *pSymlinkResult = NULL;
+
+ __Enter
+ {
+
+ //
+ // Allocate our request and result structures
+ //
+
+ pSymlinkCreate = (AFSCreateSymlinkCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ sizeof( AFSCreateSymlinkCB) +
+ TargetName->Length,
+ AFS_SYMLINK_REQUEST_TAG);
+
+ if( pSymlinkCreate == NULL)
+ {
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlZeroMemory( pSymlinkCreate,
+ sizeof( AFSCreateSymlinkCB) +
+ TargetName->Length);
+
+ pSymlinkResult = (AFSCreateSymlinkResultCB *)AFSLibExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_SYMLINK_REQUEST_TAG);
+
+ if( pSymlinkResult == NULL)
+ {
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlZeroMemory( pSymlinkResult,
+ PAGE_SIZE);
+
+ //
+ // Populate the request buffer
+ //
+
+ RtlCopyMemory( &pSymlinkCreate->ParentId,
+ &ObjectInfo->ParentFileId,
+ sizeof( AFSFileID));
+
+ pSymlinkCreate->TargetNameLength = TargetName->Length;
+
+ RtlCopyMemory( pSymlinkCreate->TargetName,
+ TargetName->Buffer,
+ TargetName->Length);
+
+ ulResultLen = PAGE_SIZE;
+
+ //
+ // Call the service to create the symlink entry
+ //
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_CREATE_SYMLINK,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AuthGroup,
+ FileName,
+ &ObjectInfo->FileId,
+ ObjectInfo->VolumeCB->VolumeInformation.Cell,
+ ObjectInfo->VolumeCB->VolumeInformation.CellLength,
+ pSymlinkCreate,
+ sizeof( AFSCreateSymlinkCB) +
+ TargetName->Length,
+ pSymlinkResult,
+ &ulResultLen);
+
+ if ( ntStatus == STATUS_FILE_DELETED )
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCreateSymlink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+
+ SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ClearFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+
+ try_return( ntStatus = STATUS_ACCESS_DENIED);
+ }
+ else if( ntStatus != STATUS_SUCCESS)
+ {
+
+ AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_ERROR,
+ "AFSCreateSymlink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ ObjectInfo->FileId.Cell,
+ ObjectInfo->FileId.Volume,
+ ObjectInfo->FileId.Vnode,
+ ObjectInfo->FileId.Unique,
+ ntStatus));
+
+ try_return( ntStatus);
+ }
+
+ //
+ // After successful creation the open object has been deleted and replaced by
+ // the actual symlink.
+ //
+
+ SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ClearFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+
+ SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+
+try_exit:
+
+ if( pSymlinkCreate != NULL)
+ {
+
+ AFSExFreePoolWithTag( pSymlinkCreate, AFS_SYMLINK_REQUEST_TAG);
+ }
+
+ if( pSymlinkResult != NULL)
+ {
+
+ AFSExFreePoolWithTag( pSymlinkResult, AFS_SYMLINK_REQUEST_TAG);
+ }
+ }
+
+ return ntStatus;
+}