Windows: AFSFindObjectInfo update last access time
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSClose.cpp
index 959aad9..5fc49ad 100644 (file)
@@ -54,15 +54,16 @@ NTSTATUS
 AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
           IN PIRP Irp)
 {
-
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    ULONG ulRequestType = 0;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     AFSFcb *pFcb = NULL;
     AFSDeviceExt *pDeviceExt = NULL;
     AFSCcb *pCcb = NULL;
     AFSObjectInfoCB *pObjectInfo = NULL;
+    AFSObjectInfoCB *pParentObjectInfo = NULL;
     AFSDirectoryCB *pDirCB = NULL;
+    LONG lCount;
 
     __try
     {
@@ -103,11 +104,11 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 AFSPIOCtlOpenCloseRequestCB stPIOCtlClose;
                 AFSFileID stParentFileId;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Acquiring GlobalRoot lock %08lX EXCL %08lX\n",
+                              "AFSClose Acquiring GlobalRoot lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
                                   TRUE);
@@ -128,7 +129,7 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 RtlZeroMemory( &stParentFileId,
                                sizeof( AFSFileID));
 
-                stParentFileId = pObjectInfo->ParentObjectInformation->FileId;
+                stParentFileId = pObjectInfo->ParentFileId;
 
                 //
                 // Issue the close request to the service
@@ -136,76 +137,59 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_CLOSE,
                                    AFS_REQUEST_FLAG_SYNCHRONOUS,
-                                   &pFcb->AuthGroup,
+                                   &pCcb->AuthGroup,
                                    NULL,
                                    &stParentFileId,
+                                   NULL,
+                                   0,
                                    (void *)&stPIOCtlClose,
                                    sizeof( AFSPIOCtlOpenCloseRequestCB),
                                    NULL,
                                    NULL);
 
-                pDirCB = pCcb->DirectoryCB;
-
                 //
                 // Remove the Ccb and de-allocate it
                 //
 
-                ntStatus = AFSRemoveCcb( pCcb);
-
-                if( !NT_SUCCESS( ntStatus))
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_WARNING,
-                                  "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
-                    //
-                    // We can't actually fail a close operation so reset the status
-                    //
-
-                    ntStatus = STATUS_SUCCESS;
-                }
-
-                ASSERT( pDirCB->OpenReferenceCount > 0);
-
-                InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose (IOCtl) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirCB->NameInformation.FileName,
-                              pDirCB,
-                              pCcb,
-                              pDirCB->OpenReferenceCount);
+                AFSRemoveCcb( pFcb,
+                              pCcb);
 
                 //
                 // If this is not the root then decrement the open child reference count
                 //
 
-                if( pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                 {
 
-                    InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId,
+                                                           FALSE);
+                }
+
+                if( pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
+                {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSClose (IOCtl) Decrement child open ref count on Parent object %08lX Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
-                                  pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                                  "AFSClose (IOCtl) Decrement child open ref count on Parent object %p Cnt %d\n",
+                                  pParentObjectInfo,
+                                  pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount));
                 }
 
                 AFSReleaseResource( &pFcb->NPFcb->Resource);
 
-                ASSERT( pFcb->OpenReferenceCount != 0);
-
-                InterlockedDecrement( &pFcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose (IOCtl) Decrement count on Fcb %08lX Cnt %d\n",
+                              "AFSClose (IOCtl) Decrement count on Fcb %p Cnt %d\n",
                               pFcb,
-                              pFcb->OpenReferenceCount);
+                              lCount));
+
+                ASSERT( lCount >= 0);
 
                 break;
             }
@@ -213,62 +197,35 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
             case AFS_ROOT_ALL:
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Acquiring Special Root ALL lock %08lX EXCL %08lX\n",
+                              "AFSClose Acquiring Special Root ALL lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
                                 TRUE);
 
                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
 
-                pDirCB = pCcb->DirectoryCB;
-
                 //
                 // Remove the Ccb and de-allocate it
                 //
 
-                ntStatus = AFSRemoveCcb( pCcb);
-
-                if( !NT_SUCCESS( ntStatus))
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_WARNING,
-                                  "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
-                    //
-                    // We can't actually fail a close operation so reset the status
-                    //
-
-                    ntStatus = STATUS_SUCCESS;
-                }
-
-                ASSERT( pDirCB->OpenReferenceCount > 0);
-
-                InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Decrement (Root ALL) count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirCB->NameInformation.FileName,
-                              pDirCB,
-                              pCcb,
-                              pDirCB->OpenReferenceCount);
+                AFSRemoveCcb( pFcb,
+                              pCcb);
 
                 AFSReleaseResource( &pFcb->NPFcb->Resource);
 
-                ASSERT( pFcb->OpenReferenceCount > 0);
-
-                InterlockedDecrement( &pFcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose (RootAll) Decrement count on Fcb %08lX Cnt %d\n",
+                              "AFSClose (RootAll) Decrement count on Fcb %p Cnt %d\n",
                               pFcb,
-                              pFcb->OpenReferenceCount);
+                              lCount));
+
+                ASSERT( lCount >= 0);
 
                 break;
             }
@@ -283,6 +240,7 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
             case AFS_SYMBOLIC_LINK_FCB:
             case AFS_MOUNT_POINT_FCB:
             case AFS_DFS_LINK_FCB:
+            case AFS_INVALID_FCB:
             {
 
                 pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
@@ -291,39 +249,95 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 // We may be performing some cleanup on the Fcb so grab it exclusive to ensure no collisions
                 //
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Acquiring Dcb lock %08lX EXCL %08lX\n",
+                              "AFSClose Acquiring Dcb lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
                                 TRUE);
 
                 KeQueryTickCount( &pFcb->ObjectInformation->LastAccessCount);
 
+                if( pFcb->OpenReferenceCount == 1 &&
+                    pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+                {
+
+                    SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
+
+                    //
+                    // Attempt to tear down our extent list for the file
+                    // If there are remaining dirty extents then attempt to
+                    // flush them as well
+                    //
+
+                    if( pFcb->Specific.File.ExtentsDirtyCount)
+                    {
+
+                        AFSFlushExtents( pFcb,
+                                         &pCcb->AuthGroup);
+                    }
+
+                    //
+                    // Wait for any outstanding queued flushes to complete
+                    //
+
+                    AFSWaitOnQueuedFlushes( pFcb);
+
+                    ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
+                            pFcb->Specific.File.QueuedFlushCount == 0);
+
+                    AFSReleaseResource( &pFcb->NPFcb->Resource);
+
+                    //
+                    // Tear 'em down, we'll not be needing them again
+                    //
+
+                    AFSTearDownFcbExtents( pFcb,
+                                           &pCcb->AuthGroup);
+                }
+                else
+                {
+
+                    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
+                        pFcb->Specific.File.ExtentsDirtyCount &&
+                        (pCcb->GrantedAccess & FILE_WRITE_DATA))
+                    {
+
+                        AFSFlushExtents( pFcb,
+                                         &pCcb->AuthGroup);
+                    }
+
+                    AFSReleaseResource( &pFcb->NPFcb->Resource);
+                }
+
                 pDirCB = pCcb->DirectoryCB;
 
                 //
-                // Remove the Ccb and de-allocate it
+                // Steal the DirOpenReferenceCount from the Ccb
                 //
 
-                ntStatus = AFSRemoveCcb( pCcb);
+                pCcb->DirectoryCB = NULL;
 
-                if( !NT_SUCCESS( ntStatus))
+                //
+                // Object the Parent ObjectInformationCB
+                //
+
+                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_WARNING,
-                                  "AFSClose Failed to remove Ccb from Fcb Status %08lX\n",
-                                  ntStatus);
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId,
+                                                           FALSE);
+                }
 
-                    //
-                    // We can't actually fail a close operation so reset the status
-                    //
+                //
+                // Remove the Ccb and de-allocate it
+                //
 
-                    ntStatus = STATUS_SUCCESS;
-                }
+                AFSRemoveCcb( pFcb,
+                              pCcb);
 
                 //
                 // If this entry is deleted then remove the object from the volume tree
@@ -332,18 +346,19 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 if( BooleanFlagOn( pDirCB->Flags, AFS_DIR_ENTRY_DELETED))
                 {
 
-                    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
+                    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB &&
+                        pObjectInfo->Links == 0)
                     {
 
                         //
                         // Stop anything possibly in process
                         //
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSClose Acquiring Fcb extents lock %08lX EXCL %08lX\n",
+                                      "AFSClose Acquiring Fcb extents lock %p EXCL %08lX\n",
                                       &pFcb->NPFcb->Specific.File.ExtentsResource,
-                                      PsGetCurrentThread());
+                                      PsGetCurrentThread()));
 
                         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
                                         TRUE);
@@ -354,99 +369,102 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                                     0,
                                     FALSE);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSClose Releasing Fcb extents lock %08lX EXCL %08lX\n",
+                                      "AFSClose Releasing Fcb extents lock %p EXCL %08lX\n",
                                       &pFcb->NPFcb->Specific.File.ExtentsResource,
-                                      PsGetCurrentThread());
+                                      PsGetCurrentThread()));
 
                         AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
                     }
 
-                    AFSAcquireExcl( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock,
-                                    TRUE);
-
-                    AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
-                                    TRUE);
+                    ASSERT( pParentObjectInfo != NULL);
 
-                    if ( pDirCB->OpenReferenceCount == 0)
+                    if ( pParentObjectInfo != NULL)
                     {
-                        AFSDbgLogMsg( 0,
-                                      0,
-                                      "AFSClose (Other) OpenReferenceCount is Zero on DE %08lX Ccb %08lX FileName %wZ\n",
-                                      pDirCB,
-                                      pCcb,
-                                      &pDirCB->NameInformation.FileName);
-                    }
-
-                    ASSERT( pDirCB->OpenReferenceCount > 0);
-
-                    InterlockedDecrement( &pDirCB->OpenReferenceCount);
+                        AFSAcquireExcl( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock,
+                                        TRUE);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
-                                  &pDirCB->NameInformation.FileName,
-                                  pDirCB,
-                                  pCcb,
-                                  pDirCB->OpenReferenceCount);
+                        AFSAcquireExcl( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock,
+                                        TRUE);
 
-                    if( pDirCB->OpenReferenceCount == 0)
-                    {
+                        lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
 
-                        AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                        AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                       AFS_TRACE_LEVEL_VERBOSE,
-                                      "AFSClose Deleting dir entry %08lX (%08lX) for %wZ\n",
+                                      "AFSClose (Other) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
+                                      &pDirCB->NameInformation.FileName,
                                       pDirCB,
-                                      pObjectInfo,
-                                      &pDirCB->NameInformation.FileName);
-
-                        //
-                        // Remove and delete the directory entry from the parent list
-                        //
+                                      pCcb,
+                                      lCount));
 
-                        AFSDeleteDirEntry( pObjectInfo->ParentObjectInformation,
-                                           pDirCB);
+                        ASSERT( lCount >= 0);
 
-                        if( pObjectInfo->ObjectReferenceCount == 0)
+                        if( lCount == 0 &&
+                            pDirCB->NameArrayReferenceCount <= 0)
                         {
 
-                            if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+                            AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                                          AFS_TRACE_LEVEL_VERBOSE,
+                                          "AFSClose Deleting dir entry %p (%p) for %wZ  FID %08lX-%08lX-%08lX-%08lX\n",
+                                          pDirCB,
+                                          pObjectInfo,
+                                          &pDirCB->NameInformation.FileName,
+                                          pObjectInfo->FileId.Cell,
+                                          pObjectInfo->FileId.Volume,
+                                          pObjectInfo->FileId.Vnode,
+                                          pObjectInfo->FileId.Unique));
+
+                            //
+                            // Remove and delete the directory entry from the parent list
+                            //
+
+                            AFSDeleteDirEntry( pParentObjectInfo,
+                                               &pDirCB);
+
+                            AFSAcquireShared( &pObjectInfo->NonPagedInfo->ObjectInfoLock,
+                                              TRUE);
+
+                            if( pObjectInfo->ObjectReferenceCount <= 0)
                             {
 
-                                AFSDbgLogMsg( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
-                                              AFS_TRACE_LEVEL_VERBOSE,
-                                              "AFSClose Removing object %08lX from volume tree\n",
-                                              pObjectInfo);
+                                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE))
+                                {
+
+                                    AFSDbgTrace(( AFS_SUBSYSTEM_CLEANUP_PROCESSING,
+                                                  AFS_TRACE_LEVEL_VERBOSE,
+                                                  "AFSClose Removing object %p from volume tree\n",
+                                                  pObjectInfo));
 
-                                AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
-                                                    &pObjectInfo->TreeEntry);
+                                    AFSRemoveHashEntry( &pObjectInfo->VolumeCB->ObjectInfoTree.TreeHead,
+                                                        &pObjectInfo->TreeEntry);
 
-                                ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+                                    ClearFlag( pObjectInfo->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+                                }
                             }
 
-                            SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_DELETED);
+                            AFSReleaseResource( &pObjectInfo->NonPagedInfo->ObjectInfoLock);
                         }
-                    }
 
-                    AFSReleaseResource( pObjectInfo->ParentObjectInformation->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                        AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
 
-                    AFSReleaseResource( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock);
+                        AFSReleaseResource( pParentObjectInfo->Specific.Directory.DirectoryNodeHdr.TreeLock);
+                    }
                 }
                 else
                 {
 
-                    ASSERT( pDirCB->OpenReferenceCount > 0);
-
-                    InterlockedDecrement( &pDirCB->OpenReferenceCount);
+                    lCount = InterlockedDecrement( &pDirCB->DirOpenReferenceCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSClose (Other2) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
                                   &pDirCB->NameInformation.FileName,
                                   pDirCB,
                                   pCcb,
-                                  pDirCB->OpenReferenceCount);
+                                  lCount));
+
+                    ASSERT( lCount >= 0);
                 }
 
                 //
@@ -454,100 +472,32 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 //
 
                 if( pObjectInfo != NULL &&
-                    pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                    pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
                 {
 
-                    InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSClose Decrement child open ref count on Parent object %08lX Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
-                                  pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
-                }
-
-                if( pFcb->OpenReferenceCount == 1 &&
-                    pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
-                {
-
-                    SetFlag( pFcb->Flags, AFS_FCB_FILE_CLOSED);
-
-                    //
-                    // Attempt to tear down our extent list for the file
-                    // If there are remaining dirty extents then attempt to
-                    // flush them as well
-                    //
-
-                    if( pFcb->Specific.File.ExtentsDirtyCount)
-                    {
-
-                        AFSFlushExtents( pFcb);
-                    }
-
-                    //
-                    // Wait for any outstanding queued flushes to complete
-                    //
-
-                    AFSWaitOnQueuedFlushes( pFcb);
-
-                    ASSERT( pFcb->Specific.File.ExtentsDirtyCount == 0 &&
-                            pFcb->Specific.File.QueuedFlushCount == 0);
-
-                    AFSReleaseResource( &pFcb->NPFcb->Resource);
-
-                    //
-                    // Tear 'em down, we'll not be needing them again
-                    //
-
-                    if( AFSTearDownFcbExtents( pFcb))
-                    {
-
-                        //
-                        // Indicate to the service that the file required complete flushing to the
-                        // server.
-                        //
-
-                        AFSProcessRequest( AFS_REQUEST_TYPE_FLUSH_FILE,
-                                           AFS_REQUEST_FLAG_SYNCHRONOUS,
-                                           &pFcb->AuthGroup,
-                                           NULL,
-                                           &pFcb->ObjectInformation->FileId,
-                                           NULL,
-                                           0,
-                                           NULL,
-                                           NULL);
-                    }
-                }
-                else
-                {
-
-                    if( pFcb->Header.NodeTypeCode == AFS_FILE_FCB)
-                    {
-
-                        if( pFcb->Specific.File.ExtentsDirtyCount)
-                        {
-
-                            AFSFlushExtents( pFcb);
-                        }
-                    }
-
-                    AFSReleaseResource( &pFcb->NPFcb->Resource);
+                                  "AFSClose Decrement child open ref count on Parent object %p Cnt %d\n",
+                                  pParentObjectInfo,
+                                  pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount));
                 }
 
                 //
                 // Decrement the reference count on the Fcb. this is protecting it from teardown.
                 //
 
-                ASSERT( pFcb->OpenReferenceCount != 0);
-
-                InterlockedDecrement( &pFcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Decrement count on Fcb %08lX Cnt %d\n",
+                              "AFSClose Decrement count on Fcb %p Cnt %d\n",
                               pFcb,
-                              pFcb->OpenReferenceCount);
+                              lCount));
+
+                ASSERT( lCount >= 0);
 
                 break;
             }
@@ -557,19 +507,29 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSPipeOpenCloseRequestCB stPipeClose;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
+
+                //
+                // Object the Parent ObjectInformationCB
+                //
+
+                if( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
+                {
+
+                    pParentObjectInfo = AFSFindObjectInfo( pObjectInfo->VolumeCB,
+                                                           &pObjectInfo->ParentFileId,
+                                                           FALSE);
+                }
+
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose Acquiring Special Share lock %08lX EXCL %08lX\n",
+                              "AFSClose Acquiring Special Share lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
                                 TRUE);
 
-                pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
-
-                pDirCB = pCcb->DirectoryCB;
-
                 RtlZeroMemory( &stPipeClose,
                                sizeof( AFSPipeOpenCloseRequestCB));
 
@@ -587,6 +547,8 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                                    &pFcb->AuthGroup,
                                    &pDirCB->NameInformation.FileName,
                                    NULL,
+                                   NULL,
+                                   0,
                                    (void *)&stPipeClose,
                                    sizeof( AFSPipeOpenCloseRequestCB),
                                    NULL,
@@ -597,72 +559,47 @@ AFSClose( IN PDEVICE_OBJECT LibDeviceObject,
                 // Remove the Ccb and de-allocate it
                 //
 
-                ntStatus = AFSRemoveCcb( pCcb);
-
-                if( !NT_SUCCESS( ntStatus))
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_WARNING,
-                                  "AFSClose Failed to remove Ccb from Fcb Status %08lX\n", ntStatus);
-
-                    //
-                    // We can't actually fail a close operation so reset the status
-                    //
-
-                    ntStatus = STATUS_SUCCESS;
-                }
-
-                ASSERT( pDirCB->OpenReferenceCount > 0);
-
-                InterlockedDecrement( &pDirCB->OpenReferenceCount);
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_DIRENTRY_REF_COUNTING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose (Share) Decrement count on %wZ DE %p Ccb %p Cnt %d\n",
-                              &pDirCB->NameInformation.FileName,
-                              pDirCB,
-                              pCcb,
-                              pDirCB->OpenReferenceCount);
+                AFSRemoveCcb( pFcb,
+                              pCcb);
 
                 //
                 // If this is not the root then decrement the open child reference count
                 //
 
-                if( pObjectInfo->ParentObjectInformation != NULL &&
-                    pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount > 0)
+                if( pParentObjectInfo != NULL &&
+                    pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount > 0)
                 {
 
-                    InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                    lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenReferenceCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSClose (Share) Decrement child open ref count on Parent object %08lX Cnt %d\n",
-                                  pObjectInfo->ParentObjectInformation,
-                                  pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenReferenceCount);
+                                  "AFSClose (Share) Decrement child open ref count on Parent object %p Cnt %d\n",
+                                  pParentObjectInfo,
+                                  lCount));
                 }
 
                 AFSReleaseResource( &pFcb->NPFcb->Resource);
 
-                ASSERT( pFcb->OpenReferenceCount != 0);
-
-                InterlockedDecrement( &pFcb->OpenReferenceCount);
+                lCount = InterlockedDecrement( &pFcb->OpenReferenceCount);
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSClose (Share) Decrement count on Fcb %08lX Cnt %d\n",
+                              "AFSClose (Share) Decrement count on Fcb %p Cnt %d\n",
                               pFcb,
-                              pFcb->OpenReferenceCount);
+                              lCount));
+
+                ASSERT( lCount >= 0);
 
                 break;
             }
 
             default:
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSClose Processing unknown node type %d\n",
-                              pFcb->Header.NodeTypeCode);
+                              pFcb->Header.NodeTypeCode));
 
                 break;
         }
@@ -676,12 +613,20 @@ try_exit:
         AFSCompleteRequest( Irp,
                             ntStatus);
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
-        AFSDbgLogMsg( 0,
+        AFSDbgTrace(( 0,
                       0,
-                      "EXCEPTION - AFSClose\n");
+                      "EXCEPTION - AFSClose\n"));
+
+        AFSDumpTraceFilesFnc();
+    }
+
+    if ( pParentObjectInfo != NULL)
+    {
+
+        AFSReleaseObjectInfo( &pParentObjectInfo);
     }
 
     return ntStatus;