Windows: Replace ParentObjectInformation pointer
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCommSupport.cpp
index 325a562..f8a133a 100644 (file)
@@ -56,6 +56,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
     ULONG   ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
     ULONG ulCRC = 0;
     UNICODE_STRING uniGUID;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
 
     __Enter
     {
@@ -165,6 +166,9 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
 
                     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",
@@ -195,6 +199,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                       ObjectInfoCB->FileId.Vnode,
                                       ObjectInfoCB->FileId.Unique);
                     }
+
+                    AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
                 else
                 {
@@ -298,25 +304,30 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         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;
@@ -328,7 +339,7 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                         // Need to tear down this entry and rebuild it below
                         //
 
-                        if( pDirNode->OpenReferenceCount == 0)
+                        if( pDirNode->DirOpenReferenceCount <= 0)
                         {
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -392,21 +403,26 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 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);
                 }
 
                 //
@@ -421,7 +437,8 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                 // 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;
@@ -467,6 +484,15 @@ AFSEnumerateDirectory( IN GUID *AuthGroup,
                                        (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
@@ -652,7 +678,7 @@ try_exit:
         if( pBuffer != NULL)
         {
 
-            AFSExFreePool( pBuffer);
+            AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
         }
 
         //
@@ -749,6 +775,8 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONGLONG ullIndex = 0;
     UNICODE_STRING uniGUID;
+    LONG lCount;
+    AFSDeviceExt *pDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
 
     __Enter
     {
@@ -850,6 +878,9 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     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",
@@ -865,14 +896,12 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
 
                     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,
@@ -882,6 +911,13 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                       ObjectInfoCB->FileId.Vnode,
                                       ObjectInfoCB->FileId.Unique);
                     }
+                    else
+                    {
+
+                        ObjectInfoCB->DataVersion = pDirEnumResponse->SnapshotDataVersion;
+                    }
+
+                    AFSReleaseResource( ObjectInfoCB->Specific.Directory.DirectoryNodeHdr.TreeLock);
                 }
                 else
                 {
@@ -957,140 +993,164 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                                            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,
@@ -1106,7 +1166,7 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                     // Need to tear down this entry and rebuild it below
                     //
 
-                    if( pDirNode->OpenReferenceCount == 0)
+                    if( pDirNode->DirOpenReferenceCount <= 0)
                     {
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -1179,28 +1239,34 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 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;
@@ -1249,15 +1315,11 @@ AFSVerifyDirectoryContent( IN AFSObjectInfoCB *ObjectInfoCB,
                 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;
                 }
 
                 //
@@ -1459,7 +1521,7 @@ try_exit:
         if( pBuffer != NULL)
         {
 
-            AFSExFreePool( pBuffer);
+            AFSExFreePoolWithTag( pBuffer, AFS_DIR_BUFFER_TAG);
         }
     }
 
@@ -1482,11 +1544,16 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
     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
         //
@@ -1559,6 +1626,8 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         AFSAcquireExcl( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
                         TRUE);
 
+        bReleaseParentTreeLock = TRUE;
+
         if( ParentObjectInfo->DataVersion.QuadPart != pResultCB->ParentDataVersion.QuadPart - 1)
         {
 
@@ -1570,8 +1639,10 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                           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
@@ -1597,19 +1668,8 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                     &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
@@ -1634,7 +1694,7 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                                   pResultCB->DirEnum.FileId.Vnode,
                                   pResultCB->DirEnum.FileId.Unique);
 
-                    if( pDirNode->OpenReferenceCount == 0)
+                    if( pDirNode->DirOpenReferenceCount <= 0)
                     {
 
                         AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
@@ -1690,27 +1750,6 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
             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,
@@ -1736,6 +1775,10 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         if( pDirNode == NULL)
         {
 
+            SetFlag( ParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
+
+            ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
 
@@ -1743,7 +1786,8 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
         // 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;
@@ -1771,6 +1815,34 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
                           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
@@ -1780,10 +1852,31 @@ AFSNotifyFileCreate( IN GUID            *AuthGroup,
 
 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);
         }
     }
 
@@ -1797,7 +1890,6 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSDeviceExt *pDeviceExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
     AFSFileUpdateCB stUpdateCB;
     ULONG ulResultLen = 0;
     AFSFileUpdateResultCB *pUpdateResultCB = NULL;
@@ -1869,14 +1961,23 @@ AFSUpdateFileInformation( IN AFSFileID *ParentFid,
         // 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);
         }
     }
 
@@ -1893,11 +1994,18 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
     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();
 
@@ -1912,7 +2020,7 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                                       ulRequestFlags,
                                       AuthGroup,
                                       &DirectoryCB->NameInformation.FileName,
-                                      &DirectoryCB->ObjectInformation->FileId,
+                                      &pObjectInfo->FileId,
                                       &stDelete,
                                       sizeof( AFSFileDeleteCB),
                                       &stDeleteResult,
@@ -1929,15 +2037,18 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                           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)
         {
 
@@ -1945,12 +2056,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // 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
@@ -1960,12 +2071,12 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
             // 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
             {
@@ -1975,38 +2086,50 @@ AFSNotifyDelete( IN AFSDirectoryCB *DirectoryCB,
                 // 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
     {
@@ -2015,45 +2138,47 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
         // 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)
@@ -2061,7 +2186,7 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
 
             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,
@@ -2075,30 +2200,410 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
         // 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;
+            }
         }
 
         //
@@ -2107,7 +2612,8 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
 
         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;
@@ -2161,6 +2667,14 @@ AFSNotifyRename( IN AFSObjectInfoCB *ObjectInfo,
             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;
@@ -2171,7 +2685,7 @@ try_exit:
         if( pRenameCB != NULL)
         {
 
-            AFSExFreePool( pRenameCB);
+            AFSExFreePoolWithTag( pRenameCB, AFS_RENAME_REQUEST_TAG);
         }
     }
 
@@ -2191,6 +2705,7 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
     AFSFileEvalResultCB *pEvalResultCB = NULL;
     AFSDirEnumEntry *pDirEnumCB = NULL;
     ULONG ulRequestFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
 
     __Enter
     {
@@ -2198,10 +2713,13 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         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;
         }
 
         //
@@ -2251,12 +2769,17 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
             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);
                 }
             }
 
@@ -2267,13 +2790,21 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
         // 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);
         }
 
         //
@@ -2301,10 +2832,16 @@ AFSEvaluateTargetByID( IN AFSObjectInfoCB *ObjectInfo,
 
 try_exit:
 
+        if ( pParentObjectInfo != NULL)
+        {
+
+            AFSReleaseObjectInfo( &pParentObjectInfo);
+        }
+
         if( pEvalResultCB != NULL)
         {
 
-            AFSExFreePool( pEvalResultCB);
+            AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_30_TAG);
         }
 
         if( !NT_SUCCESS( ntStatus))
@@ -2313,7 +2850,7 @@ try_exit:
             if( pDirEnumCB != NULL)
             {
 
-                AFSExFreePool( pDirEnumCB);
+                AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_2_TAG);
             }
 
             *DirEnumEntry = NULL;
@@ -2377,9 +2914,14 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
             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);
@@ -2389,8 +2931,10 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
         // 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);
@@ -2398,6 +2942,8 @@ AFSEvaluateTargetByName( IN GUID *AuthGroup,
             ParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
         }
 
+        AFSReleaseResource( ParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+
         //
         // Pass back the dir enum entry
         //
@@ -2426,7 +2972,7 @@ try_exit:
         if( pEvalResultCB != NULL)
         {
 
-            AFSExFreePool( pEvalResultCB);
+            AFSExFreePoolWithTag( pEvalResultCB, AFS_GENERIC_MEMORY_31_TAG);
         }
 
         if( !NT_SUCCESS( ntStatus))
@@ -2435,7 +2981,7 @@ try_exit:
             if( pDirEnumCB != NULL)
             {
 
-                AFSExFreePool( pDirEnumCB);
+                AFSExFreePoolWithTag( pDirEnumCB, AFS_GENERIC_MEMORY_3_TAG);
             }
 
             *DirEnumEntry = NULL;
@@ -2484,6 +3030,44 @@ try_exit:
 }
 
 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,
@@ -2496,7 +3080,6 @@ AFSNotifyPipeTransceive( IN AFSCcb *Ccb,
     ULONG ulResultLen = 0;
     MDL *pInputMdl = NULL, *pOutputMdl = NULL;
     void *pInputSystemBuffer = NULL, *pOutputSystemBuffer = NULL;
-    ULONG ulBufferLength = OutputLength;
     AFSPipeIORequestCB *pIoRequest = NULL;
 
     __Enter
@@ -2606,7 +3189,7 @@ try_exit:
         if( pIoRequest != NULL)
         {
 
-            AFSExFreePool( pIoRequest);
+            AFSExFreePoolWithTag( pIoRequest, AFS_GENERIC_MEMORY_4_TAG);
         }
     }
 
@@ -2683,7 +3266,7 @@ try_exit:
         if( pInfoRequest != NULL)
         {
 
-            AFSExFreePool( pInfoRequest);
+            AFSExFreePoolWithTag( pInfoRequest, AFS_GENERIC_MEMORY_5_TAG);
         }
     }
 
@@ -2784,7 +3367,6 @@ AFSIsExtentRequestQueued( IN AFSFileID *FileID,
 {
 
     BOOLEAN bRequestQueued = FALSE;
-    NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt    *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
     AFSCommSrvcCB   *pCommSrvc = NULL;
     AFSPoolEntry    *pPoolEntry = NULL;