Windows: AFSCleanupFile always flush on last handle
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSCleanup.cpp
index 52a63d7..a6c1ec5 100644 (file)
@@ -54,7 +54,7 @@ NTSTATUS
 AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
             IN PIRP Irp)
 {
-
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSDeviceExt *pDeviceExt = NULL;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
@@ -147,28 +147,28 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring GlobalRoot lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring GlobalRoot lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
                 AFSAcquireExcl( &pFcb->NPFcb->Resource,
                                   TRUE);
 
-                ASSERT( pFcb->OpenHandleCount != 0);
+                FsRtlNotifyCleanup( pControlDeviceExt->Specific.Control.NotifySync,
+                                    &pControlDeviceExt->Specific.Control.DirNotifyList,
+                                    pCcb);
 
-                AFSReleaseResource( &pFcb->NPFcb->Resource);
+                ASSERT( pFcb->OpenHandleCount != 0);
 
                 lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (RootAll) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (RootAll) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
-                FsRtlNotifyCleanup( pControlDeviceExt->Specific.Control.NotifySync,
-                                    &pControlDeviceExt->Specific.Control.DirNotifyList,
-                                    pCcb);
+                AFSReleaseResource( &pFcb->NPFcb->Resource);
 
                 break;
             }
@@ -178,7 +178,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring PIOCtl lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring PIOCtl lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -197,9 +197,9 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                     lCount = InterlockedDecrement( &pObjectInfo->ParentObjectInformation->Specific.Directory.ChildOpenHandleCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanup (IOCtl) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+                                  "AFSCleanup (IOCtl) Decrement child open handle count on Parent object %p Cnt %d\n",
                                   pObjectInfo->ParentObjectInformation,
                                   lCount);
                 }
@@ -210,7 +210,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (IOCtl) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (IOCtl) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
@@ -230,7 +230,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
@@ -321,7 +321,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Tearing down cache map for Fcb %08lX FileObject %08lX\n",
+                              "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n",
                               pFcb,
                               pFileObject);
 
@@ -332,7 +332,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Releasing Fcb SectionObject lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->SectionObjectResource,
                               PsGetCurrentThread());
 
@@ -340,7 +340,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring Fcb lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring Fcb lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -484,7 +484,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup Acquiring Fcb extents lock %08lX EXCL %08lX\n",
+                                          "AFSCleanup Acquiring Fcb extents lock %p EXCL %08lX\n",
                                           &pFcb->NPFcb->Specific.File.ExtentsResource,
                                           PsGetCurrentThread());
 
@@ -498,16 +498,14 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                                         FALSE);
 
                             //
-                            // Before telling the server about the deleted file, tear down all extents for
-                            // the file
+                            // The file has been deleted since the Link count is zero
                             //
 
-                            AFSTearDownFcbExtents( pFcb,
-                                                   &pCcb->AuthGroup);
+                            AFSDeleteFcbExtents( pFcb);
 
                             AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                           AFS_TRACE_LEVEL_VERBOSE,
-                                          "AFSCleanup Releasing Fcb extents lock %08lX EXCL %08lX\n",
+                                          "AFSCleanup Releasing Fcb extents lock %p EXCL %08lX\n",
                                           &pFcb->NPFcb->Specific.File.ExtentsResource,
                                           PsGetCurrentThread());
 
@@ -598,18 +596,23 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                                                         (ULONG)FILE_ACTION_MODIFIED);
                     }
 
+
                     //
-                    // Attempt to flush any dirty extents to the server. This may be a little
-                    // aggressive, to flush whenever the handle is closed, but it ensures
-                    // coherency.
+                    // Whenever a handle with write access or the last handle is closed
+                    // notify the service to FSync the file.  If the redirector is holding
+                    // dirty extents, flush them to the service.  This is a bit aggressive
+                    // but it ensures cache coherency.
                     //
 
-                    if( (pCcb->GrantedAccess & FILE_WRITE_DATA) &&
-                        pFcb->Specific.File.ExtentsDirtyCount != 0)
+                    if( (pCcb->GrantedAccess & FILE_WRITE_DATA) || (pFcb->OpenHandleCount == 1))
                     {
 
-                        AFSFlushExtents( pFcb,
-                                         &pCcb->AuthGroup);
+                        if ( pFcb->Specific.File.ExtentsDirtyCount != 0)
+                        {
+
+                            AFSFlushExtents( pFcb,
+                                             &pCcb->AuthGroup);
+                        }
 
                         ulNotificationFlags |= AFS_REQUEST_FLAG_FLUSH_FILE;
                     }
@@ -721,9 +724,9 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                     lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanup (File) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+                                  "AFSCleanup (File) Decrement child open handle count on Parent object %p Cnt %d\n",
                                   pParentObjectInfo,
                                   lCount);
                 }
@@ -733,7 +736,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (File) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (File) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
@@ -743,7 +746,14 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                     // The ObjectReferenceCount will be freed by AFSPerformObjectInvalidate
                     //
 
-                    AFSObjectInfoIncrement( pObjectInfo);
+                    lCount = AFSObjectInfoIncrement( pObjectInfo,
+                                                     AFS_OBJECT_REFERENCE_INVALIDATION);
+
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCleanup Setting Purge on Close Increment count on object %p Cnt %d\n",
+                                  pObjectInfo,
+                                  lCount);
 
                     ClearFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
 
@@ -788,7 +798,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring Dcb lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring Dcb lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -1066,23 +1076,23 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                     lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanup (Dir) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+                                  "AFSCleanup (Dir) Decrement child open handle count on Parent object %p Cnt %d\n",
                                   pParentObjectInfo,
                                   lCount);
                 }
 
-                AFSReleaseResource( &pFcb->NPFcb->Resource);
-
                 lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (Dir) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (Dir) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
+                AFSReleaseResource( &pFcb->NPFcb->Resource);
+
                 break;
             }
 
@@ -1098,7 +1108,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (MP/SL) Acquiring Dcb lock %08lX EXCL %08lX\n",
+                              "AFSCleanup (MP/SL) Acquiring Dcb lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -1367,23 +1377,23 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                     lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanup (MP/SL) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+                                  "AFSCleanup (MP/SL) Decrement child open handle count on Parent object %p Cnt %d\n",
                                   pParentObjectInfo,
                                   lCount);
                 }
 
-                AFSReleaseResource( &pFcb->NPFcb->Resource);
-
                 lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (MP/SL) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (MP/SL) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
+                AFSReleaseResource( &pFcb->NPFcb->Resource);
+
                 break;
             }
 
@@ -1392,7 +1402,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Acquiring SPECIAL SHARE lock %08lX EXCL %08lX\n",
+                              "AFSCleanup Acquiring SPECIAL SHARE lock %p EXCL %08lX\n",
                               &pFcb->NPFcb->Resource,
                               PsGetCurrentThread());
 
@@ -1413,30 +1423,30 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
 
                     lCount = InterlockedDecrement( &pParentObjectInfo->Specific.Directory.ChildOpenHandleCount);
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
+                    AFSDbgLogMsg( AFS_SUBSYSTEM_OBJECT_REF_COUNTING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCleanup (Share) Decrement child open handle count on Parent object %08lX Cnt %d\n",
+                                  "AFSCleanup (Share) Decrement child open handle count on Parent object %p Cnt %d\n",
                                   pParentObjectInfo,
                                   lCount);
                 }
 
-                AFSReleaseResource( &pFcb->NPFcb->Resource);
-
                 lCount = InterlockedDecrement( &pFcb->OpenHandleCount);
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FCB_REF_COUNTING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup (Share) Decrement handle count on Fcb %08lX Cnt %d\n",
+                              "AFSCleanup (Share) Decrement handle count on Fcb %p Cnt %d\n",
                               pFcb,
                               lCount);
 
+                AFSReleaseResource( &pFcb->NPFcb->Resource);
+
                 break;
             }
 
             default:
 
                 AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
-                              AFS_TRACE_LEVEL_WARNING,
+                              AFS_TRACE_LEVEL_ERROR,
                               "AFSCleanup Processing unknown node type %d\n",
                               pFcb->Header.NodeTypeCode);