ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
ULONG ulCRC = 0;
UNICODE_STRING uniGUID;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
__Enter
{
pDirEnumResponse = (AFSDirEnumResp *)pBuffer;
+ AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
AFSDbgLogMsg( 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.Vnode,
ObjectInfoCB->FileId.Unique);
}
+
+ AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
else
{
if( pDirNode->ObjectInformation->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
{
- AFSUpdateMetaData( pDirNode,
- pCurrentDirEntry);
+ LONG lCount;
+ AFSObjectInfoCB *pObjectInfo = pDirNode->ObjectInformation;
- if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
+ //
+ // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
+ //
- AFSDbgLogMsg( 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);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSEnumerateDirectory calling AFSPerformObjectInvalidate Increment count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
- pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
- }
+ AFSPerformObjectInvalidate( pObjectInfo,
+ AFS_INVALIDATE_DATA_VERSION);
+ }
+ else
+ {
+
+ AFSUpdateMetaData( pDirNode,
+ pCurrentDirEntry);
}
continue;
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->OpenReferenceCount == 0)
+ if( pDirNode->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFSUpdateMetaData( pDirNode,
pCurrentDirEntry);
- if( ObjectInfoCB->FileType == AFS_FILE_TYPE_DIRECTORY)
+ if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSEnumerateDirectory Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
&uniDirName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ pDirNode->ObjectInformation->FileId.Cell,
+ pDirNode->ObjectInformation->FileId.Volume,
+ pDirNode->ObjectInformation->FileId.Vnode,
+ pDirNode->ObjectInformation->FileId.Unique);
+
+ AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
- ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+ pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
// Init the short name if we have one
//
- if( pCurrentDirEntry->ShortNameLength > 0)
+ if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pCurrentDirEntry->ShortNameLength > 0)
{
UNICODE_STRING uniShortName;
(12 * sizeof( WCHAR)));
}
}
+ else
+ {
+
+ //
+ // No short name or short names are disabled
+ //
+
+ pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+ }
//
// Insert the node into the name tree
if( pBuffer != NULL)
{
- AFSExFreePool( pBuffer);
+ AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
}
//
AFSObjectInfoCB *pObjectInfo = NULL;
ULONGLONG ullIndex = 0;
UNICODE_STRING uniGUID;
+ LONG lCount;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
__Enter
{
pDirEnumResponse = (AFSDirEnumResp *)pBuffer;
+ AFSAcquireExcl( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
AFSDbgLogMsg( 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",
ntStatus = STATUS_SUCCESS;
- ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
-
if ( pDirEnumResponse->SnapshotDataVersion.QuadPart != pDirEnumResponse->CurrentDataVersion.QuadPart )
{
SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
- pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
ObjectInfoCB->FileId.Vnode,
ObjectInfoCB->FileId.Unique);
}
+ else
+ {
+
+ ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
+ }
+
+ AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
else
{
pCurrentDirEntry->FileNameLength +
pCurrentDirEntry->TargetNameLength);
- if( pDirNode != NULL)
+ if( pDirNode &&
+ AFSIsEqualFID( &pCurrentDirEntry->FileId,
+ &pDirNode->ObjectInformation->FileId))
{
//
- // Check that the FIDs are the same
+ // Found matching directory entry by name and FileID
//
- if( AFSIsEqualFID( &pCurrentDirEntry->FileId,
- &pDirNode->ObjectInformation->FileId))
- {
+ AFSAcquireShared( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
+ TRUE);
+
+ ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
+
+ ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
- AFSAcquireShared( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
- ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
+ if( NT_SUCCESS( ntStatus) &&
+ pObjectInfo != NULL)
+ {
- ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
- ullIndex,
- (AFSBTreeEntry **)&pObjectInfo);
+ //
+ // Indicate this is a valid entry
+ //
- AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
- if( NT_SUCCESS( ntStatus) &&
- pObjectInfo != NULL)
+ if( pCurrentDirEntry->ShortNameLength > 0 &&
+ pDirNode->NameInformation.ShortNameLength > 0)
+ {
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ ObjectInfoCB->FileId.Cell,
+ ObjectInfoCB->FileId.Volume,
+ ObjectInfoCB->FileId.Vnode,
+ ObjectInfoCB->FileId.Unique,
+ pDirNode->NameInformation.ShortName,
+ pCurrentDirEntry->ShortName);
+ }
+ else if( pCurrentDirEntry->ShortNameLength == 0 &&
+ pDirNode->NameInformation.ShortNameLength > 0)
{
- //
- // Indicate this is a valid entry
- //
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ ObjectInfoCB->FileId.Cell,
+ ObjectInfoCB->FileId.Volume,
+ ObjectInfoCB->FileId.Vnode,
+ ObjectInfoCB->FileId.Unique,
+ pDirNode->NameInformation.ShortName);
+ }
+ else if( pCurrentDirEntry->ShortNameLength > 0 &&
+ pDirNode->NameInformation.ShortNameLength == 0)
+ {
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ ObjectInfoCB->FileId.Cell,
+ ObjectInfoCB->FileId.Volume,
+ ObjectInfoCB->FileId.Vnode,
+ ObjectInfoCB->FileId.Unique,
+ pCurrentDirEntry->ShortName);
+ }
+ else
+ {
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ ObjectInfoCB->FileId.Cell,
+ ObjectInfoCB->FileId.Volume,
+ ObjectInfoCB->FileId.Vnode,
+ ObjectInfoCB->FileId.Unique);
+ }
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
+ //
+ // Update the metadata for the entry
+ //
- if( pCurrentDirEntry->ShortNameLength > 0 &&
- pDirNode->NameInformation.ShortNameLength > 0)
- {
- AFSDbgLogMsg( 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,
- &pDirNode->NameInformation.FileName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique,
- pDirNode->NameInformation.ShortName,
- pCurrentDirEntry->ShortName);
- }
- else if( pCurrentDirEntry->ShortNameLength == 0 &&
- pDirNode->NameInformation.ShortNameLength > 0)
- {
- AFSDbgLogMsg( 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,
- &pDirNode->NameInformation.FileName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique,
- pDirNode->NameInformation.ShortName);
- }
- else if( pCurrentDirEntry->ShortNameLength > 0 &&
- pDirNode->NameInformation.ShortNameLength == 0)
- {
- AFSDbgLogMsg( 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,
- &pDirNode->NameInformation.FileName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique,
- pCurrentDirEntry->ShortName);
- }
- else
- {
- AFSDbgLogMsg( 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,
- &pDirNode->NameInformation.FileName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
- }
+ if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
+ {
//
- // Update the metadata for the entry
+ // 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.
//
- if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
- {
-
- AFSUpdateMetaData( pDirNode,
- pCurrentDirEntry);
+ lCount = AFSObjectInfoIncrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- if( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyDirectoryContent calling AFSQueueInvalidateObject Increment count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
- &uniDirName,
- pObjectInfo->FileId.Cell,
- pObjectInfo->FileId.Volume,
- pObjectInfo->FileId.Vnode,
- pObjectInfo->FileId.Unique);
+ if ( !NT_SUCCESS( AFSQueueInvalidateObject( pObjectInfo,
+ AFS_INVALIDATE_DATA_VERSION)))
+ {
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ lCount = AFSObjectInfoDecrement( pObjectInfo,
+ AFS_OBJECT_REFERENCE_INVALIDATION);
- pObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
+ AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSVerifyDirectoryContent AFSQueueInvalidateObject failed Decrement count on object %p Cnt %d\n",
+ pObjectInfo,
+ lCount);
}
+ }
+ else
+ {
- //
- // Next dir entry
- //
+ AFSUpdateMetaData( pDirNode,
+ pCurrentDirEntry);
+ }
- pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
+ //
+ // Next dir entry
+ //
- if( ulResultLen >= ulEntryLength)
- {
- ulResultLen -= ulEntryLength;
- }
- else
- {
- ulResultLen = 0;
- }
+ pCurrentDirEntry = (AFSDirEnumEntry *)((char *)pCurrentDirEntry + ulEntryLength);
- continue;
+ if( ulResultLen >= ulEntryLength)
+ {
+ ulResultLen -= ulEntryLength;
}
+ else
+ {
+ ulResultLen = 0;
+ }
+
+ continue;
}
+ }
+ else if ( pDirNode)
+ {
+
+ //
+ // File name matches but FileID does not.
+ //
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
// Need to tear down this entry and rebuild it below
//
- if( pDirNode->OpenReferenceCount == 0)
+ if( pDirNode->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFSUpdateMetaData( pDirNode,
pCurrentDirEntry);
- if( ObjectInfoCB->FileType == AFS_FILE_TYPE_DIRECTORY)
+ if( pDirNode->ObjectInformation->FileType == AFS_FILE_TYPE_DIRECTORY)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
"AFSVerifyDirectoryContent Setting VERIFY on entry %wZ for FID %08lX-%08lX-%08lX-%08lX\n",
&uniDirName,
- ObjectInfoCB->FileId.Cell,
- ObjectInfoCB->FileId.Volume,
- ObjectInfoCB->FileId.Vnode,
- ObjectInfoCB->FileId.Unique);
+ pDirNode->ObjectInformation->FileId.Cell,
+ pDirNode->ObjectInformation->FileId.Volume,
+ pDirNode->ObjectInformation->FileId.Vnode,
+ pDirNode->ObjectInformation->FileId.Unique);
+
+ AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
- SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
- ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+ AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
// Init the short name if we have one
//
- if( pCurrentDirEntry->ShortNameLength > 0)
+ if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pCurrentDirEntry->ShortNameLength > 0)
{
UNICODE_STRING uniShortName;
else
{
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSVerifyDirectoryContent NO short name for DE %p for %wZ FID %08lX-%08lX-%08lX-%08lX\n",
- pDirNode,
- &pDirNode->NameInformation.FileName,
- pCurrentDirEntry->FileId.Cell,
- pCurrentDirEntry->FileId.Volume,
- pCurrentDirEntry->FileId.Vnode,
- pCurrentDirEntry->FileId.Unique);
+ //
+ // No short name or short names have been disabled
+ //
+
+ pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
}
//
if( pBuffer != NULL)
{
- AFSExFreePool( pBuffer);
+ AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
}
}
UNICODE_STRING uniTargetName;
AFSDirectoryCB *pDirNode = NULL;
ULONG ulCRC = 0;
+ LONG lCount;
LARGE_INTEGER liOldDataVersion;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+ BOOLEAN bReleaseParentTreeLock = FALSE;
__Enter
{
+ *DirNode = NULL;
+
//
// Init the control block for the request
//
AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
TRUE);
+ bReleaseParentTreeLock = TRUE;
+
if( ParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
{
ParentObjectInfo->FileId.Volume,
ParentObjectInfo->FileId.Vnode,
ParentObjectInfo->FileId.Unique,
- ParentObjectInfo->DataVersion.QuadPart,
- pResultCB->ParentDataVersion.QuadPart);
+ ParentObjectInfo->DataVersion.HighPart,
+ ParentObjectInfo->DataVersion.LowPart,
+ pResultCB->ParentDataVersion.HighPart,
+ pResultCB->ParentDataVersion.LowPart);
//
// We raced so go and lookup the directory entry in the parent
&pResultCB->DirEnum.FileId))
{
- InterlockedIncrement( &pDirNode->OpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
- &pDirNode->NameInformation.FileName,
- pDirNode,
- pDirNode->OpenReferenceCount);
-
*DirNode = pDirNode;
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
try_return( ntStatus = STATUS_REPARSE);
}
else
pResultCB->DirEnum.FileId.Vnode,
pResultCB->DirEnum.FileId.Unique);
- if( pDirNode->OpenReferenceCount == 0)
+ if( pDirNode->DirOpenReferenceCount <= 0)
{
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- else
- {
-
- //
- // Update the parent data version
- //
-
- ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
- FileName,
- ParentObjectInfo->FileId.Cell,
- ParentObjectInfo->FileId.Volume,
- ParentObjectInfo->FileId.Vnode,
- ParentObjectInfo->FileId.Unique,
- ParentObjectInfo->DataVersion.QuadPart);
- }
-
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_VERBOSE,
if( pDirNode == NULL)
{
+ SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
// Init the short name if we have one
//
- if( pResultCB->DirEnum.ShortNameLength > 0)
+ if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pResultCB->DirEnum.ShortNameLength > 0)
{
UNICODE_STRING uniShortName;
pDirNode,
&pDirNode->NameInformation.FileName);
}
+ else
+ {
+ //
+ // No short name or short names are disabled
+ //
+
+ pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+ }
+
+ if ( !BooleanFlagOn( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ //
+ // Update the parent data version
+ //
+
+ ParentObjectInfo->DataVersion = pResultCB->ParentDataVersion;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyFileCreate entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
+ FileName,
+ ParentObjectInfo->FileId.Cell,
+ ParentObjectInfo->FileId.Volume,
+ ParentObjectInfo->FileId.Vnode,
+ ParentObjectInfo->FileId.Unique,
+ ParentObjectInfo->DataVersion.QuadPart);
+ }
//
// Return the directory node
try_exit:
+ if ( *DirNode != NULL)
+ {
+
+ lCount = InterlockedIncrement( &(*DirNode)->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
+ &(*DirNode)->NameInformation.FileName,
+ *DirNode,
+ lCount);
+
+ ASSERT( lCount >= 0);
+ }
+
+ if ( bReleaseParentTreeLock)
+ {
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
+
if( pResultCB != NULL)
{
- AFSExFreePool( pResultCB);
+ AFSExFreePoolWithTag( pResultCB, AFS_GENERIC_MEMORY_1_TAG);
}
}
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
AFSFileUpdateCB stUpdateCB;
ULONG ulResultLen = 0;
AFSFileUpdateResultCB *pUpdateResultCB = NULL;
// Update the data version
//
- ObjectInfo->DataVersion = pUpdateResultCB->DirEnum.DataVersion;
+ AFSAcquireExcl( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ if ( !BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ ObjectInfo->DataVersion = pUpdateResultCB->DirEnum.DataVersion;
+ }
+
+ AFSReleaseResource( ObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
try_exit:
if( pUpdateResultCB != NULL)
{
- AFSExFreePool( pUpdateResultCB);
+ AFSExFreePoolWithTag( pUpdateResultCB, AFS_UPDATE_RESULT_TAG);
}
}
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);
+
+ stDelete.ParentId = pObjectInfo->ParentFileId;
stDelete.ProcessId = (ULONGLONG)PsGetCurrentProcessId();
ulRequestFlags,
AuthGroup,
&DirectoryCB->NameInformation.FileName,
- &DirectoryCB->ObjectInformation->FileId,
+ &pObjectInfo->FileId,
&stDelete,
sizeof( AFSFileDeleteCB),
&stDeleteResult,
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,
+ pObjectInfo->FileId.Cell,
+ pObjectInfo->FileId.Volume,
+ pObjectInfo->FileId.Vnode,
+ pObjectInfo->FileId.Unique,
ntStatus);
try_return( ntStatus);
}
+ 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->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->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( pObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
try_exit:
- NOTHING;
+ if ( pParentObjectInfo)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
}
return ntStatus;
}
+
NTSTATUS
-AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
- IN GUID *AuthGroup,
- IN AFSObjectInfoCB *ParentObjectInfo,
- IN AFSObjectInfoCB *TargetParentObjectInfo,
- IN AFSDirectoryCB *DirectoryCB,
- IN UNICODE_STRING *TargetName,
- OUT AFSFileID *UpdatedFID)
+AFSNotifyHardLink( IN AFSObjectInfoCB *ObjectInfo,
+ IN GUID *AuthGroup,
+ IN AFSObjectInfoCB *ParentObjectInfo,
+ IN AFSObjectInfoCB *TargetParentObjectInfo,
+ IN AFSDirectoryCB *SourceDirectoryCB,
+ IN UNICODE_STRING *TargetName,
+ IN BOOLEAN bReplaceIfExists,
+ OUT AFSDirectoryCB **TargetDirectoryCB)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
- AFSFileRenameCB *pRenameCB = NULL;
- AFSFileRenameResultCB *pRenameResultCB = NULL;
+ AFSFileHardLinkCB *pHardLinkCB = NULL;
+ AFSFileHardLinkResultCB *pResultCB = NULL;
ULONG ulResultLen = 0;
+ AFSDirectoryCB *pDirNode = NULL;
+ ULONG ulCRC = 0;
+ BOOLEAN bReleaseParentLock = FALSE, bReleaseTargetParentLock = FALSE;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+ LONG lCount;
__Enter
{
// Init the control block for the request
//
- pRenameCB = (AFSFileRenameCB *)AFSExAllocatePoolWithTag( PagedPool,
- PAGE_SIZE,
- AFS_RENAME_REQUEST_TAG);
+ pHardLinkCB = (AFSFileHardLinkCB *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_HARDLINK_REQUEST_TAG);
- if( pRenameCB == NULL)
+ if( pHardLinkCB == NULL)
{
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
- RtlZeroMemory( pRenameCB,
+ RtlZeroMemory( pHardLinkCB,
PAGE_SIZE);
- pRenameCB->SourceParentId = ParentObjectInfo->FileId;
+ pHardLinkCB->SourceParentId = ParentObjectInfo->FileId;
- pRenameCB->TargetParentId = TargetParentObjectInfo->FileId;
+ pHardLinkCB->TargetParentId = TargetParentObjectInfo->FileId;
- pRenameCB->TargetNameLength = TargetName->Length;
+ pHardLinkCB->TargetNameLength = TargetName->Length;
- RtlCopyMemory( pRenameCB->TargetName,
+ RtlCopyMemory( pHardLinkCB->TargetName,
TargetName->Buffer,
TargetName->Length);
+ pHardLinkCB->bReplaceIfExists = bReplaceIfExists;
+
//
// Use the same buffer for the result control block
//
- pRenameResultCB = (AFSFileRenameResultCB *)pRenameCB;
+ pResultCB = (AFSFileHardLinkResultCB *)pHardLinkCB;
ulResultLen = PAGE_SIZE;
- ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RENAME_FILE,
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_HARDLINK_FILE,
AFS_REQUEST_FLAG_SYNCHRONOUS,
AuthGroup,
- &DirectoryCB->NameInformation.FileName,
+ &SourceDirectoryCB->NameInformation.FileName,
&ObjectInfo->FileId,
- pRenameCB,
- sizeof( AFSFileRenameCB) + TargetName->Length,
- pRenameResultCB,
+ pHardLinkCB,
+ sizeof( AFSFileHardLinkCB) + TargetName->Length,
+ pResultCB,
&ulResultLen);
if( ntStatus != STATUS_SUCCESS)
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNotifyRename failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ "AFSNotifyHardLink failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
ObjectInfo->FileId.Cell,
ObjectInfo->FileId.Volume,
ObjectInfo->FileId.Vnode,
// Update the information from the returned data
//
- if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
+ if ( ParentObjectInfo != TargetParentObjectInfo)
{
- ParentObjectInfo->DataVersion = pRenameResultCB->SourceParentDataVersion;
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ bReleaseParentLock = TRUE;
+
+ if ( ParentObjectInfo->DataVersion.QuadPart == pResultCB->SourceParentDataVersion.QuadPart - 1)
+ {
+
+ ParentObjectInfo->DataVersion = pResultCB->SourceParentDataVersion;
+ }
+ else
+ {
+
+ SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+ }
+
+ AFSAcquireExcl( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ bReleaseTargetParentLock = TRUE;
+
+ if ( TargetParentObjectInfo->DataVersion.QuadPart == pResultCB->TargetParentDataVersion.QuadPart - 1)
+ {
+
+ TargetParentObjectInfo->DataVersion = pResultCB->TargetParentDataVersion;
}
else
{
- SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSDbgLogMsg( 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->FileId.Cell,
+ TargetParentObjectInfo->FileId.Volume,
+ TargetParentObjectInfo->FileId.Vnode,
+ TargetParentObjectInfo->FileId.Unique,
+ TargetParentObjectInfo->DataVersion.HighPart,
+ TargetParentObjectInfo->DataVersion.LowPart,
+ pResultCB->TargetParentDataVersion.HighPart,
+ pResultCB->TargetParentDataVersion.LowPart);
- ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ //
+ // We raced so go and lookup the directory entry in the parent
+ //
+
+ ulCRC = AFSGenerateCRC( TargetName,
+ FALSE);
+
+ AFSLocateCaseSensitiveDirEntry( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.CaseSensitiveTreeHead,
+ ulCRC,
+ &pDirNode);
+
+ if( pDirNode != NULL)
+ {
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyHardLink Located dir entry %p for file %wZ\n",
+ pDirNode,
+ TargetName);
+
+ if ( AFSIsEqualFID( &pDirNode->ObjectInformation->FileId,
+ &pResultCB->DirEnum.FileId))
+ {
+
+ try_return( ntStatus = STATUS_REPARSE);
+ }
+ else
+ {
+
+ //
+ // We found an entry that matches the desired name but it is not the
+ // same as the one that was created for us by the file server.
+ //
+
+ AFSDbgLogMsg( 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,
+ pDirNode,
+ pDirNode->ObjectInformation->FileId.Cell,
+ pDirNode->ObjectInformation->FileId.Volume,
+ pDirNode->ObjectInformation->FileId.Vnode,
+ pDirNode->ObjectInformation->FileId.Unique,
+ pResultCB->DirEnum.FileId.Cell,
+ pResultCB->DirEnum.FileId.Volume,
+ pResultCB->DirEnum.FileId.Vnode,
+ pResultCB->DirEnum.FileId.Unique);
+
+ if( pDirNode->DirOpenReferenceCount <= 0)
+ {
+
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ pDirNode->ObjectInformation->FileId.Cell,
+ pDirNode->ObjectInformation->FileId.Volume,
+ pDirNode->ObjectInformation->FileId.Vnode,
+ pDirNode->ObjectInformation->FileId.Unique,
+ pResultCB->DirEnum.FileId.Cell,
+ pResultCB->DirEnum.FileId.Volume,
+ pResultCB->DirEnum.FileId.Vnode,
+ pResultCB->DirEnum.FileId.Unique);
+
+ AFSDeleteDirEntry( TargetParentObjectInfo,
+ pDirNode);
+ }
+ else
+ {
+
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_DELETED);
+
+ AFSDbgLogMsg( 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,
+ &pDirNode->NameInformation.FileName,
+ pDirNode->ObjectInformation->FileId.Cell,
+ pDirNode->ObjectInformation->FileId.Volume,
+ pDirNode->ObjectInformation->FileId.Vnode,
+ pDirNode->ObjectInformation->FileId.Unique,
+ pResultCB->DirEnum.FileId.Cell,
+ pResultCB->DirEnum.FileId.Volume,
+ pResultCB->DirEnum.FileId.Vnode,
+ pResultCB->DirEnum.FileId.Unique);
+
+ AFSRemoveNameEntry( TargetParentObjectInfo,
+ pDirNode);
+ }
+
+ pDirNode = NULL;
+ }
+ }
+
+ //
+ // We are unsure of our current data so set the verify flag. It may already be set
+ // but no big deal to reset it
+ //
+
+ SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+ //
+ // Create the hard link entry
+ //
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyHardLink Creating new entry %wZ\n",
+ TargetName);
+
+ //
+ // Initialize the directory entry
+ //
+
+ pDirNode = AFSInitDirEntry( TargetParentObjectInfo,
+ TargetName,
+ NULL,
+ &pResultCB->DirEnum,
+ (ULONG)InterlockedIncrement( &TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.ContentIndex));
+
+ if( pDirNode == NULL)
+ {
+
+ SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ //
+ // Init the short name if we have one
+ //
+
+ if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ pResultCB->DirEnum.ShortNameLength > 0)
{
- TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+ UNICODE_STRING uniShortName;
+
+ pDirNode->NameInformation.ShortNameLength = pResultCB->DirEnum.ShortNameLength;
+
+ RtlCopyMemory( pDirNode->NameInformation.ShortName,
+ pResultCB->DirEnum.ShortName,
+ pDirNode->NameInformation.ShortNameLength);
+
+ //
+ // Generate the short name index
+ //
+
+ uniShortName.Length = pDirNode->NameInformation.ShortNameLength;
+ uniShortName.Buffer = pDirNode->NameInformation.ShortName;
+
+ pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = AFSGenerateCRC( &uniShortName,
+ TRUE);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyHardLink Initialized short name %wZ for DE %p for %wZ\n",
+ &uniShortName,
+ pDirNode,
+ &pDirNode->NameInformation.FileName);
}
else
{
+ //
+ // No short name or short names are disabled
+ //
- SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ pDirNode->Type.Data.ShortNameTreeEntry.HashIndex = 0;
+ }
- TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ if ( !BooleanFlagOn( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY))
+ {
+
+ //
+ // Update the target parent data version
+ //
+
+ TargetParentObjectInfo->DataVersion = pResultCB->TargetParentDataVersion;
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyHardLink entry %wZ ParentFID %08lX-%08lX-%08lX-%08lX Version %08lX:%08lX\n",
+ TargetName,
+ TargetParentObjectInfo->FileId.Cell,
+ TargetParentObjectInfo->FileId.Volume,
+ TargetParentObjectInfo->FileId.Vnode,
+ TargetParentObjectInfo->FileId.Unique,
+ TargetParentObjectInfo->DataVersion.QuadPart);
+ }
+
+try_exit:
+
+ if ( TargetDirectoryCB != NULL)
+ {
+
+ lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
+
+ AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+ AFS_TRACE_LEVEL_VERBOSE,
+ "AFSNotifyHardLink Increment count on %wZ DE %p Cnt %d\n",
+ &pDirNode->NameInformation.FileName,
+ pDirNode,
+ lCount);
+
+ ASSERT( lCount >= 0);
+
+ *TargetDirectoryCB = pDirNode;
+ }
+
+ if ( bReleaseTargetParentLock)
+ {
+
+ AFSReleaseResource( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
+
+ if ( bReleaseParentLock)
+ {
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
+
+ if( pHardLinkCB != NULL)
+ {
+
+ AFSExFreePoolWithTag( pHardLinkCB, AFS_HARDLINK_REQUEST_TAG);
+ }
+ }
+
+ return ntStatus;
+}
+
+
+
+NTSTATUS
+AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
+ IN GUID *AuthGroup,
+ IN AFSObjectInfoCB *ParentObjectInfo,
+ IN AFSObjectInfoCB *TargetParentObjectInfo,
+ IN AFSDirectoryCB *DirectoryCB,
+ IN UNICODE_STRING *TargetName,
+ OUT AFSFileID *UpdatedFID)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ AFSFileRenameCB *pRenameCB = NULL;
+ AFSFileRenameResultCB *pRenameResultCB = NULL;
+ ULONG ulResultLen = 0;
+ AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
+
+ __Enter
+ {
+
+ //
+ // Init the control block for the request
+ //
+
+ pRenameCB = (AFSFileRenameCB *)AFSExAllocatePoolWithTag( PagedPool,
+ PAGE_SIZE,
+ AFS_RENAME_REQUEST_TAG);
+
+ if( pRenameCB == NULL)
+ {
+
+ try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ RtlZeroMemory( pRenameCB,
+ PAGE_SIZE);
+
+ pRenameCB->SourceParentId = ParentObjectInfo->FileId;
+
+ pRenameCB->TargetParentId = TargetParentObjectInfo->FileId;
+
+ pRenameCB->TargetNameLength = TargetName->Length;
+
+ RtlCopyMemory( pRenameCB->TargetName,
+ TargetName->Buffer,
+ TargetName->Length);
+
+ //
+ // Use the same buffer for the result control block
+ //
+
+ pRenameResultCB = (AFSFileRenameResultCB *)pRenameCB;
+
+ ulResultLen = PAGE_SIZE;
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_RENAME_FILE,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AuthGroup,
+ &DirectoryCB->NameInformation.FileName,
+ &ObjectInfo->FileId,
+ pRenameCB,
+ sizeof( AFSFileRenameCB) + TargetName->Length,
+ pRenameResultCB,
+ &ulResultLen);
+
+ if( ntStatus != STATUS_SUCCESS)
+ {
+
+ AFSDbgLogMsg( 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);
+
+ try_return( ntStatus);
+ }
+
+ //
+ // Update the information from the returned data
+ //
+
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
+ {
+
+ ParentObjectInfo->DataVersion = pRenameResultCB->SourceParentDataVersion;
+ }
+ else
+ {
+
+ SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+
+ if ( ParentObjectInfo != TargetParentObjectInfo)
+ {
+
+ AFSAcquireExcl( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+ {
+
+ TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+ }
+ else
+ {
+
+ SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
}
//
DirectoryCB->NameInformation.ShortNameLength = pRenameResultCB->DirEnum.ShortNameLength;
- if( DirectoryCB->NameInformation.ShortNameLength > 0)
+ if( !BooleanFlagOn( pDevExt->DeviceFlags, AFS_DEVICE_FLAG_DISABLE_SHORTNAMES) &&
+ DirectoryCB->NameInformation.ShortNameLength > 0)
{
UNICODE_STRING uniShortName;
DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
}
+ if ( ParentObjectInfo != TargetParentObjectInfo)
+ {
+
+ AFSReleaseResource( TargetParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+ }
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
if( UpdatedFID != NULL)
{
*UpdatedFID = pRenameResultCB->DirEnum.FileId;
if( pRenameCB != NULL)
{
- AFSExFreePool( pRenameCB);
+ AFSExFreePoolWithTag( pRenameCB, AFS_RENAME_REQUEST_TAG);
}
}
AFSFileEvalResultCB *pEvalResultCB = NULL;
AFSDirEnumEntry *pDirEnumCB = NULL;
ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+ AFSObjectInfoCB *pParentObjectInfo = NULL;
__Enter
{
RtlZeroMemory( &stTargetID,
sizeof( AFSEvalTargetCB));
- if( ObjectInfo->ParentObjectInformation != NULL)
+ if ( BooleanFlagOn( ObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
{
- stTargetID.ParentId = ObjectInfo->ParentObjectInformation->FileId;
+ pParentObjectInfo = AFSFindObjectInfo( ObjectInfo->VolumeCB,
+ &ObjectInfo->ParentFileId);
+
+ stTargetID.ParentId = ObjectInfo->ParentFileId;
}
//
if( ntStatus == STATUS_OBJECT_PATH_INVALID)
{
- if( ObjectInfo->ParentObjectInformation != NULL)
+ if( pParentObjectInfo != NULL)
{
- SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
}
// Validate the parent data version
//
- if ( ObjectInfo->ParentObjectInformation != NULL &&
- ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ if ( pParentObjectInfo != NULL)
{
- SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ if ( pParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ {
+
+ SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
- ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
try_exit:
+ if ( pParentObjectInfo != NULL)
+ {
+
+ AFSReleaseObjectInfo( &pParentObjectInfo);
+ }
+
if( pEvalResultCB != NULL)
{
- AFSExFreePool( pEvalResultCB);
+ AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_30_TAG);
}
if( !NT_SUCCESS( ntStatus))
if( pDirEnumCB != NULL)
{
- AFSExFreePool( pDirEnumCB);
+ AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_2_TAG);
}
*DirEnumEntry = NULL;
if( ntStatus == STATUS_OBJECT_PATH_INVALID)
{
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
try_return( ntStatus);
// Validate the parent data version
//
- if ( ParentObjectInfo != NULL &&
- ParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
+ if ( ParentObjectInfo->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
{
SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
//
// Pass back the dir enum entry
//
if( pEvalResultCB != NULL)
{
- AFSExFreePool( pEvalResultCB);
+ AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_31_TAG);
}
if( !NT_SUCCESS( ntStatus))
if( pDirEnumCB != NULL)
{
- AFSExFreePool( pDirEnumCB);
+ AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_3_TAG);
}
*DirEnumEntry = NULL;
}
NTSTATUS
+AFSRetrieveVolumeSizeInformation( IN GUID *AuthGroup,
+ IN AFSFileID *FileID,
+ OUT AFSVolumeSizeInfoCB *VolumeSizeInformation)
+{
+
+ NTSTATUS ntStatus = STATUS_SUCCESS;
+ ULONG ulResultLen = 0;
+
+ __Enter
+ {
+
+ ulResultLen = sizeof( AFSVolumeSizeInfoCB);
+
+ ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_GET_VOLUME_SIZE_INFO,
+ AFS_REQUEST_FLAG_SYNCHRONOUS,
+ AuthGroup,
+ NULL,
+ FileID,
+ NULL,
+ 0,
+ VolumeSizeInformation,
+ &ulResultLen);
+
+ if( ntStatus != STATUS_SUCCESS)
+ {
+
+ try_return( ntStatus);
+ }
+
+try_exit:
+
+ NOTHING;
+ }
+
+ return ntStatus;
+}
+
+NTSTATUS
AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
IN ULONG InputLength,
IN ULONG OutputLength,
ULONG ulResultLen = 0;
MDL *pInputMdl = NULL, *pOutputMdl = NULL;
void *pInputSystemBuffer = NULL, *pOutputSystemBuffer = NULL;
- ULONG ulBufferLength = OutputLength;
AFSPipeIORequestCB *pIoRequest = NULL;
__Enter
if( pIoRequest != NULL)
{
- AFSExFreePool( pIoRequest);
+ AFSExFreePoolWithTag( pIoRequest, AFS_GENERIC_MEMORY_4_TAG);
}
}
if( pInfoRequest != NULL)
{
- AFSExFreePool( pInfoRequest);
+ AFSExFreePoolWithTag( pInfoRequest, AFS_GENERIC_MEMORY_5_TAG);
}
}
{
BOOLEAN bRequestQueued = FALSE;
- NTSTATUS ntStatus = STATUS_SUCCESS;
AFSDeviceExt *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
AFSCommSrvcCB *pCommSrvc = NULL;
AFSPoolEntry *pPoolEntry = NULL;