Windows: Deny writes/truncation to files w RO attr
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCreate.cpp
index e07d8ce..5055482 100644 (file)
@@ -56,7 +56,7 @@ NTSTATUS
 AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
            IN PIRP Irp)
 {
-
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     IO_STACK_LOCATION  *pIrpSp;
     FILE_OBJECT        *pFileObject = NULL;
@@ -71,10 +71,10 @@ AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
             pFileObject->FileName.Buffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCreate (%08lX) Processing control device open request\n",
-                          Irp);
+                          "AFSCreate (%p) Processing control device open request\n",
+                          Irp));
 
             ntStatus = AFSControlDeviceCreate( Irp);
 
@@ -84,10 +84,10 @@ AFSCreate( IN PDEVICE_OBJECT LibDeviceObject,
         if( AFSRDRDeviceObject == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCreate (%08lX) Invalid request to open before library is initialized\n",
-                          Irp);
+                          "AFSCreate (%p) Invalid request to open before library is initialized\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_DEVICE_NOT_READY);
         }
@@ -99,14 +99,16 @@ try_exit:
 
         NOTHING;
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "EXCEPTION - AFSCreate\n");
+                      "EXCEPTION - AFSCreate\n"));
 
         ntStatus = STATUS_ACCESS_DENIED;
+
+        AFSDumpTraceFilesFnc();
     }
 
     //
@@ -136,16 +138,22 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
     AFSDeviceExt       *pDeviceExt = NULL;
     BOOLEAN             bOpenTargetDirectory = FALSE, bReleaseVolume = FALSE;
     PACCESS_MASK        pDesiredAccess = NULL;
-    UNICODE_STRING      uniComponentName, uniPathName, uniRootFileName, uniParsedFileName;
+    UNICODE_STRING      uniComponentName, uniRootFileName, uniParsedFileName;
     UNICODE_STRING      uniSubstitutedPathName;
     UNICODE_STRING      uniRelativeName;
     AFSNameArrayHdr    *pNameArray = NULL;
     AFSVolumeCB        *pVolumeCB = NULL;
+    LONG                VolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+    AFSVolumeCB        *pNewVolumeCB = NULL;
+    LONG                NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
     AFSDirectoryCB     *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
+    AFSDirectoryCB     *pNewParentDirectoryCB = NULL;
+    BOOLEAN             bReleaseParentDir = FALSE, bReleaseDir = FALSE;
     ULONG               ulParseFlags = 0;
-    GUID                stAuthGroup;
+    GUID                stAuthGroup = {0};
     ULONG               ulNameProcessingFlags = 0;
     BOOLEAN             bOpenedReparsePoint = FALSE;
+    LONG                lCount;
 
     __Enter
     {
@@ -186,6 +194,21 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                  (ULONGLONG)PsGetCurrentThreadId(),
                                   &stAuthGroup);
 
+        //
+        // If we are in shutdown mode then fail the request
+        //
+
+        if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_WARNING,
+                          "AFSCommonCreate (%p) Open request after shutdown\n",
+                          Irp));
+
+            try_return( ntStatus = STATUS_TOO_LATE);
+        }
+
         if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
         {
 
@@ -194,31 +217,16 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to enumerate global root Status %08lX\n",
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
         }
 
         //
-        // If we are in shutdown mode then fail the request
-        //
-
-        if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_WARNING,
-                          "AFSCommonCreate (%08lX) Open request after shutdown\n",
-                          Irp);
-
-            try_return( ntStatus = STATUS_TOO_LATE);
-        }
-
-        //
         // Go and parse the name for processing.
         // If ulParseFlags is returned with AFS_PARSE_FLAG_FREE_FILE_BUFFER set,
         // then we are responsible for releasing the uniRootFileName.Buffer.
@@ -237,12 +245,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           uniFileName.Length > 0 ? AFS_TRACE_LEVEL_ERROR : AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonCreate (%08lX) Failed to parse name \"%wZ\" Status %08lX\n",
+                          "AFSCommonCreate (%p) Failed to parse name \"%wZ\" Status %08lX\n",
                           Irp,
                           &uniFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -263,6 +271,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             try_return( ntStatus);
         }
 
+        if ( pParentDirectoryCB != NULL)
+        {
+
+            bReleaseParentDir = TRUE;
+        }
+
         //
         // If the returned volume cb is NULL then we are dealing with the \\Server\GlobalRoot
         // name
@@ -314,6 +328,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                              TRUE) == 0)
                 {
 
+                    //
+                    // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
+                    // AFSGlobalRoot->DirectoryCB.
+                    //
+
                     ntStatus = AFSOpenIOCtlFcb( Irp,
                                                 &stAuthGroup,
                                                 AFSGlobalRoot->DirectoryCB,
@@ -323,29 +342,32 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                     if( !NT_SUCCESS( ntStatus))
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                       AFS_TRACE_LEVEL_ERROR,
                                       "AFSCommonCreate Failed to open root IOCtl Fcb Status %08lX\n",
-                                      ntStatus);
+                                      ntStatus));
                     }
                 }
-                else if( pParentDirectoryCB != NULL &&
-                         pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
+                else if( pParentDirectoryCB != NULL)
                 {
 
-                    ntStatus = AFSOpenSpecialShareFcb( Irp,
-                                                       &stAuthGroup,
-                                                       pParentDirectoryCB,
-                                                       &pFcb,
-                                                       &pCcb);
-
-                    if( !NT_SUCCESS( ntStatus))
+                    if( pParentDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_SPECIAL_SHARE_NAME)
                     {
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                      AFS_TRACE_LEVEL_ERROR,
-                                      "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
-                                      ntStatus);
+                        ntStatus = AFSOpenSpecialShareFcb( Irp,
+                                                           &stAuthGroup,
+                                                           pParentDirectoryCB,
+                                                           &pFcb,
+                                                           &pCcb);
+
+                        if( !NT_SUCCESS( ntStatus))
+                        {
+
+                            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                          AFS_TRACE_LEVEL_ERROR,
+                                          "AFSCommonCreate Failed to open special share Fcb Status %08lX\n",
+                                          ntStatus));
+                        }
                     }
                 }
 
@@ -359,20 +381,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open root Status %08lX\n",
-                              ntStatus);
-
-                InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
-                              &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
-                              AFSGlobalRoot->DirectoryCB,
-                              NULL,
-                              AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -382,6 +394,8 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         // We have a reference on the root volume
         //
 
+        VolumeReferenceReason = AFS_VOLUME_REFERENCE_PARSE_NAME;
+
         bReleaseVolume = TRUE;
 
         //
@@ -401,144 +415,577 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%08lX) Invalid name %wZ Status %08lX\n",
+                              "AFSCommonCreate (%p) Invalid name %wZ Status %08lX\n",
                               Irp,
                               &uniFileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
 
-            //
-            // Opening a reparse point directly?
-            //
-
-            ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
 
-            if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
+           if ( !AFSIgnoreReparsePointToFile() ||
+                !BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
             {
-                ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
-                                          AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
-                                          AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
-            }
+               //
+               // If there is no ReparsePointPolicy then the FILE_OPEN_REPARSE_POINT
+               // flag is applied if it is set.
+               //
+               // If the FILE_OPEN_REPARSE_POINT flag is not set, then there is
+               // no extra work to be done in any case.  Use a single pass evaluation.
+               //
+
+               ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
+
+               //
+               // Opening a reparse point directly?
+               //
+
+               if( BooleanFlagOn( ulOptions, FILE_OPEN_REPARSE_POINT))
+               {
+                   ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
+                                              AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
+                                              AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
+               }
+
+               uniSubstitutedPathName = uniRootFileName;
+
+               ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                              pFileObject,
+                                              &uniRootFileName,
+                                              &uniParsedFileName,
+                                              pNameArray,
+                                              ulNameProcessingFlags,
+                                              pVolumeCB,
+                                              pParentDirectoryCB,
+                                              &pNewVolumeCB,
+                                              &NewVolumeReferenceReason,
+                                              &pNewParentDirectoryCB,
+                                              &pDirectoryCB,
+                                              &uniComponentName);
+
+               if ( pNewVolumeCB != NULL)
+               {
+
+                   //
+                   // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+                   // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+                   // the reference on pVolumeCB that was held prior to the call.
+                   // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+                   // will be released second.
+                   //
+
+                   lCount = AFSVolumeDecrement( pVolumeCB,
+                                                VolumeReferenceReason);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
+                                 pVolumeCB,
+                                 VolumeReferenceReason,
+                                 lCount));
+
+                   pVolumeCB = pNewVolumeCB;
+
+                   pNewVolumeCB = NULL;
+
+                   VolumeReferenceReason = NewVolumeReferenceReason;
+
+                   NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+                   bReleaseVolume = (pVolumeCB != NULL);
+               }
+
+               //
+               // AFSLocateNameEntry does not alter the reference count of
+               // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+               // a reference held.
+               //
+
+               if ( bReleaseParentDir)
+               {
+
+                   lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
+                                 &pParentDirectoryCB->NameInformation.FileName,
+                                 pParentDirectoryCB,
+                                 pCcb,
+                                 lCount));
+               }
+
+               pParentDirectoryCB = pNewParentDirectoryCB;
+
+               pNewParentDirectoryCB = NULL;
+
+               bReleaseParentDir = (pParentDirectoryCB != NULL);
+
+               if ( pDirectoryCB)
+               {
+
+                   bReleaseDir = TRUE;
+               }
+
+               if( !NT_SUCCESS( ntStatus) &&
+                   ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+               {
 
-            uniSubstitutedPathName = uniRootFileName;
+                   if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
+                   {
+                       uniSubstitutedPathName.Buffer = NULL;
+                   }
 
-            ntStatus = AFSLocateNameEntry( &stAuthGroup,
-                                           pFileObject,
-                                           &uniRootFileName,
-                                           &uniParsedFileName,
-                                           pNameArray,
-                                           ulNameProcessingFlags,
-                                           &pVolumeCB,
-                                           &pParentDirectoryCB,
-                                           &pDirectoryCB,
-                                           &uniComponentName);
+                   //
+                   // AFSLocateNameEntry released the Parent while walking the
+                   // branch
+                   //
 
-            if( !NT_SUCCESS( ntStatus) &&
-                ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
-            {
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
+                                 Irp,
+                                 &uniFileName,
+                                 ntStatus));
 
-                if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
+                   try_return( ntStatus);
+               }
+
+               //
+               // Check for STATUS_REPARSE
+               //
+
+               if( ntStatus == STATUS_REPARSE)
+               {
+
+                   uniSubstitutedPathName.Buffer = NULL;
+
+                   //
+                   // Update the information and return
+                   //
+
+                   Irp->IoStatus.Information = IO_REPARSE;
+
+                   try_return( ntStatus);
+               }
+
+               //
+               // If we re-allocated the name, then update our substitute name
+               //
+
+               if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
                 {
+
+                   uniSubstitutedPathName = uniRootFileName;
+               }
+               else
+               {
+
                     uniSubstitutedPathName.Buffer = NULL;
                 }
 
                 //
-                // The routine above released the root while walking the
-                // branch
+               // Check for a symlink access
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%08lX) Failed to locate name entry for %wZ Status %08lX\n",
-                              Irp,
-                              &uniFileName,
-                              ntStatus);
+               if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
+                   pParentDirectoryCB != NULL)
+               {
 
-                //
-                // We released any root volume locks in the above on failure
-                //
+                   //
+                   // pParentDirectoryCB DirOpenReferenceCount is still held
+                   //
 
-                bReleaseVolume = FALSE;
+                   UNICODE_STRING uniFinalComponent;
 
-                try_return( ntStatus);
-            }
+                   uniFinalComponent.Length = 0;
+                   uniFinalComponent.MaximumLength = 0;
+                   uniFinalComponent.Buffer = NULL;
 
-            //
-            // Check for STATUS_REPARSE
-            //
+                   AFSRetrieveFinalComponent( &uniFileName,
+                                              &uniFinalComponent);
+
+                   ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
+                                                     &uniFinalComponent);
 
-            if( ntStatus == STATUS_REPARSE)
+                   if( !NT_SUCCESS( ntStatus) &&
+                       ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
+                                     Irp,
+                                     &uniFileName,
+                                     ntStatus));
+
+                       try_return( ntStatus);
+                   }
+               }
+           }
+           else
             {
+               AFSNameArrayHdr    *pNameArrayClone = NULL;
+
+               //
+               // The FILE_OPEN_REPARSE_POINT flag has been specified and a ReparsePointPolicy
+               // is in effect which conditionally applies depending on the type of the target
+               // object.  Therefore, two lookup passes must be performed.
+               //   1. Evaluate the path as if the FILE_OPEN_REPARSE_POINT flag had
+               //      not been specified.
+               //   2. If the target object type matches the policy, use it and ignore
+               //      the FILE_OPEN_REPARSE_POINT flag.
+               //   3. If the target object type does not match the policy, perform
+               //      a second pass that opens the reparse point.
+               //   4. If the target object cannot be evaluated, perform the second pass
+               //      that opens the reparse point.
+
 
-                uniSubstitutedPathName.Buffer = NULL;
+               ulNameProcessingFlags = AFS_LOCATE_FLAGS_SUBSTITUTE_NAME;
+
+               uniSubstitutedPathName = uniRootFileName;
 
                 //
-                // Update the information and return
+               // Since we may need to replay the call with different options
+               // the values that might be altered need to be cloned:
+               //   1. uniRootFileName
+               //   2. pNameArray
                 //
 
-                Irp->IoStatus.Information = IO_REPARSE;
+               pNameArrayClone = AFSInitNameArray( NULL, 0);
+
+               if ( pNameArrayClone == NULL)
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate (%p) Failed to initialize name array clone\n",
+                                 Irp));
+
+                   try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+               }
+
+               ntStatus = AFSPopulateNameArrayFromRelatedArray( pNameArrayClone,
+                                                                pNameArray,
+                                                                NULL);
+
+               if ( !NT_SUCCESS(ntStatus))
+               {
+
+                   AFSFreeNameArray( pNameArrayClone);
+
+                   try_return( ntStatus);
+               }
 
                 //
-                // We released the volume lock above
+               // Now that the data is saved perform the lookup to determine
+               // what the target resolves to.
                 //
 
-                bReleaseVolume = FALSE;
+               ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                              pFileObject,
+                                              &uniRootFileName,
+                                              &uniParsedFileName,
+                                              pNameArray,
+                                              ulNameProcessingFlags,
+                                              pVolumeCB,
+                                              pParentDirectoryCB,
+                                              &pNewVolumeCB,
+                                              &NewVolumeReferenceReason,
+                                              &pNewParentDirectoryCB,
+                                              &pDirectoryCB,
+                                              &uniComponentName);
+
+               if ( ntStatus == STATUS_SUCCESS ||
+                    ntStatus == STATUS_REPARSE ||
+                    ntStatus == STATUS_OBJECT_NAME_NOT_FOUND ||
+                    ntStatus == STATUS_ACCESS_DENIED)
+               {
+                   //
+                   // Decide what to do based upon the ReparsePointPolicy
+                   // and the type of the target object.
+                   //
+
+                   if ( ntStatus == STATUS_SUCCESS &&
+                        AFSIgnoreReparsePointToFile() &&
+                        pDirectoryCB->ObjectInformation->FileType == AFS_FILE_TYPE_FILE)
+                   {
+
+                       //
+                       // We found an entity that matches the policy.
+                       // Therefore, we are done.  Cleanup the cloned data
+                       // and clear the FILE_OPEN_REPARSE_FLAG so we do not
+                       // later mark the CCB with CCB_FLAG_MASK_OPENED_REPARSE_POINT.
+                       //
+
+                       AFSFreeNameArray( pNameArrayClone);
+
+                       pNameArrayClone = NULL;
+
+                       ClearFlag( ulOptions, FILE_OPEN_REPARSE_POINT);
+                   }
+                   else
+                   {
+                       //
+                       //  There is no matching policy, so we need to cleanup the
+                       //  output values from AFSLocateNameEntry(), restore the
+                       //  cloned information, and re-issue the request attempting
+                       //  to open the reparse point (if any).
+                       //
+
+                       if ( pNewVolumeCB != NULL)
+                       {
+
+                           lCount = AFSVolumeDecrement( pNewVolumeCB,
+                                                        NewVolumeReferenceReason);
+
+                           pNewVolumeCB = NULL;
+
+                           NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+                       }
+
+                       if ( pNewParentDirectoryCB)
+                       {
+
+                           lCount = InterlockedDecrement( &pNewParentDirectoryCB->DirOpenReferenceCount);
+
+                           AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                         AFS_TRACE_LEVEL_VERBOSE,
+                                         "AFSCommonCreate DecrementY count on %wZ DE %p Ccb %p Cnt %d\n",
+                                         &pNewParentDirectoryCB->NameInformation.FileName,
+                                         pNewParentDirectoryCB,
+                                         pCcb,
+                                         lCount));
+
+                           pNewParentDirectoryCB = NULL;
+                       }
+
+                       if ( pDirectoryCB)
+                       {
+
+                           lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
+
+                           AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                         AFS_TRACE_LEVEL_VERBOSE,
+                                         "AFSCommonCreate DecrementZ count on %wZ DE %p Ccb %p Cnt %d\n",
+                                         &pDirectoryCB->NameInformation.FileName,
+                                         pDirectoryCB,
+                                         pCcb,
+                                         lCount));
+
+                           pDirectoryCB = NULL;
+                       }
+
+                       RtlZeroMemory( &uniComponentName,
+                                      sizeof( UNICODE_STRING));
+
+                       if ( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
+                       {
+
+                           AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
+
+                           uniRootFileName = uniSubstitutedPathName;
+                       }
+
+                       AFSFreeNameArray( pNameArray);
+
+                       pNameArray = pNameArrayClone;
 
-                try_return( ntStatus);
-            }
+                       pNameArrayClone = NULL;
 
-            //
-            // If we re-allocated the name, then update our substitute name
-            //
+                       //
+                       // Retry the lookup
+                       //
 
-            if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
-            {
+                       ulNameProcessingFlags |= (AFS_LOCATE_FLAGS_NO_MP_TARGET_EVAL |
+                                                  AFS_LOCATE_FLAGS_NO_SL_TARGET_EVAL |
+                                                  AFS_LOCATE_FLAGS_NO_DFS_LINK_EVAL);
 
-                uniSubstitutedPathName = uniRootFileName;
-            }
-            else
-            {
+                       ntStatus = AFSLocateNameEntry( &stAuthGroup,
+                                                      pFileObject,
+                                                      &uniRootFileName,
+                                                      &uniParsedFileName,
+                                                      pNameArray,
+                                                      ulNameProcessingFlags,
+                                                      pVolumeCB,
+                                                      pParentDirectoryCB,
+                                                      &pNewVolumeCB,
+                                                      &NewVolumeReferenceReason,
+                                                      &pNewParentDirectoryCB,
+                                                      &pDirectoryCB,
+                                                      &uniComponentName);
+                   }
+               }
+               else
+               {
 
-                uniSubstitutedPathName.Buffer = NULL;
-            }
+                   AFSFreeNameArray( pNameArrayClone);
 
-            //
-            // Check for a symlink access
-            //
+                   pNameArrayClone = NULL;
+               }
 
-            if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
-                pParentDirectoryCB != NULL)
-            {
+               if ( pNewVolumeCB != NULL)
+               {
 
-                UNICODE_STRING uniFinalComponent;
+                   //
+                   // AFSLocateNameEntry returns pNewVolumeCB with a reference held
+                   // even if pVolumeCB == pNewVolumeCB.  It is always safe to release
+                   // the reference on pVolumeCB that was held prior to the call.
+                   // If pVolumeCB == pNewVolumeCB, the reference from AFSLocateNameEntry
+                   // will be released second.
+                   //
 
-                uniFinalComponent.Length = 0;
-                uniFinalComponent.MaximumLength = 0;
-                uniFinalComponent.Buffer = NULL;
+                   lCount = AFSVolumeDecrement( pVolumeCB,
+                                                VolumeReferenceReason);
 
-                AFSRetrieveFinalComponent( &uniFileName,
-                                           &uniFinalComponent);
+                   AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate Decrement count on volume %p Reason %u Cnt %d\n",
+                                 pVolumeCB,
+                                 VolumeReferenceReason,
+                                 lCount));
+
+                   pVolumeCB = pNewVolumeCB;
+
+                   pNewVolumeCB = NULL;
+
+                   VolumeReferenceReason = NewVolumeReferenceReason;
 
-                ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
-                                                  &uniFinalComponent);
+                   NewVolumeReferenceReason = AFS_VOLUME_REFERENCE_INVALID;
+
+                   bReleaseVolume = (pVolumeCB != NULL);
+               }
+
+               //
+               // AFSLocateNameEntry does not alter the reference count of
+               // pParentDirectoryCB and it returns pNewParentDirectoryCB with
+               // a reference held.
+               //
+
+               if ( bReleaseParentDir)
+               {
+
+                   lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCommonCreate DecrementX count on %wZ DE %p Ccb %p Cnt %d\n",
+                                 &pParentDirectoryCB->NameInformation.FileName,
+                                 pParentDirectoryCB,
+                                 pCcb,
+                                 lCount));
+               }
+
+               pParentDirectoryCB = pNewParentDirectoryCB;
+
+               pNewParentDirectoryCB = NULL;
+
+               bReleaseParentDir = (pParentDirectoryCB != NULL);
+
+               if ( pDirectoryCB)
+               {
+
+                   bReleaseDir = TRUE;
+               }
 
                 if( !NT_SUCCESS( ntStatus) &&
                     ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                   if ( uniSubstitutedPathName.Buffer == uniRootFileName.Buffer)
+                   {
+                       uniSubstitutedPathName.Buffer = NULL;
+                   }
+
+                   //
+                   // AFSLocateNameEntry released the Parent while walking the
+                   // branch
+                   //
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCommonCreate (%08lX) Failing access to symlink %wZ Status %08lX\n",
+                                 "AFSCommonCreate (%p) Failed to locate name entry for %wZ Status %08lX\n",
                                   Irp,
                                   &uniFileName,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
+
+               //
+               // Check for STATUS_REPARSE
+               //
+
+               if( ntStatus == STATUS_REPARSE)
+               {
+
+                   uniSubstitutedPathName.Buffer = NULL;
+
+                   //
+                   // Update the information and return
+                   //
+
+                   Irp->IoStatus.Information = IO_REPARSE;
+
+                   try_return( ntStatus);
+               }
+
+               //
+               // If we re-allocated the name, then update our substitute name
+               //
+
+               if( uniSubstitutedPathName.Buffer != uniRootFileName.Buffer)
+               {
+
+                   uniSubstitutedPathName = uniRootFileName;
+               }
+               else
+               {
+
+                   uniSubstitutedPathName.Buffer = NULL;
+               }
+
+               //
+               // Check for a symlink access
+               //
+
+               if( ntStatus == STATUS_OBJECT_NAME_NOT_FOUND &&
+                   pParentDirectoryCB != NULL)
+               {
+
+                   //
+                   // pParentDirectoryCB DirOpenReferenceCount is still held
+                   //
+
+                   UNICODE_STRING uniFinalComponent;
+
+                   uniFinalComponent.Length = 0;
+                   uniFinalComponent.MaximumLength = 0;
+                   uniFinalComponent.Buffer = NULL;
+
+                   AFSRetrieveFinalComponent( &uniFileName,
+                                              &uniFinalComponent);
+
+                   ntStatus = AFSCheckSymlinkAccess( pParentDirectoryCB,
+                                                     &uniFinalComponent);
+
+                   if( !NT_SUCCESS( ntStatus) &&
+                       ntStatus != STATUS_OBJECT_NAME_NOT_FOUND)
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSCommonCreate (%p) Failing access to symlink %wZ Status %08lX\n",
+                                     Irp,
+                                     &uniFileName,
+                                     ntStatus));
+
+                       try_return( ntStatus);
+                   }
+               }
             }
         }
 
@@ -552,6 +999,18 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         {
 
             pDirectoryCB = pVolumeCB->DirectoryCB;
+
+            lCount = InterlockedIncrement( &pDirectoryCB->DirOpenReferenceCount);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCommonCreate Increment0 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pDirectoryCB->NameInformation.FileName,
+                          pDirectoryCB,
+                          pCcb,
+                          lCount));
+
+            bReleaseDir = TRUE;
         }
 
         if( bOpenTargetDirectory)
@@ -564,19 +1023,25 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( pDirectoryCB != NULL)
             {
 
-                //
-                // Perform in this order to prevent thrashing
-                //
+                if ( !bReleaseParentDir)
+                {
 
-                InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
+                    //
+                    // Perform in this order to prevent thrashing
+                    //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pParentDirectoryCB->NameInformation.FileName,
-                              pParentDirectoryCB,
-                              NULL,
-                              pParentDirectoryCB->OpenReferenceCount);
+                    lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                                  &pParentDirectoryCB->NameInformation.FileName,
+                                  pParentDirectoryCB,
+                                  pCcb,
+                                  lCount));
+
+                    bReleaseParentDir = TRUE;
+                }
 
                 //
                 // Do NOT decrement the reference count on the pDirectoryCB yet.
@@ -605,44 +1070,15 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                                &uniComponentName,
                                                &pFcb,
                                                &pCcb);
-            if( pDirectoryCB != NULL)
-            {
-                //
-                // It is now safe to drop the Reference Count
-                //
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              pDirectoryCB,
-                              NULL,
-                              pDirectoryCB->OpenReferenceCount);
-            }
 
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open target directory %wZ Status %08lX\n",
                               &pParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
-
-                //
-                // Decrement the reference on the parent
-                //
-
-                InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pParentDirectoryCB->NameInformation.FileName,
-                              pParentDirectoryCB,
-                              NULL,
-                              pParentDirectoryCB->OpenReferenceCount);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -654,22 +1090,22 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( pDirectoryCB == NULL ||
                 !BooleanFlagOn( pDirectoryCB->ObjectInformation->FileAttributes, FILE_ATTRIBUTE_REPARSE_POINT))
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%08lX) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
+                              "AFSCommonCreate (%p) Reparse open request but attribute not set for %wZ DirCB %p Type %08lX\n",
                               Irp,
                               &uniFileName,
                               pDirectoryCB,
-                              pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0);
+                              pDirectoryCB ? pDirectoryCB->ObjectInformation->FileType : 0));
             }
             else
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%08lX) Opening as reparse point %wZ Type %08lX\n",
+                              "AFSCommonCreate (%p) Opening as reparse point %wZ Type %08lX\n",
                               Irp,
                               &uniFileName,
-                              pDirectoryCB->ObjectInformation->FileType);
+                              pDirectoryCB->ObjectInformation->FileType));
 
                 bOpenedReparsePoint = TRUE;
             }
@@ -697,39 +1133,19 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 if( pDirectoryCB != NULL)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
                                   &pDirectoryCB->NameInformation.FileName,
-                                  ntStatus);
-
-                    InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirectoryCB->NameInformation.FileName,
-                                  pDirectoryCB,
-                                  NULL,
-                                  pDirectoryCB->OpenReferenceCount);
+                                  ntStatus));
                 }
                 else
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonCreate Object name collision on create Status %08lX\n",
-                                  ntStatus);
-
-                    InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pParentDirectoryCB->NameInformation.FileName,
-                                  pParentDirectoryCB,
-                                  NULL,
-                                  pParentDirectoryCB->OpenReferenceCount);
+                                  ntStatus));
                 }
 
                 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
@@ -752,28 +1168,14 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to create of %wZ in directory %wZ Status %08lX\n",
                               &uniComponentName,
                               &pParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
             }
 
-            //
-            // Dereference the parent entry
-            //
-
-            InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCreate Decrement6 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pParentDirectoryCB->NameInformation.FileName,
-                          pParentDirectoryCB,
-                          NULL,
-                          pParentDirectoryCB->OpenReferenceCount);
-
             try_return( ntStatus);
         }
 
@@ -793,6 +1195,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                          TRUE) == 0)
             {
 
+                //
+                // AFSOpenIOCtlFcb does not free a DirOpenReferenceCount for
+                // pParentDirectoryCB.
+                //
+
                 ntStatus = AFSOpenIOCtlFcb( Irp,
                                             &stAuthGroup,
                                             pParentDirectoryCB,
@@ -802,60 +1209,25 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 if( !NT_SUCCESS( ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSCommonCreate Failed to IOCtl open on %wZ Status %08lX\n",
                                   &uniComponentName,
-                                  ntStatus);
+                                  ntStatus));
                 }
             }
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate (%08lX) File %wZ name not found\n",
+                              "AFSCommonCreate (%p) File %wZ name not found\n",
                               Irp,
-                              &uniFileName);
+                              &uniFileName));
 
                 ntStatus = STATUS_OBJECT_NAME_NOT_FOUND;
             }
 
-            if( !NT_SUCCESS( ntStatus))
-            {
-
-                //
-                // Dereference the parent entry
-                //
-
-                if( pDirectoryCB != NULL)
-                {
-
-                    InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirectoryCB->NameInformation.FileName,
-                                  pDirectoryCB,
-                                  NULL,
-                                  pDirectoryCB->OpenReferenceCount);
-                }
-                else
-                {
-
-                    InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pParentDirectoryCB->NameInformation.FileName,
-                                  pParentDirectoryCB,
-                                  NULL,
-                                  pParentDirectoryCB->OpenReferenceCount);
-                }
-            }
-
             try_return( ntStatus);
         }
 
@@ -873,20 +1245,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE ))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
-                              Irp);
-
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              pDirectoryCB,
-                              NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              "AFSCommonCreate (%p) Attempt to open root as delete on close\n",
+                              Irp));
 
                 try_return( ntStatus = STATUS_CANNOT_DELETE);
             }
@@ -898,20 +1260,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( bOpenTargetDirectory)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
-                              Irp);
-
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              pDirectoryCB,
-                              NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              "AFSCommonCreate (%p) Attempt to open root as target directory\n",
+                              Irp));
 
                 try_return( ntStatus = STATUS_INVALID_PARAMETER);
             }
@@ -929,22 +1281,12 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
                               pVolumeCB->ObjectInformation.FileId.Cell,
                               pVolumeCB->ObjectInformation.FileId.Volume,
-                              ntStatus);
-
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              pDirectoryCB,
-                              NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -957,10 +1299,10 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         if( pDirectoryCB == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSCommonCreate Failing access to %wZ\n",
-                          &uniFileName);
+                          "AFSCommonCreate Failing access to %wZ Name not found\n",
+                          &uniFileName));
 
             try_return( ntStatus = STATUS_OBJECT_NAME_NOT_FOUND);
         }
@@ -986,21 +1328,11 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonCreate Failed overwrite/supersede on %wZ Status %08lX\n",
                               &pDirectoryCB->NameInformation.FileName,
-                              ntStatus);
-
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              pDirectoryCB,
-                              NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -1015,27 +1347,18 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                                    pVolumeCB,
                                    pParentDirectoryCB,
                                    pDirectoryCB,
+                                  bOpenedReparsePoint,
                                    &pFcb,
                                    &pCcb);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonCreate Failed open on %wZ Status %08lX\n",
                           &pDirectoryCB->NameInformation.FileName,
-                          ntStatus);
-
-            InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
-                          &pDirectoryCB->NameInformation.FileName,
-                          pDirectoryCB,
-                          NULL,
-                          pDirectoryCB->OpenReferenceCount);
+                          ntStatus));
         }
 
 try_exit:
@@ -1047,6 +1370,9 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+                                TRUE);
+
                 RtlCopyMemory( &pCcb->AuthGroup,
                                &stAuthGroup,
                                sizeof( GUID));
@@ -1083,15 +1409,17 @@ try_exit:
                     SetFlag( pCcb->Flags, CCB_FLAG_MASK_OPENED_REPARSE_POINT);
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                lCount = pCcb->DirectoryCB->DirOpenReferenceCount;
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pCcb->DirectoryCB->NameInformation.FileName,
                               pCcb->DirectoryCB,
                               pCcb,
-                              pCcb->DirectoryCB->OpenReferenceCount);
+                              lCount));
 
-                ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
+                ASSERT( lCount >= 0);
 
                 pCcb->CurrentDirIndex = 0;
 
@@ -1108,19 +1436,21 @@ try_exit:
                 pCcb->NameArray = pNameArray;
 
                 pNameArray = NULL;
+
+                AFSReleaseResource( &pCcb->NPCcb->CcbLock);
             }
 
             //
             // If we make it here then init the FO for the request.
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE_2,
-                          "AFSCommonCreate (%08lX) FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+                          "AFSCommonCreate (%p) FileObject %p FsContext %p FsContext2 %p\n",
                           Irp,
                           pFileObject,
                           pFcb,
-                          pCcb);
+                          pCcb));
 
             pFileObject->FsContext = (void *)pFcb;
 
@@ -1137,9 +1467,15 @@ try_exit:
                 // For files perform additional processing
                 //
 
-                if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+                switch( pFcb->Header.NodeTypeCode)
                 {
-                    pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+
+                    case AFS_FILE_FCB:
+                    case AFS_IOCTL_FCB:
+                    {
+
+                        pFileObject->SectionObjectPointer = &pFcb->NPFcb->SectionObjectPointers;
+                    }
                 }
 
                 //
@@ -1183,13 +1519,13 @@ try_exit:
             else
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%08lX) Returning with NULL Fcb FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+                              "AFSCommonCreate (%p) Returning with NULL Fcb FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
-                              pCcb);
+                              pCcb));
             }
         }
         else
@@ -1198,13 +1534,13 @@ try_exit:
                 ntStatus == STATUS_REPARSE)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate (%08lX) STATUS_REPARSE FileObject %08lX FsContext %08lX FsContext2 %08lX\n",
+                              "AFSCommonCreate (%p) STATUS_REPARSE FileObject %p FsContext %p FsContext2 %p\n",
                               Irp,
                               pFileObject,
                               pFcb,
-                              pCcb);
+                              pCcb));
             }
 
             //
@@ -1214,7 +1550,7 @@ try_exit:
             if( uniSubstitutedPathName.Buffer != NULL)
             {
 
-                AFSExFreePool( uniSubstitutedPathName.Buffer);
+                AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
 
                 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
             }
@@ -1233,98 +1569,68 @@ try_exit:
         if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
         {
 
-            AFSExFreePool( uniRootFileName.Buffer);
+            AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
         }
 
         if( bReleaseVolume)
         {
 
-            InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = AFSVolumeDecrement( pVolumeCB,
+                                         VolumeReferenceReason);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
+                          "AFSCommonCreate Decrement count on Volume %08lX Reason %u Cnt %d\n",
                           pVolumeCB,
-                          pVolumeCB->VolumeReferenceCount);
+                          VolumeReferenceReason,
+                          lCount));
         }
 
-        //
-        // Setup the Irp for completion, the Information has been set previously
-        //
+        if ( bReleaseDir)
+        {
 
-        Irp->IoStatus.Status = ntStatus;
-    }
+            //
+            // Release the reference from AFSLocateNameEntry
+            //
 
-    return ntStatus;
-}
+            lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
-NTSTATUS
-AFSOpenRedirector( IN PIRP Irp,
-                   IN AFSFcb **Fcb,
-                   IN AFSCcb **Ccb)
-{
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pDirectoryCB->NameInformation.FileName,
+                          pDirectoryCB,
+                          pCcb,
+                          lCount));
 
-    NTSTATUS ntStatus = STATUS_SUCCESS;
+            ASSERT( lCount >= 0);
+        }
 
-    __Enter
-    {
-
-        //
-        // Initialize the Ccb for the file.
-        //
-
-        ntStatus = AFSInitCcb( Ccb);
-
-        if( !NT_SUCCESS( ntStatus))
+        if ( bReleaseParentDir)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenRedirector (%08lX) Failed to allocate Ccb\n",
-                          Irp);
-
-            try_return( ntStatus);
-        }
-
-        //
-        // Setup the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = AFSRedirectorRoot->DirectoryCB;
-
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenRedirector Increment count on Fcb %08lX Cnt %d\n",
-                      AFSRedirectorRoot->RootFcb,
-                      AFSRedirectorRoot->RootFcb->OpenReferenceCount);
-
-        InterlockedIncrement( &AFSRedirectorRoot->RootFcb->OpenHandleCount);
+            //
+            // Release the reference from AFSLocateNameEntry
+            //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenRedirector Increment handle count on Fcb %08lX Cnt %d\n",
-                      AFSRedirectorRoot->RootFcb,
-                      AFSRedirectorRoot->RootFcb->OpenHandleCount);
+            lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
-        *Fcb = AFSRedirectorRoot->RootFcb;
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSCommonCreate Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+                          &pParentDirectoryCB->NameInformation.FileName,
+                          pParentDirectoryCB,
+                          pCcb,
+                          lCount));
 
-        InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
+            ASSERT( lCount >= 0);
+        }
 
         //
-        // Return the open result for this file
+        // Setup the Irp for completion, the Information has been set previously
         //
 
-        Irp->IoStatus.Information = FILE_OPENED;
-
-try_exit:
-
-        NOTHING;
+        Irp->IoStatus.Status = ntStatus;
     }
 
     return ntStatus;
@@ -1337,6 +1643,7 @@ AFSOpenAFSRoot( IN PIRP Irp,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    LONG lCount;
 
     __Enter
     {
@@ -1345,44 +1652,41 @@ AFSOpenAFSRoot( IN PIRP Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               AFSGlobalRoot->DirectoryCB,
+                               0,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenAFSRoot (%08lX) Failed to allocate Ccb\n",
-                          Irp);
+                          "AFSOpenAFSRoot (%p) Failed to allocate Ccb\n",
+                          Irp));
 
             try_return( ntStatus);
         }
 
         //
-        // Setup the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = AFSGlobalRoot->DirectoryCB;
-
-        //
         // Increment the open count on this Fcb
         //
 
-        InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
+        lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenAFSRoot Increment count on Fcb %p Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      AFSGlobalRoot->RootFcb->OpenReferenceCount);
+                      lCount));
 
-        InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenAFSRoot Increment handle count on Fcb %p Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      AFSGlobalRoot->RootFcb->OpenHandleCount);
+                      lCount));
 
         *Fcb = AFSGlobalRoot->RootFcb;
 
@@ -1413,37 +1717,54 @@ AFSOpenRoot( IN PIRP Irp,
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PACCESS_MASK pDesiredAccess = NULL;
     USHORT usShareAccess;
+    ULONG ulOptions;
     BOOLEAN bAllocatedCcb = FALSE;
     BOOLEAN bReleaseFcb = FALSE;
     AFSFileOpenCB   stOpenCB;
     AFSFileOpenResultCB stOpenResultCB;
     ULONG       ulResultLen = 0;
+    LONG        lCount;
 
     __Enter
     {
 
         pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
         usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
+        ulOptions = pIrpSp->Parameters.Create.Options;
 
         pFileObject = pIrpSp->FileObject;
 
+        if( BooleanFlagOn( ulOptions, FILE_NON_DIRECTORY_FILE))
+        {
+
+            ntStatus = STATUS_FILE_IS_A_DIRECTORY;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenRoot (%p) Attempt to open root as file Status %08lX\n",
+                          Irp,
+                          ntStatus));
+
+            try_return( ntStatus);
+        }
+
         //
         // Check if we should go and retrieve updated information for the node
         //
 
         ntStatus = AFSValidateEntry( VolumeCB->DirectoryCB,
                                      AuthGroup,
-                                     TRUE,
-                                     FALSE);
+                                     FALSE,
+                                     TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenRoot (%08lX) Failed to validate root entry Status %08lX\n",
+                          "AFSOpenRoot (%p) Failed to validate root entry Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1468,6 +1789,8 @@ AFSOpenRoot( IN PIRP Irp,
                                       AuthGroup,
                                       NULL,
                                       &VolumeCB->ObjectInformation.FileId,
+                                      VolumeCB->VolumeInformation.Cell,
+                                      VolumeCB->VolumeInformation.CellLength,
                                       (void *)&stOpenCB,
                                       sizeof( AFSFileOpenCB),
                                       (void *)&stOpenResultCB,
@@ -1486,16 +1809,16 @@ AFSOpenRoot( IN PIRP Irp,
             {
                 RtlStringFromGUID( *AuthGroup,
                                    &uniGUID);
-            }       
+            }
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
+                          "AFSOpenRoot (%p) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
                           Irp,
                           VolumeCB->ObjectInformation.FileId.Cell,
                           VolumeCB->ObjectInformation.FileId.Volume,
                           &uniGUID,
-                          ntStatus);
+                          ntStatus));
 
             if( AuthGroup != NULL)
             {
@@ -1515,28 +1838,22 @@ AFSOpenRoot( IN PIRP Irp,
             AFSAcquireExcl( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock,
                             TRUE);
 
-            if( !BooleanFlagOn( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
-            {
-
-                ntStatus = AFSEnumerateDirectory( AuthGroup,
-                                                  &VolumeCB->ObjectInformation,
-                                                  TRUE);
-
-                if( !NT_SUCCESS( ntStatus))
-                {
+            ntStatus = AFSEnumerateDirectory( AuthGroup,
+                                              &VolumeCB->ObjectInformation,
+                                              TRUE);
 
-                    AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
+            if( !NT_SUCCESS( ntStatus))
+            {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSOpenRoot (%08lX) Failed to enumerate directory Status %08lX\n",
-                                  Irp,
-                                  ntStatus);
+                AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
 
-                    try_return( ntStatus);
-                }
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                              AFS_TRACE_LEVEL_ERROR,
+                              "AFSOpenRoot (%p) Failed to enumerate directory Status %08lX\n",
+                              Irp,
+                              ntStatus));
 
-                SetFlag( VolumeCB->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED);
+                try_return( ntStatus);
             }
 
             AFSReleaseResource( VolumeCB->ObjectInformation.Specific.Directory.DirectoryNodeHdr.TreeLock);
@@ -1547,25 +1864,23 @@ AFSOpenRoot( IN PIRP Irp,
         // init the volume fcb
         //
 
-        if( VolumeCB->RootFcb == NULL)
-        {
-
-            ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
-                                       VolumeCB);
+        ntStatus = AFSInitRootFcb( (ULONGLONG)PsGetCurrentProcessId(),
+                                   VolumeCB);
 
-            if( !NT_SUCCESS( ntStatus))
-            {
-
-                try_return( ntStatus);
-            }
-        }
-        else
+        if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSAcquireExcl( VolumeCB->RootFcb->Header.Resource,
-                            TRUE);
+            try_return( ntStatus);
         }
 
+        lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenRoot Increment count on Fcb %p Cnt %d\n",
+                      VolumeCB->RootFcb,
+                      lCount));
+
         bReleaseFcb = TRUE;
 
         //
@@ -1584,11 +1899,11 @@ AFSOpenRoot( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSOpenRoot (%08lX) Access check failure Status %08lX\n",
+                              "AFSOpenRoot (%p) Access check failure Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -1598,16 +1913,19 @@ AFSOpenRoot( IN PIRP Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               VolumeCB->DirectoryCB,
+                               *pDesiredAccess,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenRoot (%08lX) Failed to allocate Ccb Status %08lX\n",
+                          "AFSOpenRoot (%p) Failed to allocate Ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1615,14 +1933,6 @@ AFSOpenRoot( IN PIRP Irp,
         bAllocatedCcb = TRUE;
 
         //
-        // Setup the ccb
-        //
-
-        (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
-
-        (*Ccb)->GrantedAccess = *pDesiredAccess;
-
-        //
         // OK, update the share access on the fileobject
         //
 
@@ -1649,21 +1959,13 @@ AFSOpenRoot( IN PIRP Irp,
         // Increment the open count on this Fcb
         //
 
-        InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenRoot Increment count on Fcb %08lX Cnt %d\n",
-                      VolumeCB->RootFcb,
-                      VolumeCB->RootFcb->OpenReferenceCount);
-
-        InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenRoot Increment handle count on Fcb %p Cnt %d\n",
                       VolumeCB->RootFcb,
-                      VolumeCB->RootFcb->OpenHandleCount);
+                      lCount));
 
         //
         // Indicate the object is held
@@ -1683,6 +1985,17 @@ try_exit:
 
         if( bReleaseFcb)
         {
+            if ( !NT_SUCCESS( ntStatus))
+            {
+
+                lCount = InterlockedDecrement( &VolumeCB->RootFcb->OpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenRoot Decrement count on Fcb %p Cnt %d\n",
+                              VolumeCB->RootFcb,
+                              lCount));
+            }
 
             AFSReleaseResource( VolumeCB->RootFcb->Header.Resource);
         }
@@ -1722,17 +2035,14 @@ AFSProcessCreate( IN PIRP               Irp,
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     ULONG ulOptions = 0;
-    ULONG ulShareMode = 0;
-    ULONG ulAccess = 0;
     ULONG ulAttributes = 0;
-    LARGE_INTEGER   liAllocationSize = {0,0};
     BOOLEAN bFileCreated = FALSE, bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
-    BOOLEAN bAllocatedFcb = FALSE;
     PACCESS_MASK pDesiredAccess = NULL;
     USHORT usShareAccess;
     AFSDirectoryCB *pDirEntry = NULL;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    LONG lCount;
 
     __Enter
     {
@@ -1764,20 +2074,20 @@ AFSProcessCreate( IN PIRP               Irp,
             ulAttributes |= FILE_ATTRIBUTE_DIRECTORY;
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate (%08lX) Creating file %wZ Attributes %08lX\n",
+                      "AFSProcessCreate (%p) Creating file %wZ Attributes %08lX\n",
                       Irp,
                       FullFileName,
-                      ulAttributes);
+                      ulAttributes));
 
-        if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+        if( BooleanFlagOn( VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessCreate Request failed due to read only volume %wZ\n",
-                          FullFileName);
+                          FullFileName));
 
             try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
@@ -1799,12 +2109,12 @@ AFSProcessCreate( IN PIRP               Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessCreate (%08lX) Failed to create directory entry %wZ Status %08lX\n",
+                          "AFSProcessCreate (%p) Failed to create directory entry %wZ Status %08lX\n",
                           Irp,
                           FullFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1817,15 +2127,15 @@ AFSProcessCreate( IN PIRP               Irp,
             pObjectInfo->FileType == AFS_FILE_TYPE_UNKNOWN)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessCreate (%08lX) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
+                          "AFSProcessCreate (%p) Evaluating object %wZ FID %08lX-%08lX-%08lX-%08lX\n",
                           Irp,
                           &pDirEntry->NameInformation.FileName,
                           pObjectInfo->FileId.Cell,
                           pObjectInfo->FileId.Volume,
                           pObjectInfo->FileId.Vnode,
-                          pObjectInfo->FileId.Unique);
+                          pObjectInfo->FileId.Unique));
 
             ntStatus = AFSEvaluateNode( AuthGroup,
                                         pDirEntry);
@@ -1833,16 +2143,82 @@ AFSProcessCreate( IN PIRP               Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessCreate (%08lX) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
-                              Irp,
-                              &pDirEntry->NameInformation.FileName,
-                              pObjectInfo->FileId.Cell,
-                              pObjectInfo->FileId.Volume,
-                              pObjectInfo->FileId.Vnode,
-                              pObjectInfo->FileId.Unique,
-                              ntStatus);
+                if ( ntStatus == STATUS_NOT_A_DIRECTORY)
+                {
+
+                    if ( !BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                    {
+
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != NULL Status %08lX\n",
+                                      Irp,
+                                      &pDirEntry->NameInformation.FileName,
+                                      pObjectInfo->FileId.Cell,
+                                      pObjectInfo->FileId.Volume,
+                                      pObjectInfo->FileId.Vnode,
+                                      pObjectInfo->FileId.Unique,
+                                      pParentObjectInfo->FileId.Cell,
+                                      pParentObjectInfo->FileId.Volume,
+                                      pParentObjectInfo->FileId.Vnode,
+                                      pParentObjectInfo->FileId.Unique,
+                                      ntStatus));
+                    }
+                    else if ( AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId))
+                    {
+
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      Irp,
+                                      &pDirEntry->NameInformation.FileName,
+                                      pObjectInfo->FileId.Cell,
+                                      pObjectInfo->FileId.Volume,
+                                      pObjectInfo->FileId.Vnode,
+                                      pObjectInfo->FileId.Unique,
+                                      pParentObjectInfo->FileId.Cell,
+                                      pParentObjectInfo->FileId.Volume,
+                                      pParentObjectInfo->FileId.Vnode,
+                                      pParentObjectInfo->FileId.Unique,
+                                      ntStatus));
+                    }
+                    else
+                    {
+
+                        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX PARENT %08lX-%08lX-%08lX-%08lX != %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                      Irp,
+                                      &pDirEntry->NameInformation.FileName,
+                                      pObjectInfo->FileId.Cell,
+                                      pObjectInfo->FileId.Volume,
+                                      pObjectInfo->FileId.Vnode,
+                                      pObjectInfo->FileId.Unique,
+                                      pParentObjectInfo->FileId.Cell,
+                                      pParentObjectInfo->FileId.Volume,
+                                      pParentObjectInfo->FileId.Vnode,
+                                      pParentObjectInfo->FileId.Unique,
+                                      pObjectInfo->ParentFileId.Cell,
+                                      pObjectInfo->ParentFileId.Volume,
+                                      pObjectInfo->ParentFileId.Vnode,
+                                      pObjectInfo->ParentFileId.Unique,
+                                      ntStatus));
+                    }
+                }
+                else
+                {
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSProcessCreate (%p) Failed to evaluate object %wZ FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                  Irp,
+                                  &pDirEntry->NameInformation.FileName,
+                                  pObjectInfo->FileId.Cell,
+                                  pObjectInfo->FileId.Volume,
+                                  pObjectInfo->FileId.Vnode,
+                                  pObjectInfo->FileId.Unique,
+                                  ntStatus));
+                }
 
                 try_return( ntStatus);
             }
@@ -1850,49 +2226,47 @@ AFSProcessCreate( IN PIRP               Irp,
             ClearFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_NOT_EVALUATED);
         }
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // We may have raced and the Fcb is already created
         //
 
-        if( pObjectInfo->Fcb != NULL)
-        {
+        //
+        // Allocate and initialize the Fcb for the file.
+        //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessCreate (%08lX) Not allocating Fcb for file %wZ\n",
-                          Irp,
-                          FullFileName);
+        ntStatus = AFSInitFcb( pDirEntry);
 
-            *Fcb = pObjectInfo->Fcb;
+        *Fcb = pObjectInfo->Fcb;
 
-            AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
-                            TRUE);
-        }
-        else
+        if( !NT_SUCCESS( ntStatus))
         {
 
-            //
-            // Allocate and initialize the Fcb for the file.
-            //
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSProcessCreate (%p) Failed to initialize fcb %wZ Status %08lX\n",
+                          Irp,
+                          FullFileName,
+                          ntStatus));
 
-            ntStatus = AFSInitFcb( pDirEntry,
-                                   Fcb);
+            try_return( ntStatus);
+        }
 
-            if( !NT_SUCCESS( ntStatus))
-            {
+        ntStatus = STATUS_SUCCESS;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
-                              Irp,
-                              FullFileName,
-                              ntStatus);
+        //
+        // Increment the open count on this Fcb
+        //
 
-                try_return( ntStatus);
-            }
+        lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
 
-            bAllocatedFcb = TRUE;
-        }
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessCreate Increment count on Fcb %p Cnt %d\n",
+                      *Fcb,
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -1900,17 +2274,20 @@ AFSProcessCreate( IN PIRP               Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               pDirEntry,
+                               *pDesiredAccess,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessCreate (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+                          "AFSProcessCreate (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           FullFileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1918,14 +2295,6 @@ AFSProcessCreate( IN PIRP               Irp,
         bAllocatedCcb = TRUE;
 
         //
-        // Initialize the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = pDirEntry;
-
-        (*Ccb)->GrantedAccess = *pDesiredAccess;
-
-        //
         // If this is a file, update the headers filesizes.
         //
 
@@ -2006,45 +2375,33 @@ AFSProcessCreate( IN PIRP               Irp,
                           pFileObject,
                           &(*Fcb)->ShareAccess);
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+        lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
-                      *Fcb,
-                      (*Fcb)->OpenReferenceCount);
-
-        InterlockedIncrement( &(*Fcb)->OpenHandleCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessCreate Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      (*Fcb)->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate Increment child open handle count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+                      "AFSProcessCreate Increment child open handle count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate Increment child open ref count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                      "AFSProcessCreate Increment child open ref count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
 
         if( ulOptions & FILE_DELETE_ON_CLOSE)
         {
@@ -2053,12 +2410,12 @@ AFSProcessCreate( IN PIRP               Irp,
             // Mark it for delete on close
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessCreate (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
+                          "AFSProcessCreate (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
                           Irp,
                           pDirEntry,
-                          FullFileName);
+                          FullFileName));
 
             SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
         }
@@ -2084,21 +2441,56 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessCreate Decrement count on Fcb %p Cnt %d\n",
+                              *Fcb,
+                              lCount));
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
+        if ( bFileCreated)
+        {
+
+            //
+            // Decrement the reference added during initialization of the DE
+            // AFSInitCcb allocates its own reference count.
+            //
+
+            lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                          AFS_TRACE_LEVEL_VERBOSE,
+                          "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
+                          &pDirEntry->NameInformation.FileName,
+                          pDirEntry,
+                          lCount));
+
+            ASSERT( lCount >= 0);
+        }
+
         if( !NT_SUCCESS( ntStatus))
         {
 
             if( bFileCreated)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessCreate Create failed, removing DE %p from aprent object %p Status %08lX\n",
+                              "AFSProcessCreate Create failed, removing DE %p from parent object %p Status %08lX\n",
                               pDirEntry,
                               pParentObjectInfo,
-                              ntStatus);
+                              ntStatus));
 
                 //
                 // Remove the dir entry from the parent
@@ -2109,18 +2501,9 @@ try_exit:
 
                 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
-                //
-                // Decrement the reference added during initialization of the DE
-                //
-
-                InterlockedDecrement( &pDirEntry->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSProcessCreate Decrement count on %wZ DE %p Cnt %d\n",
-                              &pDirEntry->NameInformation.FileName,
-                              pDirEntry,
-                              pDirEntry->OpenReferenceCount);
+                AFSNotifyDelete( pDirEntry,
+                                 AuthGroup,
+                                 FALSE);
 
                 //
                 // Pull the directory entry from the parent
@@ -2130,16 +2513,14 @@ try_exit:
                                             pDirEntry,
                                             FALSE); // Leave it in the enum list so the worker cleans it up
 
-                AFSNotifyDelete( pDirEntry,
-                                 AuthGroup,
-                                 FALSE);
-
                 //
                 // Tag the parent as needing verification
                 //
 
                 SetFlag( pParentObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY);
 
+                pParentObjectInfo->DataVersion.QuadPart = (ULONGLONG)-1;
+
                 AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
             }
 
@@ -2150,13 +2531,9 @@ try_exit:
                               *Ccb);
             }
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
 
@@ -2176,16 +2553,18 @@ AFSOpenTargetDirectory( IN PIRP Irp,
                         OUT AFSFcb **Fcb,
                         OUT AFSCcb **Ccb)
 {
-
+    UNREFERENCED_PARAMETER(VolumeCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PACCESS_MASK pDesiredAccess = NULL;
     USHORT usShareAccess;
     BOOLEAN bAllocatedCcb = FALSE;
-    BOOLEAN bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
-    AFSObjectInfoCB *pParentObject = NULL, *pTargetObject = NULL;
+    BOOLEAN bReleaseFcb = FALSE;
+    AFSObjectInfoCB *pParentObject = NULL;
+    AFSObjectInfoCB *pGrandParentObject = NULL;
     UNICODE_STRING uniTargetName;
+    LONG lCount;
 
     __Enter
     {
@@ -2195,11 +2574,11 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         pFileObject = pIrpSp->FileObject;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenTargetDirectory (%08lX) Processing file %wZ\n",
+                      "AFSOpenTargetDirectory (%p) Processing file %wZ\n",
                       Irp,
-                      TargetName);
+                      TargetName));
 
         pParentObject = ParentDirectoryCB->ObjectInformation;
 
@@ -2211,41 +2590,41 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         //
         // Make sure we have an Fcb for the access
+
+        //
+        // Allocate and initialize the Fcb for the file.
         //
 
-        if( pParentObject->Fcb != NULL)
-        {
+        ntStatus = AFSInitFcb( ParentDirectoryCB);
 
-            *Fcb = pParentObject->Fcb;
+        *Fcb = pParentObject->Fcb;
 
-            AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
-                            TRUE);
-        }
-        else
+        if( !NT_SUCCESS( ntStatus))
         {
 
-            //
-            // Allocate and initialize the Fcb for the file.
-            //
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenTargetDirectory (%p) Failed to initialize fcb %wZ Status %08lX\n",
+                          Irp,
+                          &ParentDirectoryCB->NameInformation.FileName,
+                          ntStatus));
 
-            ntStatus = AFSInitFcb( ParentDirectoryCB,
-                                   Fcb);
+            try_return( ntStatus);
+        }
 
-            if( !NT_SUCCESS( ntStatus))
-            {
+        ntStatus = STATUS_SUCCESS;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessCreate (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
-                              Irp,
-                              &ParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+        //
+        // Increment the open count on this Fcb
+        //
 
-                try_return( ntStatus);
-            }
+        lCount = InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
 
-            bAllocatedFcb = TRUE;
-        }
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenTargetDirectory Increment count on Fcb %p Cnt %d\n",
+                      pParentObject->Fcb,
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -2265,12 +2644,12 @@ AFSOpenTargetDirectory( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSOpenTargetDirectory (%08lX) Access check failure %wZ Status %08lX\n",
+                              "AFSOpenTargetDirectory (%p) Access check failure %wZ Status %08lX\n",
                               Irp,
                               &ParentDirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2280,31 +2659,26 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               ParentDirectoryCB,
+                               *pDesiredAccess,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenTargetDirectory (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+                          "AFSOpenTargetDirectory (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &ParentDirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
         bAllocatedCcb = TRUE;
 
-        //
-        // Initialize the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = ParentDirectoryCB;
-
-        (*Ccb)->GrantedAccess = *pDesiredAccess;
-
         if( TargetDirectoryCB != NULL &&
             FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
                                 TargetName,
@@ -2357,48 +2731,46 @@ AFSOpenTargetDirectory( IN PIRP Irp,
                               &pParentObject->Fcb->ShareAccess);
         }
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenTargetDirectory Increment handle count on Fcb %p Cnt %d\n",
                       pParentObject->Fcb,
-                      pParentObject->Fcb->OpenReferenceCount);
-
-        InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenTargetDirectory Increment handle count on Fcb %08lX Cnt %d\n",
-                      pParentObject->Fcb,
-                      pParentObject->Fcb->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        if( pParentObject->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pParentObject->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
-            InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            pGrandParentObject = AFSFindObjectInfo( pParentObject->VolumeCB,
+                                                    &pParentObject->ParentFileId,
+                                                    TRUE);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSOpenTargetDirectory Increment child open handle count on Parent object %08lX Cnt %d\n",
-                          pParentObject->ParentObjectInformation,
-                          pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            if ( pGrandParentObject)
+            {
 
-            InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenHandleCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSOpenTargetDirectory Increment child open ref count on Parent object %08lX Cnt %d\n",
-                          pParentObject->ParentObjectInformation,
-                          pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Increment child open handle count on Parent object %p Cnt %d\n",
+                              pGrandParentObject,
+                              lCount));
+
+                lCount = InterlockedIncrement( &pGrandParentObject->Specific.Directory.ChildOpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Increment child open ref count on Parent object %p Cnt %d\n",
+                              pGrandParentObject,
+                              lCount));
+
+                AFSReleaseObjectInfo( &pGrandParentObject);
+            }
         }
 
 try_exit:
@@ -2406,6 +2778,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Decrement count on Fcb %p Cnt %d\n",
+                              pParentObject->Fcb,
+                              lCount));
+            }
+
             AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
         }
 
@@ -2421,13 +2808,9 @@ try_exit:
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pParentObject->Fcb);
-
-                pParentObject->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -2442,17 +2825,18 @@ AFSProcessOpen( IN PIRP Irp,
                 IN AFSVolumeCB *VolumeCB,
                 IN AFSDirectoryCB *ParentDirCB,
                 IN AFSDirectoryCB *DirectoryCB,
+               IN BOOLEAN bOpenedReparsePoint,
                 OUT AFSFcb **Fcb,
                 OUT AFSCcb **Ccb)
 {
-
+    UNREFERENCED_PARAMETER(VolumeCB);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PACCESS_MASK pDesiredAccess = NULL;
     USHORT usShareAccess;
-    BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
-    ULONG ulAdditionalFlags = 0, ulOptions = 0;
+    BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
+    ULONG ulOptions = 0;
     AFSFileOpenCB   stOpenCB;
     AFSFileOpenResultCB stOpenResultCB;
     ULONG       ulResultLen = 0;
@@ -2460,6 +2844,7 @@ AFSProcessOpen( IN PIRP Irp,
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONG       ulFileAccess = 0;
     AFSFileAccessReleaseCB stReleaseFileAccess;
+    LONG lCount;
 
     __Enter
     {
@@ -2473,6 +2858,9 @@ AFSProcessOpen( IN PIRP Irp,
 
         pObjectInfo = DirectoryCB->ObjectInformation;
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // Check if the entry is pending a deletion
         //
@@ -2482,12 +2870,12 @@ AFSProcessOpen( IN PIRP Irp,
 
             ntStatus = STATUS_DELETE_PENDING;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOpen (%08lX) Entry pending delete %wZ Status %08lX\n",
+                          "AFSProcessOpen (%p) Entry pending delete %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2504,18 +2892,18 @@ AFSProcessOpen( IN PIRP Irp,
 
         ntStatus = AFSValidateEntry( DirectoryCB,
                                      AuthGroup,
-                                     TRUE,
-                                     FALSE);
+                                    bOpenedReparsePoint,
+                                     TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOpen (%08lX) Failed to validate entry %wZ Status %08lX\n",
+                          "AFSProcessOpen (%p) Failed to validate entry %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2536,12 +2924,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_CANNOT_DELETE;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOpen (%08lX) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
+                              "AFSProcessOpen (%p) Cannot delete entry %wZ marked for delete on close Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2551,47 +2939,40 @@ AFSProcessOpen( IN PIRP Irp,
         // Be sure we have an Fcb for the current object
         //
 
-        if( pObjectInfo->Fcb == NULL)
-        {
-
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   &pObjectInfo->Fcb);
-
-            if( !NT_SUCCESS( ntStatus))
-            {
+        ntStatus = AFSInitFcb( DirectoryCB);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOpen (%08lX) Failed to init fcb on %wZ Status %08lX\n",
-                              Irp,
-                              &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+        if( !NT_SUCCESS( ntStatus))
+        {
 
-                try_return( ntStatus);
-            }
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSProcessOpen (%p) Failed to init fcb on %wZ Status %08lX\n",
+                          Irp,
+                          &DirectoryCB->NameInformation.FileName,
+                          ntStatus));
 
-            bAllocatedFcb = TRUE;
+            try_return( ntStatus);
         }
-        else
-        {
 
-            AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
-                            TRUE);
-        }
+        ntStatus = STATUS_SUCCESS;
+
+        //
+        // AFSInitFcb returns the Fcb resource held
+        //
 
         bReleaseFcb = TRUE;
 
         //
-        // Reference the Fcb so it won't go away while we call into the service for processing
+        // Increment the open count on this Fcb
         //
 
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
+        lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOpen Increment2 count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
+                      lCount));
 
         //
         // Check access on the entry
@@ -2609,12 +2990,12 @@ AFSProcessOpen( IN PIRP Irp,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOpen (%08lX) Failed to check share access on %wZ Status %08lX\n",
+                              "AFSProcessOpen (%p) Failed to check share access on %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2635,19 +3016,60 @@ AFSProcessOpen( IN PIRP Irp,
                 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
             {
 
-                if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                          MmFlushForWrite))
+                BOOLEAN bMmFlushed;
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                              &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                              PsGetCurrentThread()));
+
+                AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                TRUE);
+
+               __try
+               {
+
+                   bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                     MmFlushForWrite);
+               }
+               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               {
+
+                   bMmFlushed = FALSE;
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSProcessOpen MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique,
+                                 ntStatus));
+               }
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                              &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                              PsGetCurrentThread()));
+
+                AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                if ( !bMmFlushed)
                 {
 
                     ntStatus = BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE) ? STATUS_CANNOT_DELETE :
                                                                             STATUS_SHARING_VIOLATION;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSProcessOpen (%08lX) Failed to flush image section %wZ Status %08lX\n",
+                                  "AFSProcessOpen (%p) Failed to flush image section %wZ Status %08lX\n",
                                   Irp,
                                   &DirectoryCB->NameInformation.FileName,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
@@ -2658,12 +3080,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_NOT_A_DIRECTORY;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOpen (%08lX) Attempt to open file as directory %wZ Status %08lX\n",
+                              "AFSProcessOpen (%p) Attempt to open file as directory %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2679,12 +3101,12 @@ AFSProcessOpen( IN PIRP Irp,
 
                 ntStatus = STATUS_FILE_IS_A_DIRECTORY;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOpen (%08lX) Attempt to open directory as file %wZ Status %08lX\n",
+                              "AFSProcessOpen (%p) Attempt to open directory as file %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -2725,6 +3147,8 @@ AFSProcessOpen( IN PIRP Irp,
                                       AuthGroup,
                                       &DirectoryCB->NameInformation.FileName,
                                       &pObjectInfo->FileId,
+                                      pObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                      pObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                       (void *)&stOpenCB,
                                       sizeof( AFSFileOpenCB),
                                       (void *)&stOpenResultCB,
@@ -2733,12 +3157,12 @@ AFSProcessOpen( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOpen (%08lX) Failed open in service %wZ Status %08lX\n",
+                          "AFSProcessOpen (%p) Failed open in service %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2760,14 +3184,14 @@ AFSProcessOpen( IN PIRP Irp,
 
             ntStatus = STATUS_ACCESS_DENIED;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOpen (%08lX) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
+                          "AFSProcessOpen (%p) Failed to check access from service Desired %08lX Granted %08lX Entry %wZ Status %08lX\n",
                           Irp,
                           *pDesiredAccess,
                           stOpenResultCB.GrantedAccess,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -2776,29 +3200,26 @@ AFSProcessOpen( IN PIRP Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               DirectoryCB,
+                               *pDesiredAccess,
+                               ulFileAccess);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOpen (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+                          "AFSProcessOpen (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
         bAllocatedCcb = TRUE;
 
-        (*Ccb)->DirectoryCB = DirectoryCB;
-
-        (*Ccb)->FileAccess = ulFileAccess;
-
-        (*Ccb)->GrantedAccess = *pDesiredAccess;
-
         //
         // Perform the access check on the target if this is a mount point or symlink
         //
@@ -2822,45 +3243,33 @@ AFSProcessOpen( IN PIRP Irp,
                               &pObjectInfo->Fcb->ShareAccess);
         }
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
-                      pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
-
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOpen Increment handle count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment child open handle count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+                      "AFSProcessOpen Increment child open handle count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment child open ref count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                      "AFSProcessOpen Increment child open ref count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
 
         if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
         {
@@ -2869,12 +3278,12 @@ AFSProcessOpen( IN PIRP Irp,
             // Mark it for delete on close
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessOpen (%08lX) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
+                          "AFSProcessOpen (%p) Setting PENDING_DELETE flag in DirEntry %p Name %wZ\n",
                           Irp,
                           DirectoryCB,
-                          &DirectoryCB->NameInformation.FileName);
+                          &DirectoryCB->NameInformation.FileName));
 
             SetFlag( DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
         }
@@ -2898,17 +3307,20 @@ try_exit:
         if( bReleaseFcb)
         {
 
-            //
-            // Remove the reference we added initially
-            //
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
 
-            InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessOpen Decrement count on Fcb %08lX Cnt %d\n",
-                          pObjectInfo->Fcb,
-                          pObjectInfo->Fcb->OpenReferenceCount);
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Decrement2 count on Fcb %p Cnt %d\n",
+                              pObjectInfo->Fcb,
+                              lCount));
+            }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
         }
@@ -2930,6 +3342,8 @@ try_exit:
                                    AuthGroup,
                                    &DirectoryCB->NameInformation.FileName,
                                    &pObjectInfo->FileId,
+                                   pObjectInfo->VolumeCB->VolumeInformation.Cell,
+                                   pObjectInfo->VolumeCB->VolumeInformation.CellLength,
                                    (void *)&stReleaseFileAccess,
                                    sizeof( AFSFileAccessReleaseCB),
                                    NULL,
@@ -2945,13 +3359,9 @@ try_exit:
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -2970,25 +3380,30 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
                               OUT AFSFcb       **Fcb,
                               OUT AFSCcb       **Ccb)
 {
-
+    UNREFERENCED_PARAMETER(DeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PFILE_OBJECT pFileObject = NULL;
     LARGE_INTEGER liZero = {0,0};
     BOOLEAN bReleasePaging = FALSE, bReleaseFcb = FALSE;
     ULONG   ulAttributes = 0;
-    LARGE_INTEGER liTime;
     ULONG ulCreateDisposition = 0;
-    BOOLEAN bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
+    BOOLEAN bAllocatedCcb = FALSE;
+    BOOLEAN bUserMapped = FALSE;
     PACCESS_MASK pDesiredAccess = NULL;
     USHORT usShareAccess;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    LONG lCount;
+    LARGE_INTEGER liSaveSize;
+    LARGE_INTEGER liSaveVDL;
+    LARGE_INTEGER liSaveAlloc;
 
     __Enter
     {
 
         pDesiredAccess = &pIrpSp->Parameters.Create.SecurityContext->DesiredAccess;
+
         usShareAccess = pIrpSp->Parameters.Create.ShareAccess;
 
         pFileObject = pIrpSp->FileObject;
@@ -2997,14 +3412,14 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         ulCreateDisposition = (pIrpSp->Parameters.Create.Options >> 24) & 0x000000ff;
 
-        if( BooleanFlagOn( VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+        if( BooleanFlagOn( VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede Request failed on %wZ due to read only volume\n",
                           Irp,
-                          &DirectoryCB->NameInformation.FileName);
+                          &DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
@@ -3013,73 +3428,79 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         pObjectInfo = DirectoryCB->ObjectInformation;
 
+        ASSERT( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID) &&
+                AFSIsEqualFID( &pParentObjectInfo->FileId, &pObjectInfo->ParentFileId));
+
         //
         // Check if we should go and retrieve updated information for the node
         //
 
         ntStatus = AFSValidateEntry( DirectoryCB,
                                      AuthGroup,
-                                     TRUE,
-                                     FALSE);
+                                     FALSE,
+                                     TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOverwriteSupersede (%08lX) Failed to validate entry %wZ Status %08lX\n",
+                          "AFSProcessOverwriteSupersede (%p) Failed to validate entry %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        //
-        // Be sure we have an Fcb for the object block
-        //
+       if ( BooleanFlagOn( pObjectInfo->FileAttributes, FILE_ATTRIBUTE_READONLY))
+       {
 
-        if( pObjectInfo->Fcb == NULL)
-        {
+           AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                         AFS_TRACE_LEVEL_WARNING,
+                         "AFSProcessOverwriteSupersede Request failed on %wZ due to read only file attribute\n",
+                         Irp,
+                         &DirectoryCB->NameInformation.FileName));
 
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   Fcb);
+           try_return( ntStatus = STATUS_ACCESS_DENIED);
+       }
 
-            if( !NT_SUCCESS( ntStatus))
-            {
+        //
+        // Be sure we have an Fcb for the object block
+        //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOverwriteSupersede (%08lX) Failed to initialize fcb %wZ Status %08lX\n",
-                              Irp,
-                              &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+        ntStatus = AFSInitFcb( DirectoryCB);
 
-                try_return( ntStatus);
-            }
+        *Fcb = pObjectInfo->Fcb;
 
-            bAllocatedFcb = TRUE;
-        }
-        else
+        if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSAcquireExcl( pObjectInfo->Fcb->Header.Resource,
-                            TRUE);
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSProcessOverwriteSupersede (%p) Failed to initialize fcb %wZ Status %08lX\n",
+                          Irp,
+                          &DirectoryCB->NameInformation.FileName,
+                          ntStatus));
+
+            try_return( ntStatus);
         }
 
-        bReleaseFcb = TRUE;
+        ntStatus = STATUS_SUCCESS;
 
         //
-        // Reference the Fcb so it won't go away while processing the request
+        // Increment the open count on this Fcb.
         //
 
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
+        lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOverwriteSupersede Increment2 count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
+                      lCount));
+
+        bReleaseFcb = TRUE;
 
         //
         // Check access on the entry
@@ -3097,34 +3518,73 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSProcessOverwriteSupersede (%08lX) Access check failure %wZ Status %08lX\n",
+                              "AFSProcessOverwriteSupersede (%p) Access check failure %wZ Status %08lX\n",
                               Irp,
                               &DirectoryCB->NameInformation.FileName,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
         }
 
-        //
-        //  Before we actually truncate, check to see if the purge
-        //  is going to fail.
-        //
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                      &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread()));
+
+        AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                        TRUE);
+
+       __try
+       {
+
+           //
+           //  Before we actually truncate, check to see if the purge
+           //  is going to fail.
+           //
+
+           bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                &liZero);
+       }
+       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+       {
+
+           bUserMapped = FALSE;
 
-        if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                   &liZero))
+           ntStatus = GetExceptionCode();
+
+           AFSDbgTrace(( 0,
+                         0,
+                         "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                         pObjectInfo->FileId.Cell,
+                         pObjectInfo->FileId.Volume,
+                         pObjectInfo->FileId.Vnode,
+                         pObjectInfo->FileId.Unique,
+                         ntStatus));
+       }
+
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                      &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread()));
+
+        AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+        if( bUserMapped)
         {
 
             ntStatus = STATUS_USER_MAPPED_FILE;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOverwriteSupersede (%08lX) File user mapped %wZ Status %08lX\n",
+                          "AFSProcessOverwriteSupersede (%p) File user mapped %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3133,17 +3593,20 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               DirectoryCB,
+                               *pDesiredAccess,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOverwriteSupersede (%08lX) Failed to initialize ccb %wZ Status %08lX\n",
+                          "AFSProcessOverwriteSupersede (%p) Failed to initialize ccb %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3151,21 +3614,17 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         bAllocatedCcb = TRUE;
 
         //
-        // Initialize the Ccb
+        // Set the file length to zero
         //
 
-        (*Ccb)->DirectoryCB = DirectoryCB;
-
-        (*Ccb)->GrantedAccess = *pDesiredAccess;
+        AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
+                        TRUE);
 
-        //
-        // Need to purge any data currently in the cache
-        //
+        bReleasePaging = TRUE;
 
-        CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                             NULL,
-                             0,
-                             FALSE);
+        liSaveSize = pObjectInfo->Fcb->Header.FileSize;
+        liSaveAlloc = pObjectInfo->Fcb->Header.AllocationSize;
+        liSaveVDL = pObjectInfo->Fcb->Header.ValidDataLength;
 
         pObjectInfo->Fcb->Header.FileSize.QuadPart = 0;
         pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = 0;
@@ -3187,10 +3646,18 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         KeQuerySystemTime( &pObjectInfo->LastAccessTime);
 
-        //KeQuerySystemTime( &pObjectInfo->CreationTime);
-
         KeQuerySystemTime( &pObjectInfo->LastWriteTime);
 
+        //
+        // Set the update flag accordingly
+        //
+
+        SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
+                                          AFS_FCB_FLAG_UPDATE_CREATE_TIME |
+                                          AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
+                                          AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
+                                          AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
+
         ntStatus = AFSUpdateFileInformation( &pParentObjectInfo->FileId,
                                              pObjectInfo,
                                              AuthGroup);
@@ -3198,44 +3665,22 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            pObjectInfo->Fcb->Header.ValidDataLength = liSaveVDL;
+            pObjectInfo->Fcb->Header.FileSize = liSaveSize;
+            pObjectInfo->Fcb->Header.AllocationSize = liSaveAlloc;
+            pObjectInfo->Fcb->ObjectInformation->EndOfFile = liSaveSize;
+            pObjectInfo->Fcb->ObjectInformation->AllocationSize = liSaveAlloc;
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
+                          "AFSProcessOverwriteSupersede (%p) Failed to update file information %wZ Status %08lX\n",
                           Irp,
                           &DirectoryCB->NameInformation.FileName,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
-                        TRUE);
-
-        bReleasePaging = TRUE;
-
-        pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
-
-        pFileObject->FsContext = (void *)pObjectInfo->Fcb;
-
-        pFileObject->FsContext2 = (void *)*Ccb;
-
-        //
-        // Set the update flag accordingly
-        //
-
-        SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_FILE_MODIFIED |
-                                          AFS_FCB_FLAG_UPDATE_CREATE_TIME |
-                                          AFS_FCB_FLAG_UPDATE_CHANGE_TIME |
-                                          AFS_FCB_FLAG_UPDATE_ACCESS_TIME |
-                                          AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME);
-
-        CcSetFileSizes( pFileObject,
-                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
-
-        AFSReleaseResource( pObjectInfo->Fcb->Header.PagingIoResource);
-
-        bReleasePaging = FALSE;
-
         ulAttributes |= FILE_ATTRIBUTE_ARCHIVE;
 
         if( ulCreateDisposition == FILE_SUPERSEDE)
@@ -3288,48 +3733,55 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             Irp->IoStatus.Information = FILE_OVERWRITTEN;
         }
 
-        //
-        // Increment the open count on this Fcb.
-        //
-
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
-                      pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
-
-        InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &pObjectInfo->Fcb->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOverwriteSupersede Increment handle count on Fcb %p Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+                      "AFSProcessOverwriteSupersede Increment child open handle count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %08lX Cnt %d\n",
-                      pObjectInfo->ParentObjectInformation,
-                      pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                      "AFSProcessOverwriteSupersede Increment child open ref count on Parent object %p Cnt %d\n",
+                      pParentObjectInfo,
+                      lCount));
+
+        AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
+
+        bReleaseFcb = FALSE;
 
         *Fcb = pObjectInfo->Fcb;
 
+        //
+        // Now that the Fcb->Resource has been dropped
+        // we can call CcSetFileSizes.  We are still holding
+        // the PagingIoResource
+        //
+
+        pFileObject->SectionObjectPointer = &pObjectInfo->Fcb->NPFcb->SectionObjectPointers;
+
+        pFileObject->FsContext = (void *)pObjectInfo->Fcb;
+
+        pFileObject->FsContext2 = (void *)*Ccb;
+
+        CcSetFileSizes( pFileObject,
+                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
 try_exit:
 
         if( bReleasePaging)
@@ -3341,17 +3793,20 @@ try_exit:
         if( bReleaseFcb)
         {
 
-            //
-            // Remove the reference we added above to prevent tear down
-            //
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb.
+                //
 
-            InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pObjectInfo->Fcb->OpenReferenceCount);
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSProcessOverwriteSupersede Decrement count on Fcb %08lX Cnt %d\n",
-                          pObjectInfo->Fcb,
-                          pObjectInfo->Fcb->OpenReferenceCount);
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOverwriteSupersede Decrement2 count on Fcb %p Cnt %d\n",
+                              pObjectInfo->Fcb,
+                              lCount));
+            }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
         }
@@ -3368,13 +3823,9 @@ try_exit:
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -3392,16 +3843,31 @@ AFSControlDeviceCreate( IN PIRP Irp)
     __Enter
     {
 
-        //
-        // For now, jsut let the open happen
-        //
-
-        Irp->IoStatus.Information = FILE_OPENED;
+        if ( KernelMode == Irp->RequestorMode) {
+            //
+            // For now, just let the open happen
+            //
+            Irp->IoStatus.Information = FILE_OPENED;
+        }
+        else
+        {
+            //
+            // Not from usermode, All access must be via
+            // the FS component (which will do the
+            // security check)
+            //
+            ntStatus = STATUS_ACCESS_DENIED;
+        }
     }
 
     return ntStatus;
 }
 
+//
+// AFSOpenIOCtlFcb does not release a DirOpenReferenceCount on
+// the ParentDirCB.
+//
+
 NTSTATUS
 AFSOpenIOCtlFcb( IN PIRP Irp,
                  IN GUID *AuthGroup,
@@ -3413,11 +3879,11 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
     NTSTATUS ntStatus = STATUS_SUCCESS;
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
-    BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocatedFcb = FALSE;
-    UNICODE_STRING uniFullFileName;
+    BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE;
     AFSPIOCtlOpenCloseRequestCB stPIOCtlOpen;
     AFSFileID stFileID;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
+    LONG lCount;
 
     __Enter
     {
@@ -3442,38 +3908,39 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
             }
         }
 
-        if( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb == NULL)
-        {
-
-            //
-            // Allocate and initialize the Fcb for the file.
-            //
+        //
+        // Allocate and initialize the Fcb for the file.
+        //
 
-            ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
-                                   Fcb);
+        ntStatus = AFSInitFcb( pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB);
 
-            if( !NT_SUCCESS( ntStatus))
-            {
+        *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSOpenIOCtlFcb (%08lX) Failed to initialize fcb Status %08lX\n",
-                              Irp,
-                              ntStatus);
+        if( !NT_SUCCESS( ntStatus))
+        {
 
-                try_return( ntStatus);
-            }
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenIOCtlFcb (%p) Failed to initialize fcb Status %08lX\n",
+                          Irp,
+                          ntStatus));
 
-            bAllocatedFcb = TRUE;
+            try_return( ntStatus);
         }
-        else
-        {
 
-            *Fcb = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb;
+        ntStatus = STATUS_SUCCESS;
 
-            AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
-                            TRUE);
-        }
+        //
+        // Increment the open reference and handle on the node
+        //
+
+        lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenIOCtlFcb Increment count on Fcb %p Cnt %d\n",
+                      (*Fcb),
+                      lCount));
 
         bReleaseFcb = TRUE;
 
@@ -3481,16 +3948,19 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB,
+                               0,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenIOCtlFcb (%08lX) Failed to initialize ccb Status %08lX\n",
+                          "AFSOpenIOCtlFcb (%p) Failed to initialize ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3498,12 +3968,6 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         bAllocatedCcb = TRUE;
 
         //
-        // Setup the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB;
-
-        //
         // Set the PIOCtl index
         //
 
@@ -3534,6 +3998,8 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
                                       AuthGroup,
                                       NULL,
                                       &stFileID,
+                                      NULL,
+                                      0,
                                       (void *)&stPIOCtlOpen,
                                       sizeof( AFSPIOCtlOpenCloseRequestCB),
                                       NULL,
@@ -3542,68 +4008,46 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenIOCtlFcb (%08lX) Failed service open Status %08lX\n",
+                          "AFSOpenIOCtlFcb (%p) Failed service open Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
         //
-        // Reference the directory entry
-        //
-
-        InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Increment count on %wZ DE %p Ccb %p Cnt %d\n",
-                      &(*Ccb)->DirectoryCB->NameInformation.FileName,
-                      (*Ccb)->DirectoryCB,
-                      (*Ccb),
-                      (*Ccb)->DirectoryCB->OpenReferenceCount);
-
-        //
-        // Increment the open reference and handle on the node
+        // Increment the handle on the node
         //
 
-        InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
-                      (*Fcb),
-                      (*Fcb)->OpenReferenceCount);
-
-        InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+        lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenIOCtlFcb Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      (*Fcb)->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
+                      "AFSOpenIOCtlFcb Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+                      lCount));
 
-        InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
+                      "AFSOpenIOCtlFcb Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+                      lCount));
 
         //
         // Return the open result for this file
@@ -3614,27 +4058,27 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
 try_exit:
 
         //
-        //Dereference the passed in parent since the returned dir entry
-        // is already referenced
-        //
-
-        InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenIOCtlFcb Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
-                      &ParentDirCB->NameInformation.FileName,
-                      ParentDirCB,
-                      NULL,
-                      ParentDirCB->OpenReferenceCount);
-
-        //
         // If we created the Fcb we need to release the resources
         //
 
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open reference and handle on the node
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenIOCtlFcb Decrement count on Fcb %p Cnt %d\n",
+                              (*Fcb),
+                              lCount));
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
@@ -3646,25 +4090,15 @@ try_exit:
 
                 AFSRemoveCcb( NULL,
                               *Ccb);
-
-                *Ccb = NULL;
             }
 
-            if( bAllocatedFcb)
-            {
-
-                //
-                // Need to tear down this Fcb since it is not in the tree for the worker thread
-                //
-
-                AFSRemoveFcb( *Fcb);
+            *Ccb = NULL;
 
-                pParentObjectInfo->Specific.Directory.PIOCtlDirectoryCB->ObjectInformation->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
-
-            *Ccb = NULL;
         }
     }
 
@@ -3683,71 +4117,103 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
     PFILE_OBJECT pFileObject = NULL;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
+    AFSObjectInfoCB *pObjectInfo = NULL;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSPipeOpenCloseRequestCB stPipeOpen;
+    LONG lCount;
 
     __Enter
     {
 
         pFileObject = pIrpSp->FileObject;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE_2,
-                      "AFSOpenSpecialShareFcb (%08lX) Processing Share %wZ open\n",
+                      "AFSOpenSpecialShareFcb (%p) Processing Share %wZ open\n",
                       Irp,
-                      &DirectoryCB->NameInformation.FileName);
+                      &DirectoryCB->NameInformation.FileName));
 
-        pParentObjectInfo = DirectoryCB->ObjectInformation->ParentObjectInformation;
+        pObjectInfo = DirectoryCB->ObjectInformation;
 
-        if( DirectoryCB->ObjectInformation->Fcb == NULL)
+        if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
-            //
+            pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                   &pObjectInfo->ParentFileId,
+                                                  TRUE);
+       }
+
+       *Fcb = pObjectInfo->Fcb;
+
+       if( *Fcb == NULL)
+       {
+
+           //
             // Allocate and initialize the Fcb for the file.
             //
 
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   Fcb);
+            ntStatus = AFSInitFcb( DirectoryCB);
+
+            *Fcb = pObjectInfo->Fcb;
 
             if( !NT_SUCCESS( ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSOpenSpecialShareFcb (%08lX) Failed to initialize fcb Status %08lX\n",
+                              "AFSOpenSpecialShareFcb (%p) Failed to initialize fcb Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
 
-            bAllocateFcb = TRUE;
+            if ( ntStatus != STATUS_REPARSE)
+            {
+
+                bAllocateFcb = TRUE;
+            }
+
+            ntStatus = STATUS_SUCCESS;
         }
         else
         {
 
-            *Fcb = DirectoryCB->ObjectInformation->Fcb;
-
             AFSAcquireExcl( &(*Fcb)->NPFcb->Resource,
                             TRUE);
         }
 
+        //
+        // Increment the open count on this Fcb
+        //
+
+        lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenSpecialShareFcb Increment count on Fcb %p Cnt %d\n",
+                      (*Fcb),
+                      lCount));
+
         bReleaseFcb = TRUE;
 
         //
         // Initialize the Ccb for the file.
         //
 
-        ntStatus = AFSInitCcb( Ccb);
+        ntStatus = AFSInitCcb( Ccb,
+                               DirectoryCB,
+                               0,
+                               0);
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenSpecialShareFcb (%08lX) Failed to initialize ccb Status %08lX\n",
+                          "AFSOpenSpecialShareFcb (%p) Failed to initialize ccb Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -3755,12 +4221,6 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         bAllocatedCcb = TRUE;
 
         //
-        // Setup the Ccb
-        //
-
-        (*Ccb)->DirectoryCB = DirectoryCB;
-
-        //
         // Call the service to open the share
         //
 
@@ -3782,6 +4242,8 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
                                       AuthGroup,
                                       &DirectoryCB->NameInformation.FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       (void *)&stPipeOpen,
                                       sizeof( AFSPipeOpenCloseRequestCB),
                                       NULL,
@@ -3790,54 +4252,42 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenSpecialShareFcb (%08lX) Failed service open Status %08lX\n",
+                          "AFSOpenSpecialShareFcb (%p) Failed service open Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
-                      (*Fcb),
-                      (*Fcb)->OpenReferenceCount);
-
-        InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+        lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX Cnt %d\n",
+                      "AFSOpenSpecialShareFcb Increment handle count on Fcb %p Cnt %d\n",
                       (*Fcb),
-                      (*Fcb)->OpenHandleCount);
+                      lCount));
 
         //
         // Increment the open reference and handle on the parent node
         //
 
-        InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX Cnt %d\n",
+                      "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
+                      lCount));
 
-        InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
+                      "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %p Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+                      lCount));
 
         //
         // Return the open result for this file
@@ -3850,6 +4300,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenSpecialShareFcb Decrement count on Fcb %p Cnt %d\n",
+                              (*Fcb),
+                              lCount));
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
@@ -3861,10 +4326,10 @@ try_exit:
 
                 AFSRemoveCcb( NULL,
                               *Ccb);
-
-                *Ccb = NULL;
             }
 
+            *Ccb = NULL;
+
             if( bAllocateFcb)
             {
 
@@ -3872,14 +4337,15 @@ try_exit:
                 // Need to tear down this Fcb since it is not in the tree for the worker thread
                 //
 
-                AFSRemoveFcb( *Fcb);
+                AFSAcquireExcl( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock,
+                                TRUE);
+
+                AFSRemoveFcb( &DirectoryCB->ObjectInformation->Fcb);
 
-                DirectoryCB->ObjectInformation->Fcb = NULL;
+                AFSReleaseResource( &DirectoryCB->ObjectInformation->NonPagedInfo->ObjectInfoLock);
             }
 
             *Fcb = NULL;
-
-            *Ccb = NULL;
         }
     }