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)
- {
+ lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
- 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);
+ AFSInvalidateObject( &pObjectInfo,
+ AFS_INVALIDATE_DATA_VERSION);
- SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ if( pObjectInfo != NULL)
+ {
- pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
}
}
+ else
+ {
+
+ AFSUpdateMetaData( pDirNode,
+ pCurrentDirEntry);
+ }
continue;
}
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);
- SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+ SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
AFSObjectInfoCB *pObjectInfo = NULL;
ULONGLONG ullIndex = 0;
UNICODE_STRING uniGUID;
+ LONG lCount;
__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);
- AFSAcquireShared( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock,
- TRUE);
+ ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
- ullIndex = AFSCreateLowIndex( &pCurrentDirEntry->FileId);
+ ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
+ ullIndex,
+ (AFSBTreeEntry **)&pObjectInfo);
- ntStatus = AFSLocateHashEntry( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeHead,
- ullIndex,
- (AFSBTreeEntry **)&pObjectInfo);
+ AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
- AFSReleaseResource( ObjectInfoCB->VolumeCB->ObjectInfoTree.TreeLock);
-
- if( NT_SUCCESS( ntStatus) &&
- pObjectInfo != NULL)
- {
+ if( NT_SUCCESS( ntStatus) &&
+ pObjectInfo != NULL)
+ {
- //
- // Indicate this is a valid entry
- //
+ //
+ // Indicate this is a valid entry
+ //
- SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
+ SetFlag( pDirNode->Flags, AFS_DIR_ENTRY_VALID);
- 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( 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)
+ {
- //
- // Update the metadata for the 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);
+ }
- if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
- {
+ //
+ // Update the metadata for the entry
+ //
- AFSUpdateMetaData( pDirNode,
- pCurrentDirEntry);
+ if( pObjectInfo->DataVersion.QuadPart != pCurrentDirEntry->DataVersion.QuadPart)
+ {
- if( pObjectInfo->FileType == AFS_FILE_TYPE_DIRECTORY)
- {
+ lCount = InterlockedIncrement( &pObjectInfo->ObjectReferenceCount);
- 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);
+ AFSInvalidateObject( &pObjectInfo,
+ AFS_INVALIDATE_DATA_VERSION);
- SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ if( pObjectInfo != NULL)
+ {
- pObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- }
+ lCount = InterlockedDecrement( &pObjectInfo->ObjectReferenceCount);
}
+ }
+ 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,
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);
- SetFlag( ObjectInfoCB->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- ObjectInfoCB->DataVersion.QuadPart = (ULONGLONG)-1;
+ SetFlag( pDirNode->ObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ pDirNode->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ AFSReleaseResource( pDirNode->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
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;
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
&pDirNode->NameInformation.FileName);
}
+ 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);
+ }
+
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
//
// Return the directory node
//
// 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:
AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
AFS_TRACE_LEVEL_ERROR,
- "AFSNotifyDelete failed FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
- &DirectoryCB->ObjectInformation->FileId.Cell,
- &DirectoryCB->ObjectInformation->FileId.Volume,
- &DirectoryCB->ObjectInformation->FileId.Vnode,
- &DirectoryCB->ObjectInformation->FileId.Unique,
+ "AFSNotifyDelete failed ParentFID %08lX-%08lX-%08lX-%08lX %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+ stDelete.ParentId.Cell,
+ stDelete.ParentId.Volume,
+ 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);
try_return( ntStatus);
}
+ AFSAcquireExcl( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
if( CheckOnly)
{
SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
}
}
else
SetFlag( DirectoryCB->ObjectInformation->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
- DirectoryCB->ObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
}
else
{
DirectoryCB->ObjectInformation->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
}
-
}
+ AFSReleaseResource( DirectoryCB->ObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
try_exit:
NOTHING;
// Update the information from the returned data
//
+ AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
if ( ParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->SourceParentDataVersion.QuadPart - 1)
{
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
}
- if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+ if ( ParentObjectInfo != TargetParentObjectInfo)
{
- TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
- }
- else
- {
+ if ( TargetParentObjectInfo->DataVersion.QuadPart == pRenameResultCB->TargetParentDataVersion.QuadPart - 1)
+ {
+
+ TargetParentObjectInfo->DataVersion = pRenameResultCB->TargetParentDataVersion;
+ }
+ else
+ {
- SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ SetFlag( TargetParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
- TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ TargetParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
}
//
DirectoryCB->Type.Data.ShortNameTreeEntry.HashIndex = 0;
}
+ AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
if( UpdatedFID != NULL)
{
*UpdatedFID = pRenameResultCB->DirEnum.FileId;
if( ObjectInfo->ParentObjectInformation != NULL)
{
+ AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
+
SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+
+ AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
}
// Validate the parent data version
//
- if ( ObjectInfo->ParentObjectInformation != NULL &&
- ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ if ( ObjectInfo->ParentObjectInformation != NULL)
{
- SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+ AFSAcquireExcl( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
+ TRUE);
- ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ if ( ObjectInfo->ParentObjectInformation->DataVersion.QuadPart != pEvalResultCB->ParentDataVersion.QuadPart)
+ {
+
+ SetFlag( ObjectInfo->ParentObjectInformation->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+ ObjectInfo->ParentObjectInformation->DataVersion.QuadPart = (ULONGLONG)-1;
+ }
+
+ AFSReleaseResource( ObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
}
//
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
//