Windows: Police Library IOCTLs
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCreate.cpp
index c534890..efe1a8c 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;
@@ -99,7 +99,7 @@ try_exit:
 
         NOTHING;
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
         AFSDbgLogMsg( 0,
@@ -107,6 +107,8 @@ try_exit:
                       "EXCEPTION - AFSCreate\n");
 
         ntStatus = STATUS_ACCESS_DENIED;
+
+        AFSDumpTraceFilesFnc();
     }
 
     //
@@ -136,16 +138,17 @@ 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;
     AFSDirectoryCB     *pParentDirectoryCB = NULL, *pDirectoryCB = NULL;
     ULONG               ulParseFlags = 0;
-    GUID                stAuthGroup;
+    GUID                stAuthGroup = {0};
     ULONG               ulNameProcessingFlags = 0;
     BOOLEAN             bOpenedReparsePoint = FALSE;
+    LONG                lCount;
 
     __Enter
     {
@@ -186,6 +189,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))
+        {
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_WARNING,
+                          "AFSCommonCreate (%08lX) Open request after shutdown\n",
+                          Irp);
+
+            try_return( ntStatus = STATUS_TOO_LATE);
+        }
+
         if( !BooleanFlagOn( AFSGlobalRoot->ObjectInformation.Flags, AFS_OBJECT_FLAGS_DIRECTORY_ENUMERATED))
         {
 
@@ -204,21 +222,6 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
         }
 
         //
-        // 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.
@@ -364,22 +367,24 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                               "AFSCommonCreate Failed to open root Status %08lX\n",
                               ntStatus);
 
-                InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &AFSGlobalRoot->DirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement1 count on &wZ DE %p Ccb %p Cnt %d\n",
                               &AFSGlobalRoot->DirectoryCB->NameInformation.FileName,
                               AFSGlobalRoot->DirectoryCB,
                               NULL,
-                              AFSGlobalRoot->DirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             try_return( ntStatus);
         }
 
         //
-        // We have our root node shared
+        // We have a reference on the root volume
         //
 
         bReleaseVolume = TRUE;
@@ -568,15 +573,15 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 // Perform in this order to prevent thrashing
                 //
 
-                InterlockedIncrement( &pParentDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedIncrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Increment1 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pParentDirectoryCB->NameInformation.FileName,
                               pParentDirectoryCB,
                               NULL,
-                              pParentDirectoryCB->OpenReferenceCount);
+                              lCount);
 
                 //
                 // Do NOT decrement the reference count on the pDirectoryCB yet.
@@ -610,15 +615,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 //
                 // It is now safe to drop the Reference Count
                 //
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement2 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pDirectoryCB->NameInformation.FileName,
                               pDirectoryCB,
                               NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             if( !NT_SUCCESS( ntStatus))
@@ -634,15 +641,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 // Decrement the reference on the parent
                 //
 
-                InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement3 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pParentDirectoryCB->NameInformation.FileName,
                               pParentDirectoryCB,
                               NULL,
-                              pParentDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             try_return( ntStatus);
@@ -694,37 +703,46 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 // fail with collision
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
-                              &pDirectoryCB->NameInformation.FileName,
-                              ntStatus);
-
                 if( pDirectoryCB != NULL)
                 {
 
-                    InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonCreate Object name collision on create of %wZ Status %08lX\n",
+                                  &pDirectoryCB->NameInformation.FileName,
+                                  ntStatus);
+
+                    lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
+                                  "AFSCommonCreate Decrement4 count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pDirectoryCB->NameInformation.FileName,
                                   pDirectoryCB,
                                   NULL,
-                                  pDirectoryCB->OpenReferenceCount);
+                                  lCount);
+
+                    ASSERT( lCount >= 0);
                 }
                 else
                 {
 
-                    InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonCreate Object name collision on create Status %08lX\n",
+                                  ntStatus);
+
+                    lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
+                                  "AFSCommonCreate Decrement5 count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pParentDirectoryCB->NameInformation.FileName,
                                   pParentDirectoryCB,
                                   NULL,
-                                  pParentDirectoryCB->OpenReferenceCount);
+                                  lCount);
+
+                    ASSERT( lCount >= 0);
                 }
 
                 try_return( ntStatus = STATUS_OBJECT_NAME_COLLISION);
@@ -759,7 +777,7 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
             // Dereference the parent entry
             //
 
-            InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+            lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
@@ -767,7 +785,9 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                           &pParentDirectoryCB->NameInformation.FileName,
                           pParentDirectoryCB,
                           NULL,
-                          pParentDirectoryCB->OpenReferenceCount);
+                          lCount);
+
+            ASSERT( lCount >= 0);
 
             try_return( ntStatus);
         }
@@ -826,28 +846,32 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                 if( pDirectoryCB != NULL)
                 {
 
-                    InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                    lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
+                                  "AFSCommonCreate Decrement7a count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pDirectoryCB->NameInformation.FileName,
                                   pDirectoryCB,
                                   NULL,
-                                  pDirectoryCB->OpenReferenceCount);
+                                  lCount);
+
+                    ASSERT( lCount >= 0);
                 }
                 else
                 {
 
-                    InterlockedDecrement( &pParentDirectoryCB->OpenReferenceCount);
+                    lCount = InterlockedDecrement( &pParentDirectoryCB->DirOpenReferenceCount);
 
                     AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
+                                  "AFSCommonCreate Decrement7b count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pParentDirectoryCB->NameInformation.FileName,
                                   pParentDirectoryCB,
                                   NULL,
-                                  pParentDirectoryCB->OpenReferenceCount);
+                                  lCount);
+
+                    ASSERT( lCount >= 0);
                 }
             }
 
@@ -873,15 +897,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                               "AFSCommonCreate (%08lX) Attempt to open root as delete on close\n",
                               Irp);
 
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement8 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pDirectoryCB->NameInformation.FileName,
                               pDirectoryCB,
                               NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
 
                 try_return( ntStatus = STATUS_CANNOT_DELETE);
             }
@@ -898,15 +924,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                               "AFSCommonCreate (%08lX) Attempt to open root as target directory\n",
                               Irp);
 
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement9 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pDirectoryCB->NameInformation.FileName,
                               pDirectoryCB,
                               NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
 
                 try_return( ntStatus = STATUS_INVALID_PARAMETER);
             }
@@ -926,18 +954,22 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonCreate Failed to open root (2) Status %08lX\n",
+                              "AFSCommonCreate Failed to open volume root %08lX-%08lX Status %08lX\n",
+                              pVolumeCB->ObjectInformation.FileId.Cell,
+                              pVolumeCB->ObjectInformation.FileId.Volume,
                               ntStatus);
 
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement10 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pDirectoryCB->NameInformation.FileName,
                               pDirectoryCB,
                               NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             try_return( ntStatus);
@@ -985,15 +1017,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                               &pDirectoryCB->NameInformation.FileName,
                               ntStatus);
 
-                InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
+                              "AFSCommonCreate Decrement11 count on %wZ DE %p Ccb %p Cnt %d\n",
                               &pDirectoryCB->NameInformation.FileName,
                               pDirectoryCB,
                               NULL,
-                              pDirectoryCB->OpenReferenceCount);
+                              lCount);
+
+                ASSERT( lCount >= 0);
             }
 
             try_return( ntStatus);
@@ -1020,15 +1054,17 @@ AFSCommonCreate( IN PDEVICE_OBJECT DeviceObject,
                           &pDirectoryCB->NameInformation.FileName,
                           ntStatus);
 
-            InterlockedDecrement( &pDirectoryCB->OpenReferenceCount);
+            lCount = InterlockedDecrement( &pDirectoryCB->DirOpenReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
+                          "AFSCommonCreate Decrement12 count on %wZ DE %p Ccb %p Cnt %d\n",
                           &pDirectoryCB->NameInformation.FileName,
                           pDirectoryCB,
                           NULL,
-                          pDirectoryCB->OpenReferenceCount);
+                          lCount);
+
+            ASSERT( lCount >= 0);
         }
 
 try_exit:
@@ -1040,6 +1076,13 @@ try_exit:
             if( pCcb != NULL)
             {
 
+                AFSAcquireExcl( &pCcb->NPCcb->CcbLock,
+                                TRUE);
+
+                RtlCopyMemory( &pCcb->AuthGroup,
+                               &stAuthGroup,
+                               sizeof( GUID));
+
                 //
                 // If we have a substitute name, then use it
                 //
@@ -1074,13 +1117,13 @@ try_exit:
 
                 AFSDbgLogMsg( 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 = pCcb->DirectoryCB->DirOpenReferenceCount);
 
-                ASSERT( pCcb->DirectoryCB->OpenReferenceCount > 0);
+                ASSERT( lCount >= 0);
 
                 pCcb->CurrentDirIndex = 0;
 
@@ -1097,6 +1140,8 @@ try_exit:
                 pCcb->NameArray = pNameArray;
 
                 pNameArray = NULL;
+
+                AFSReleaseResource( &pCcb->NPCcb->CcbLock);
             }
 
             //
@@ -1122,17 +1167,19 @@ try_exit:
 
                 ClearFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
 
-                RtlCopyMemory( &pFcb->AuthGroup,
-                               &stAuthGroup,
-                               sizeof( GUID));
-
                 //
                 // 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;
+                    }
                 }
 
                 //
@@ -1166,6 +1213,12 @@ try_exit:
                 //
 
                 KeQuerySystemTime( &pFcb->ObjectInformation->LastAccessTime);
+
+                if( pCcb != NULL)
+                {
+                    AFSInsertCcb( pFcb,
+                                  pCcb);
+                }
             }
             else
             {
@@ -1201,7 +1254,7 @@ try_exit:
             if( uniSubstitutedPathName.Buffer != NULL)
             {
 
-                AFSExFreePool( uniSubstitutedPathName.Buffer);
+                AFSExFreePoolWithTag( uniSubstitutedPathName.Buffer, 0);
 
                 ClearFlag( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER);
             }
@@ -1220,21 +1273,19 @@ try_exit:
         if( BooleanFlagOn( ulParseFlags, AFS_PARSE_FLAG_FREE_FILE_BUFFER))
         {
 
-            AFSExFreePool( uniRootFileName.Buffer);
+            AFSExFreePoolWithTag( uniRootFileName.Buffer, 0);
         }
 
         if( bReleaseVolume)
         {
 
-            InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
+            lCount = InterlockedDecrement( &pVolumeCB->VolumeReferenceCount);
 
             AFSDbgLogMsg( AFS_SUBSYSTEM_VOLUME_REF_COUNTING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonCreate Decrement count on Volume %08lX Cnt %d\n",
                           pVolumeCB,
-                          pVolumeCB->VolumeReferenceCount);
-
-            AFSReleaseResource( pVolumeCB->VolumeLock);
+                          lCount);
         }
 
         //
@@ -1248,84 +1299,13 @@ try_exit:
 }
 
 NTSTATUS
-AFSOpenRedirector( IN PIRP Irp,
-                   IN AFSFcb **Fcb,
-                   IN AFSCcb **Ccb)
-{
-
-    NTSTATUS ntStatus = STATUS_SUCCESS;
-
-    __Enter
-    {
-
-        //
-        // Initialize the Ccb for the file.
-        //
-
-        ntStatus = AFSInitCcb( Ccb);
-
-        if( !NT_SUCCESS( ntStatus))
-        {
-
-            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);
-
-        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);
-
-        *Fcb = AFSRedirectorRoot->RootFcb;
-
-        InterlockedIncrement( &(*Ccb)->DirectoryCB->OpenReferenceCount);
-
-        //
-        // Return the open result for this file
-        //
-
-        Irp->IoStatus.Information = FILE_OPENED;
-
-try_exit:
-
-        NOTHING;
-    }
-
-    return ntStatus;
-}
-
-NTSTATUS
 AFSOpenAFSRoot( IN PIRP Irp,
                 IN AFSFcb **Fcb,
                 IN AFSCcb **Ccb)
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    LONG lCount;
 
     __Enter
     {
@@ -1357,21 +1337,21 @@ AFSOpenAFSRoot( IN PIRP Irp,
         // Increment the open count on this Fcb
         //
 
-        InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
+        lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenAFSRoot Increment count on Fcb %08lX Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      AFSGlobalRoot->RootFcb->OpenReferenceCount);
+                      lCount);
 
-        InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &AFSGlobalRoot->RootFcb->OpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenAFSRoot Increment handle count on Fcb %08lX Cnt %d\n",
                       AFSGlobalRoot->RootFcb,
-                      AFSGlobalRoot->RootFcb->OpenHandleCount);
+                      lCount);
 
         *Fcb = AFSGlobalRoot->RootFcb;
 
@@ -1402,28 +1382,45 @@ 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;
+
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenRoot (%08lX) 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))
         {
@@ -1465,12 +1462,32 @@ AFSOpenRoot( IN PIRP Irp,
         if( !NT_SUCCESS( ntStatus))
         {
 
+            UNICODE_STRING uniGUID;
+
+            uniGUID.Length = 0;
+            uniGUID.MaximumLength = 0;
+            uniGUID.Buffer = NULL;
+
+            if( AuthGroup != NULL)
+            {
+                RtlStringFromGUID( *AuthGroup,
+                                   &uniGUID);
+            }
+
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSOpenRoot (%08lX) Failed open in service AFSRoot Status %08lX\n",
+                          "AFSOpenRoot (%08lX) Failed open in service volume %08lX-%08lX AuthGroup %wZ Status %08lX\n",
                           Irp,
+                          VolumeCB->ObjectInformation.FileId.Cell,
+                          VolumeCB->ObjectInformation.FileId.Volume,
+                          &uniGUID,
                           ntStatus);
 
+            if( AuthGroup != NULL)
+            {
+                RtlFreeUnicodeString( &uniGUID);
+            }
+
             try_return( ntStatus);
         }
 
@@ -1589,6 +1606,8 @@ AFSOpenRoot( IN PIRP Irp,
 
         (*Ccb)->DirectoryCB = VolumeCB->DirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // OK, update the share access on the fileobject
         //
@@ -1616,21 +1635,21 @@ AFSOpenRoot( IN PIRP Irp,
         // Increment the open count on this Fcb
         //
 
-        InterlockedIncrement( &VolumeCB->RootFcb->OpenReferenceCount);
+        lCount = 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);
+                      lCount);
 
-        InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
+        lCount = InterlockedIncrement( &VolumeCB->RootFcb->OpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenRoot Increment handle count on Fcb %08lX Cnt %d\n",
                       VolumeCB->RootFcb,
-                      VolumeCB->RootFcb->OpenHandleCount);
+                      lCount);
 
         //
         // Indicate the object is held
@@ -1660,7 +1679,8 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
 
                 *Ccb = NULL;
             }
@@ -1688,17 +1708,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
     {
@@ -1745,7 +1762,7 @@ AFSProcessCreate( IN PIRP               Irp,
                           "AFSProcessCreate Request failed due to read only volume %wZ\n",
                           FullFileName);
 
-            try_return( ntStatus = STATUS_ACCESS_DENIED);
+            try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
 
         pParentObjectInfo = ParentDirCB->ObjectInformation;
@@ -1799,16 +1816,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 ( pParentObjectInfo == pObjectInfo->ParentObjectInformation)
+                    {
+
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%08lX) 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 if ( pObjectInfo->ParentObjectInformation == NULL)
+                    {
+
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%08lX) 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
+                    {
+
+                        AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                      AFS_TRACE_LEVEL_ERROR,
+                                      "AFSProcessCreate (%08lX) 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->ParentObjectInformation->FileId.Cell,
+                                      pObjectInfo->ParentObjectInformation->FileId.Volume,
+                                      pObjectInfo->ParentObjectInformation->FileId.Vnode,
+                                      pObjectInfo->ParentObjectInformation->FileId.Unique,
+                                      ntStatus);
+                    }
+                }
+                else
+                {
+
+                    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);
+                }
 
                 try_return( ntStatus);
             }
@@ -1820,45 +1903,40 @@ AFSProcessCreate( IN PIRP               Irp,
         // 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.
-            //
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSProcessCreate (%08lX) 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;
-        }
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
+                      *Fcb,
+                      lCount);
 
         bReleaseFcb = TRUE;
 
@@ -1889,6 +1967,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
         (*Ccb)->DirectoryCB = pDirEntry;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // If this is a file, update the headers filesizes.
         //
@@ -1910,8 +1990,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_FILE_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
 
             (*Fcb)->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
         }
@@ -1936,12 +2016,13 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
         }
         else if( (*Fcb)->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
                  (*Fcb)->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
-                 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+                 (*Fcb)->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+                 (*Fcb)->Header.NodeTypeCode == AFS_INVALID_FCB)
         {
 
             //
@@ -1956,8 +2037,8 @@ AFSProcessCreate( IN PIRP               Irp,
 
             AFSFsRtlNotifyFullReportChange( pParentObjectInfo,
                                             *Ccb,
-                                                                               (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
-                                                                               (ULONG)FILE_ACTION_ADDED);
+                                            (ULONG)FILE_NOTIFY_CHANGE_DIR_NAME,
+                                            (ULONG)FILE_ACTION_ADDED);
         }
 
         //
@@ -1969,45 +2050,33 @@ AFSProcessCreate( IN PIRP               Irp,
                           pFileObject,
                           &(*Fcb)->ShareAccess);
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessCreate Increment count on Fcb %08lX Cnt %d\n",
-                      *Fcb,
-                      (*Fcb)->OpenReferenceCount);
-
-        InterlockedIncrement( &(*Fcb)->OpenHandleCount);
+        lCount = InterlockedIncrement( &(*Fcb)->OpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessCreate Increment handle count on Fcb %08lX 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( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_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);
+                      lCount);
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( 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);
+                      lCount);
 
         if( ulOptions & FILE_DELETE_ON_CLOSE)
         {
@@ -2047,6 +2116,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessCreate Decrement count on Fcb %08lX Cnt %d\n",
+                              *Fcb,
+                              lCount);
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
@@ -2072,18 +2156,24 @@ try_exit:
 
                 SetFlag( pDirEntry->Flags, AFS_DIR_ENTRY_DELETED);
 
+                AFSNotifyDelete( pDirEntry,
+                                 AuthGroup,
+                                 FALSE);
+
                 //
                 // Decrement the reference added during initialization of the DE
                 //
 
-                InterlockedDecrement( &pDirEntry->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pDirEntry->DirOpenReferenceCount);
 
                 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);
+                              lCount);
+
+                ASSERT( lCount >= 0);
 
                 //
                 // Pull the directory entry from the parent
@@ -2093,31 +2183,27 @@ try_exit:
                                             pDirEntry,
                                             FALSE); // Leave it in the enum list so the worker cleans it up
 
-                AFSNotifyDelete( pDirEntry,
-                                 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);
             }
 
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
 
@@ -2137,16 +2223,17 @@ 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;
     UNICODE_STRING uniTargetName;
+    LONG lCount;
 
     __Enter
     {
@@ -2172,41 +2259,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.
-            //
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenTargetDirectory (%08lX) 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;
-        }
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
+                      pParentObject->Fcb,
+                      lCount);
 
         bReleaseFcb = TRUE;
 
@@ -2264,6 +2351,8 @@ AFSOpenTargetDirectory( IN PIRP Irp,
 
         (*Ccb)->DirectoryCB = ParentDirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         if( TargetDirectoryCB != NULL &&
             FsRtlAreNamesEqual( &TargetDirectoryCB->NameInformation.FileName,
                                 TargetName,
@@ -2316,25 +2405,13 @@ AFSOpenTargetDirectory( IN PIRP Irp,
                               &pParentObject->Fcb->ShareAccess);
         }
 
-        //
-        // Increment the open count on this Fcb
-        //
-
-        InterlockedIncrement( &pParentObject->Fcb->OpenReferenceCount);
-
-        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSOpenTargetDirectory Increment count on Fcb %08lX Cnt %d\n",
-                      pParentObject->Fcb,
-                      pParentObject->Fcb->OpenReferenceCount);
-
-        InterlockedIncrement( &pParentObject->Fcb->OpenHandleCount);
+        lCount = 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
@@ -2343,21 +2420,21 @@ AFSOpenTargetDirectory( IN PIRP Irp,
         if( pParentObject->ParentObjectInformation != NULL)
         {
 
-            InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
+            lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
 
             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);
+                          lCount);
 
-            InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+            lCount = InterlockedIncrement( &pParentObject->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
 
             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);
+                          lCount);
         }
 
 try_exit:
@@ -2365,6 +2442,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &pParentObject->Fcb->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenTargetDirectory Decrement count on Fcb %08lX Cnt %d\n",
+                              pParentObject->Fcb,
+                              lCount);
+            }
+
             AFSReleaseResource( &pParentObject->Fcb->NPFcb->Resource);
         }
 
@@ -2374,18 +2466,15 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pParentObject->Fcb);
-
-                pParentObject->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -2403,14 +2492,14 @@ AFSProcessOpen( 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, bReleaseFcb = FALSE, bAllocatedFcb = FALSE;
-    ULONG ulAdditionalFlags = 0, ulOptions = 0;
+    BOOLEAN bAllocatedCcb = FALSE, bReleaseFcb = FALSE;
+    ULONG ulOptions = 0;
     AFSFileOpenCB   stOpenCB;
     AFSFileOpenResultCB stOpenResultCB;
     ULONG       ulResultLen = 0;
@@ -2418,6 +2507,7 @@ AFSProcessOpen( IN PIRP Irp,
     AFSObjectInfoCB *pObjectInfo = NULL;
     ULONG       ulFileAccess = 0;
     AFSFileAccessReleaseCB stReleaseFileAccess;
+    LONG lCount;
 
     __Enter
     {
@@ -2462,8 +2552,8 @@ AFSProcessOpen( IN PIRP Irp,
 
         ntStatus = AFSValidateEntry( DirectoryCB,
                                      AuthGroup,
-                                     TRUE,
-                                     FALSE);
+                                     FALSE,
+                                     TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
@@ -2486,6 +2576,7 @@ AFSProcessOpen( IN PIRP Irp,
         {
 
             ntStatus = AFSNotifyDelete( DirectoryCB,
+                                        AuthGroup,
                                         TRUE);
 
             if( !NT_SUCCESS( ntStatus))
@@ -2508,47 +2599,40 @@ AFSProcessOpen( IN PIRP Irp,
         // Be sure we have an Fcb for the current object
         //
 
-        if( pObjectInfo->Fcb == NULL)
-        {
-
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   &pObjectInfo->Fcb);
+        ntStatus = AFSInitFcb( DirectoryCB);
 
-            if( !NT_SUCCESS( ntStatus))
-            {
-
-                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);
-            }
+            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);
 
-            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,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOpen Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOpen Increment2 count on Fcb %08lX Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
+                      lCount);
 
         //
         // Check access on the entry
@@ -2592,8 +2676,29 @@ AFSProcessOpen( IN PIRP Irp,
                 BooleanFlagOn(ulOptions, FILE_DELETE_ON_CLOSE))
             {
 
-                if( !MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                          MmFlushForWrite))
+                BOOLEAN bMmFlushed;
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                              PsGetCurrentThread());
+
+                AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                                TRUE);
+
+                bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                  MmFlushForWrite);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Releasing Fcb SectionObject lock %08lX 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 :
@@ -2648,7 +2753,8 @@ AFSProcessOpen( IN PIRP Irp,
         }
         else if( pObjectInfo->Fcb->Header.NodeTypeCode == AFS_MOUNT_POINT_FCB ||
                  pObjectInfo->Fcb->Header.NodeTypeCode == AFS_SYMBOLIC_LINK_FCB ||
-                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB)
+                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_DFS_LINK_FCB ||
+                 pObjectInfo->Fcb->Header.NodeTypeCode == AFS_INVALID_FCB)
         {
 
         }
@@ -2753,6 +2859,8 @@ AFSProcessOpen( IN PIRP Irp,
 
         (*Ccb)->FileAccess = ulFileAccess;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
         // Perform the access check on the target if this is a mount point or symlink
         //
@@ -2776,45 +2884,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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOpen Increment handle count on Fcb %08lX 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( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_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);
+                      lCount);
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_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);
+                      lCount);
 
         if( BooleanFlagOn( ulOptions, FILE_DELETE_ON_CLOSE))
         {
@@ -2852,17 +2948,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);
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOpen Decrement2 count on Fcb %08lX Cnt %d\n",
+                              pObjectInfo->Fcb,
+                              lCount);
+            }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
         }
@@ -2893,18 +2992,15 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -2923,25 +3019,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;
@@ -2959,7 +3060,7 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
                           Irp,
                           &DirectoryCB->NameInformation.FileName);
 
-            try_return( ntStatus = STATUS_ACCESS_DENIED);
+            try_return( ntStatus = STATUS_MEDIA_WRITE_PROTECTED);
         }
 
         pParentObjectInfo = ParentDirCB->ObjectInformation;
@@ -2972,8 +3073,8 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         ntStatus = AFSValidateEntry( DirectoryCB,
                                      AuthGroup,
-                                     TRUE,
-                                     FALSE);
+                                     FALSE,
+                                     TRUE);
 
         if( !NT_SUCCESS( ntStatus))
         {
@@ -2992,47 +3093,38 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         // Be sure we have an Fcb for the object block
         //
 
-        if( pObjectInfo->Fcb == NULL)
-        {
-
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   Fcb);
-
-            if( !NT_SUCCESS( ntStatus))
-            {
-
-                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);
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSProcessOverwriteSupersede (%08lX) 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,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSProcessOverwriteSupersede Increment count on Fcb %08lX Cnt %d\n",
+                      "AFSProcessOverwriteSupersede Increment2 count on Fcb %08lX Cnt %d\n",
                       pObjectInfo->Fcb,
-                      pObjectInfo->Fcb->OpenReferenceCount);
+                      lCount);
+
+        bReleaseFcb = TRUE;
 
         //
         // Check access on the entry
@@ -3061,13 +3153,32 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             }
         }
 
+        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessOverwriteSupercede Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                      &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread());
+
+        AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                        TRUE);
+
         //
         //  Before we actually truncate, check to see if the purge
         //  is going to fail.
         //
 
-        if( !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                   &liZero))
+        bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                             &liZero);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSProcessOverwriteSupercede Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                      &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
+                      PsGetCurrentThread());
+
+        AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+        if( bUserMapped)
         {
 
             ntStatus = STATUS_USER_MAPPED_FILE;
@@ -3109,14 +3220,20 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
 
         (*Ccb)->DirectoryCB = DirectoryCB;
 
+        (*Ccb)->GrantedAccess = *pDesiredAccess;
+
         //
-        // Need to purge any data currently in the cache
+        // Set the file length to zero
         //
 
-        CcPurgeCacheSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                             NULL,
-                             0,
-                             FALSE);
+        AFSAcquireExcl( pObjectInfo->Fcb->Header.PagingIoResource,
+                        TRUE);
+
+        bReleasePaging = TRUE;
+
+        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;
@@ -3138,10 +3255,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);
@@ -3149,6 +3274,12 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
+            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;
+
             AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSProcessOverwriteSupersede (%08lX) Failed to update file information %wZ Status %08lX\n",
@@ -3159,34 +3290,6 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
             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)
@@ -3239,48 +3342,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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSProcessOverwriteSupersede Increment handle count on Fcb %08lX 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( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_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);
+                      lCount);
 
-        InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+        lCount = InterlockedIncrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_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);
+                      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)
@@ -3292,17 +3402,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);
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSProcessOverwriteSupersede Decrement2 count on Fcb %08lX Cnt %d\n",
+                              pObjectInfo->Fcb,
+                              lCount);
+            }
 
             AFSReleaseResource( pObjectInfo->Fcb->Header.Resource);
         }
@@ -3313,18 +3426,15 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
             *Ccb = NULL;
 
-            if( bAllocatedFcb)
-            {
-
-                AFSRemoveFcb( pObjectInfo->Fcb);
-
-                pObjectInfo->Fcb = NULL;
-            }
+            //
+            // Fcb will be freed by AFSPrimaryVolumeWorker thread
+            //
 
             *Fcb = NULL;
         }
@@ -3342,11 +3452,21 @@ 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;
@@ -3363,11 +3483,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
     {
@@ -3392,38 +3512,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);
-            }
+            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSOpenIOCtlFcb (%08lX) 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);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenIOCtlFcb Increment count on Fcb %08lX Cnt %d\n",
+                      (*Fcb),
+                      lCount);
 
         bReleaseFcb = TRUE;
 
@@ -3505,7 +3626,7 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
         // Reference the directory entry
         //
 
-        InterlockedIncrement( &((*Ccb)->DirectoryCB->OpenReferenceCount));
+        lCount = InterlockedIncrement( &((*Ccb)->DirectoryCB->DirOpenReferenceCount));
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -3513,47 +3634,39 @@ AFSOpenIOCtlFcb( IN PIRP Irp,
                       &(*Ccb)->DirectoryCB->NameInformation.FileName,
                       (*Ccb)->DirectoryCB,
                       (*Ccb),
-                      (*Ccb)->DirectoryCB->OpenReferenceCount);
+                      lCount);
 
         //
-        // 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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment handle count on Fcb %08lX 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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment child open handle count on Parent object %08lX 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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenIOCtlFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+                      lCount);
 
         //
         // Return the open result for this file
@@ -3568,7 +3681,7 @@ try_exit:
         // is already referenced
         //
 
-        InterlockedDecrement( &ParentDirCB->OpenReferenceCount);
+        lCount = InterlockedDecrement( &ParentDirCB->DirOpenReferenceCount);
 
         AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -3576,7 +3689,9 @@ try_exit:
                       &ParentDirCB->NameInformation.FileName,
                       ParentDirCB,
                       NULL,
-                      ParentDirCB->OpenReferenceCount);
+                      lCount);
+
+        ASSERT( lCount >= 0);
 
         //
         // If we created the Fcb we need to release the resources
@@ -3585,6 +3700,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open reference and handle on the node
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenIOCtlFcb Decrement count on Fcb %08lX Cnt %d\n",
+                              (*Fcb),
+                              lCount);
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
@@ -3594,26 +3724,17 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
-
-                *Ccb = NULL;
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
-            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;
         }
     }
 
@@ -3634,6 +3755,7 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
     BOOLEAN bReleaseFcb = FALSE, bAllocatedCcb = FALSE, bAllocateFcb = FALSE;
     AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSPipeOpenCloseRequestCB stPipeOpen;
+    LONG lCount;
 
     __Enter
     {
@@ -3655,8 +3777,9 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
             // Allocate and initialize the Fcb for the file.
             //
 
-            ntStatus = AFSInitFcb( DirectoryCB,
-                                   Fcb);
+            ntStatus = AFSInitFcb( DirectoryCB);
+
+            *Fcb = DirectoryCB->ObjectInformation->Fcb;
 
             if( !NT_SUCCESS( ntStatus))
             {
@@ -3670,7 +3793,13 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
                 try_return( ntStatus);
             }
 
-            bAllocateFcb = TRUE;
+            if ( ntStatus != STATUS_REPARSE)
+            {
+
+                bAllocateFcb = TRUE;
+            }
+
+            ntStatus = STATUS_SUCCESS;
         }
         else
         {
@@ -3681,6 +3810,18 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
                             TRUE);
         }
 
+        //
+        // Increment the open count on this Fcb
+        //
+
+        lCount = InterlockedIncrement( &(*Fcb)->OpenReferenceCount);
+
+        AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSOpenSpecialShareFcb Increment count on Fcb %08lX Cnt %d\n",
+                      (*Fcb),
+                      lCount);
+
         bReleaseFcb = TRUE;
 
         //
@@ -3748,45 +3889,33 @@ AFSOpenSpecialShareFcb( IN PIRP Irp,
             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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment handle count on Fcb %08lX 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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment child open handle count on Parent object %08lX 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,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSOpenSpecialShareFcb Increment child open ref count on Parent object %08lX Cnt %d\n",
                       pParentObjectInfo,
-                      pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+                      lCount);
 
         //
         // Return the open result for this file
@@ -3799,6 +3928,21 @@ try_exit:
         if( bReleaseFcb)
         {
 
+            if( !NT_SUCCESS( ntStatus))
+            {
+                //
+                // Decrement the open count on this Fcb
+                //
+
+                lCount = InterlockedDecrement( &(*Fcb)->OpenReferenceCount);
+
+                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSOpenSpecialShareFcb Decrement count on Fcb %08lX Cnt %d\n",
+                              (*Fcb),
+                              lCount);
+            }
+
             AFSReleaseResource( &(*Fcb)->NPFcb->Resource);
         }
 
@@ -3808,11 +3952,12 @@ try_exit:
             if( bAllocatedCcb)
             {
 
-                AFSRemoveCcb( *Ccb);
-
-                *Ccb = NULL;
+                AFSRemoveCcb( NULL,
+                              *Ccb);
             }
 
+            *Ccb = NULL;
+
             if( bAllocateFcb)
             {
 
@@ -3820,14 +3965,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;
         }
     }