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)
{
&pResultCB->DirEnum.FileId))
{
- lCount = InterlockedIncrement( &pDirNode->DirOpenReferenceCount);
-
- AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
- AFS_TRACE_LEVEL_VERBOSE,
- "AFSNotifyFileCreate Increment count on %wZ DE %p Cnt %d\n",
- &pDirNode->NameInformation.FileName,
- pDirNode,
- lCount);
-
- ASSERT( lCount >= 0);
-
*DirNode = pDirNode;
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
try_return( ntStatus = STATUS_REPARSE);
}
else
ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
}
ParentObjectInfo->DataVersion.QuadPart);
}
- AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
-
//
// 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)
{