Windows: AFSCommonWrite STATUS_PENDING is Success
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSWrite.cpp
index 4b9eec9..375b101 100644 (file)
@@ -120,7 +120,9 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
     BOOLEAN            bReleaseSectionObject = FALSE;
     BOOLEAN            bReleasePaging = FALSE;
     BOOLEAN            bExtendingWrite = FALSE;
+    BOOLEAN            bSynchronousFo = FALSE;
     BOOLEAN            bCompleteIrp = TRUE;
+    BOOLEAN            bForceFlush = FALSE;
     BOOLEAN            bLockOK;
     HANDLE             hCallingUser = OnBehalfOf;
     ULONGLONG          ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
@@ -147,10 +149,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( pFcb == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite Attempted write (%p) when pFcb == NULL\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -164,10 +166,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( BooleanFlagOn( pDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_REDIRECTOR_SHUTDOWN))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_WARNING,
                           "AFSCommonWrite (%p) Open request after shutdown\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_TOO_LATE);
         }
@@ -176,17 +178,18 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         bPagingIo      = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
         bNonCachedIo   = BooleanFlagOn( Irp->Flags, IRP_NOCACHE);
         ulByteCount    = pIrpSp->Parameters.Write.Length;
+        bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
 
         if( pFcb->Header.NodeTypeCode != AFS_IOCTL_FCB &&
             pFcb->Header.NodeTypeCode != AFS_FILE_FCB  &&
             pFcb->Header.NodeTypeCode != AFS_SPECIAL_SHARE_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite Attempted write (%p) on an invalid node type %08lX\n",
                           Irp,
-                          pFcb->Header.NodeTypeCode);
+                          pFcb->Header.NodeTypeCode));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -199,13 +202,13 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( pFcb->Header.NodeTypeCode == AFS_IOCTL_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) Processing file (PIOCTL) Offset %0I64X Length %08lX Irp Flags %08lX\n",
                           Irp,
                           liStartingByte.QuadPart,
                           ulByteCount,
-                          Irp->Flags);
+                          Irp->Flags));
 
             ntStatus = AFSIOCtlWrite( DeviceObject,
                                       Irp);
@@ -215,13 +218,13 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         else if( pFcb->Header.NodeTypeCode == AFS_SPECIAL_SHARE_FCB)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) Processing file (SHARE) Offset %0I64X Length %08lX Irp Flags %08lX\n",
                           Irp,
                           liStartingByte.QuadPart,
                           ulByteCount,
-                          Irp->Flags);
+                          Irp->Flags));
 
             ntStatus = AFSShareWrite( DeviceObject,
                                       Irp);
@@ -237,22 +240,22 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
             NULL == pDeviceExt->Specific.RDR.CacheFileObject)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite (%p) Request failed due to AFS cache closed\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_TOO_LATE );
         }
 
         if( pFcb->ObjectInformation->VolumeCB != NULL &&
-            BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.Characteristics, FILE_READ_ONLY_DEVICE))
+            BooleanFlagOn( pFcb->ObjectInformation->VolumeCB->VolumeInformation.FileSystemAttributes, FILE_READ_ONLY_VOLUME))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite (%p) Request failed due to read only volume\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_ACCESS_DENIED);
         }
@@ -281,10 +284,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( ulByteCount == 0)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) Request completed due to zero length\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus);
         }
@@ -296,10 +299,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite (%p) Failing request due to INVALID fcb\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_FILE_DELETED);
         }
@@ -308,10 +311,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
             BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSCommonWrite (%p) Request failed due to file deleted\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_FILE_DELETED);
         }
@@ -319,10 +322,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( FlagOn( pIrpSp->MinorFunction, IRP_MN_COMPLETE))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) IRP_MN_COMPLETE being processed\n",
-                          Irp);
+                          Irp));
 
             CcMdlWriteComplete(pFileObject, &pIrpSp->Parameters.Write.ByteOffset, Irp->MdlAddress);
 
@@ -342,6 +345,7 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         if( NULL != pFileObject->SectionObjectPointer->DataSectionObject && !bPagingIo && bNonCachedIo)
         {
             bNonCachedIo = FALSE;
+            bForceFlush = TRUE;
         }
 
         if ( !bNonCachedIo && !bPagingIo)
@@ -350,11 +354,11 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
             if( pFileObject->PrivateCacheMap == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                               &pNPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireExcl( &pNPFcb->SectionObjectResource,
                                 TRUE);
@@ -364,11 +368,11 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                 __try
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonWrite Initialize caching on Fcb %p FileObject %p\n",
                                   pFcb,
-                                  pFileObject);
+                                  pFileObject));
 
                     CcInitializeCacheMap( pFileObject,
                                           (PCC_FILE_SIZES)&pFcb->Header.AllocationSize,
@@ -382,23 +386,23 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                     CcSetDirtyPageThreshold( pFileObject,
                                              AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
                 }
-                __except( EXCEPTION_EXECUTE_HANDLER)
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSCommonWrite (%p) Exception thrown while initializing cache map Status %08lX\n",
                                   Irp,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL %08lX\n",
                               &pNPFcb->SectionObjectResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSReleaseResource( &pNPFcb->SectionObjectResource);
 
@@ -411,39 +415,73 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                 }
             }
 
-            if (!CcCanIWrite( pFileObject,
-                              ulByteCount,
-                              FALSE,
-                              bRetry))
-            {
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                              AFS_TRACE_LEVEL_WARNING,
-                              "AFSCommonWrite (FO: %p) CcCanIWrite says No room for Offset %0I64X Length %08lX bytes! Deferring%s\n",
-                              pFileObject,
-                              liStartingByte.QuadPart,
-                              ulByteCount,
-                              bRetry ? " RETRY" : "");
-
-                ntStatus = AFSDeferWrite( DeviceObject, pFileObject, hCallingUser, Irp, ulByteCount, bRetry);
-
-                if ( STATUS_PENDING == ntStatus)
-                {
-
-                    bCompleteIrp = FALSE;
-                }
-                else
-                {
-
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSCommonWrite (FO: %p) AFSDeferWrite failure Status %08lX\n",
-                                  pFileObject,
-                                  ntStatus);
-                }
-
-                try_return( ntStatus);
-            }
+           //
+           // On versions of Microsoft Windows older than Vista the IO Manager
+           // will issue multiple outstanding writes on a synchronous file object
+           // if one of the cached writes completes with STATUS_PENDING.  This can
+           // result in the writes being completed out of order which can corrupt
+           // the end of file marker.  On OS versions older than Vista use a spin
+           // loop instead of deferring the write.
+           //
+
+           if ( bSynchronousFo &&
+                AFSRtlSysVersion.dwMajorVersion < 6)
+           {
+
+               while (!CcCanIWrite( pFileObject,
+                                    ulByteCount,
+                                    FALSE,
+                                    bRetry))
+               {
+                   static const LONGLONG llWriteDelay = (LONGLONG)-100000;
+                   bRetry = TRUE;
+
+                   AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                                 AFS_TRACE_LEVEL_WARNING,
+                                 "AFSCommonWrite (FO: %p) CcCanIWrite says No room for %u bytes! Retry in 10ms\n",
+                                 pFileObject,
+                                 ulByteCount);
+
+                   KeDelayExecutionThread(KernelMode, FALSE, (PLARGE_INTEGER)&llWriteDelay);
+               }
+           }
+           else
+           {
+
+               if (!CcCanIWrite( pFileObject,
+                                 ulByteCount,
+                                 FALSE,
+                                 bRetry))
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                 AFS_TRACE_LEVEL_WARNING,
+                                 "AFSCommonWrite (FO: %p) CcCanIWrite says No room for Offset %0I64X Length %08lX bytes! Deferring%s\n",
+                                 pFileObject,
+                                 liStartingByte.QuadPart,
+                                 ulByteCount,
+                                 bRetry ? " RETRY" : ""));
+
+                   ntStatus = AFSDeferWrite( DeviceObject, pFileObject, hCallingUser, Irp, ulByteCount, bRetry);
+
+                   if ( STATUS_PENDING == ntStatus)
+                   {
+
+                       bCompleteIrp = FALSE;
+                   }
+                   else
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                     AFS_TRACE_LEVEL_ERROR,
+                                     "AFSCommonWrite (FO: %p) AFSDeferWrite failure Status %08lX\n",
+                                     pFileObject,
+                                     ntStatus));
+                   }
+
+                   try_return( ntStatus);
+               }
+           }
         }
 
         //
@@ -460,11 +498,11 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
             if( ullProcessId == (ULONGLONG)AFSSysProcess)
             {
-                AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                               AFS_TRACE_LEVEL_WARNING,
                               "%s Setting LastWriterExtentProcessId to system process for Fcb %p\n",
                               __FUNCTION__,
-                              pFcb);
+                              pFcb));
             }
         }
 
@@ -488,11 +526,11 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 //ASSERT( NULL != OnBehalfOf || ExIsResourceAcquiredLite( &pNPFcb->Resource ));
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCommonWrite Acquiring Fcb PagingIo lock %p SHARED %08lX\n",
                               &pNPFcb->PagingResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireShared( &pNPFcb->PagingResource,
                                   TRUE);
@@ -512,30 +550,35 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                                     (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
                                       liStartingByte.HighPart == -1)) ;
 
-                if( bExtendingWrite)
+                if( bExtendingWrite || bNonCachedIo)
                 {
                     //
                     // Check for lock inversion
                     //
 
+                   //
+                   // For bExtendingWrite the PagingResource is needed to protect
+                   // the CcSetFileSizes call in AFSExtendingWrite
+                   //
+
                     ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonWrite Acquiring Fcb lock %p EXCL %08lX\n",
                                   &pNPFcb->Resource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSAcquireExcl( &pNPFcb->Resource,
                                     TRUE);
 
                     bReleaseMain = TRUE;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
                                   &pNPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSAcquireExcl( &pNPFcb->SectionObjectResource,
                                     TRUE);
@@ -564,22 +607,22 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                 {
                     ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonWrite Acquiring Fcb lock %p SHARED %08lX\n",
                                   &pNPFcb->Resource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSAcquireShared( &pNPFcb->Resource,
                                       TRUE);
 
                     bReleaseMain = TRUE;
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                   AFS_TRACE_LEVEL_VERBOSE,
                                   "AFSCommonWrite Acquiring Fcb SectionObject lock %p SHARED %08lX\n",
                                   &pNPFcb->SectionObjectResource,
-                                  PsGetCurrentThread());
+                                  PsGetCurrentThread()));
 
                     AFSAcquireShared( &pNPFcb->SectionObjectResource,
                                       TRUE);
@@ -593,6 +636,17 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
                     if (!bLockOK)
                     {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSCommonWrite Releasing Fcb SectionObject lock %p SHARED %08lX\n",
+                                     &pNPFcb->SectionObjectResource,
+                                     PsGetCurrentThread()));
+
+                       AFSReleaseResource( &pNPFcb->SectionObjectResource);
+
+                       bReleaseSectionObject = FALSE;
+
                         AFSReleaseResource( &pNPFcb->Resource);
 
                         bReleaseMain = FALSE;
@@ -613,10 +667,10 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                                                 Irp))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCommonWrite (%p) Request failed due to lock conflict\n",
-                              Irp);
+                              Irp));
 
                 try_return( ntStatus = STATUS_FILE_LOCK_CONFLICT);
             }
@@ -626,14 +680,18 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = AFSExtendingWrite( pFcb, pFileObject, (liStartingByte.QuadPart + ulByteCount));
 
+               //
+               // Fcb->NPFcb->Resource is now held SHARED
+               //
+
                 if( !NT_SUCCESS(ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSCommonWrite (%p) Failed extending write request Status %08lX\n",
                                   Irp,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus );
                 }
@@ -650,59 +708,30 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         {
 
             //
-            // Main and SectionObject resources held Shared
+           // Main resource held Shared
+           // SectionObject resource held exclusive if extending write
             //
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) Processing CACHED request Offset %0I64X Len %08lX%s\n",
                           Irp,
                           liStartingByte.QuadPart,
                           ulByteCount,
-                          bRetry ? " RETRY" : "");
-
-            ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, TRUE);
+                          bRetry ? " RETRY" : ""));
 
+            ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, bForceFlush);
         }
         else
         {
 
-            //
-            // if bPagingIo, Paging Resource held Shared
-            // else Main and SectionObject resources held Shared
-            //
-
-            if( bReleaseSectionObject)
-            {
-
-                AFSReleaseResource( &pNPFcb->SectionObjectResource);
-
-                bReleaseSectionObject = FALSE;
-            }
-
-            if( bReleasePaging)
-            {
-
-                AFSReleaseResource( &pNPFcb->PagingResource);
-
-                bReleasePaging = FALSE;
-            }
-
-            if( bReleaseMain)
-            {
-
-                AFSReleaseResource( &pNPFcb->Resource);
-
-                bReleaseMain = FALSE;
-            }
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCommonWrite (%p) Processing NON-CACHED request Offset %0I64X Len %08lX%s\n",
                           Irp,
                           liStartingByte.QuadPart,
                           ulByteCount,
-                          bRetry ? " RETRY" : "");
+                          bRetry ? " RETRY" : ""));
 
             if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
             {
@@ -717,17 +746,120 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
 try_exit:
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSCommonWrite (%p) Process complete Status %08lX\n",
                       Irp,
-                      ntStatus);
+                      ntStatus));
+
+       if ( NT_SUCCESS( ntStatus) &&
+            ntStatus != STATUS_PENDING)
+        {
+            if ( !bPagingIo)
+            {
+
+               if( bSynchronousFo)
+                {
+
+                    pFileObject->CurrentByteOffset.QuadPart = liStartingByte.QuadPart + ulByteCount;
+                }
+
+                //
+                // If this extended the VDL, then update it accordingly.
+                // Increasing the VDL does not require a call to CcSetFileSizes.
+                //
+
+                if( liStartingByte.QuadPart + ulByteCount > pFcb->Header.ValidDataLength.QuadPart)
+                {
+
+                    pFcb->Header.ValidDataLength.QuadPart = liStartingByte.QuadPart + ulByteCount;
+                }
+
+                if( !BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME))
+                {
+
+                    SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME);
+
+                    KeQuerySystemTime( &pFcb->ObjectInformation->LastWriteTime);
+                }
+            }
+        }
+
+       if ( ntStatus != STATUS_PENDING &&
+            !bPagingIo && bNonCachedIo && CcIsFileCached( pFileObject) &&
+             pNPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+             bReleaseSectionObject)
+        {
+            //
+            // Regardless of whether or not the a non-paging non-cached write
+            // succeeds or fails, if the file is cached the contents of the
+            // cache are no longer up to date.  A CcPurgeCacheSection must be
+            // performed to force subsequent cached reads to obtain the data
+            // from the service.
+            //
+            // The Fcb Resource is dropped in order to permit filters that perform
+            // an open via a worker thread in response to a purge to do so without
+            // deadlocking.  The SectionObjectResource is held across the purge to
+            // prevent racing with other cache operations.
+            //
+
+            if( bReleaseMain)
+            {
+
+                AFSReleaseResource( &pNPFcb->Resource);
+
+                bReleaseMain = FALSE;
+            }
+
+           __try
+            {
+
+               if ( !CcPurgeCacheSection( &pNPFcb->SectionObjectPointers,
+                                          &liStartingByte,
+                                          ulByteCount,
+                                          FALSE))
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                 AFS_TRACE_LEVEL_WARNING,
+                                 "AFSCommonWrite CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique));
+
+                   SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+               }
+           }
+           __except( EXCEPTION_EXECUTE_HANDLER)
+           {
+
+               DWORD ntStatus2 = GetExceptionCode();
+
+               AFSDbgTrace(( 0,
+                             0,
+                             "EXCEPTION - AFSCommonWrite CcPurgeCacheSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                              pFcb->ObjectInformation->FileId.Cell,
+                              pFcb->ObjectInformation->FileId.Volume,
+                              pFcb->ObjectInformation->FileId.Vnode,
+                             pFcb->ObjectInformation->FileId.Unique,
+                             ntStatus2));
+
+                SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+            }
+        }
 
         ObDereferenceObject(pFileObject);
 
         if( bReleaseSectionObject)
         {
 
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL/SHARED %08lX\n",
+                         &pNPFcb->SectionObjectResource,
+                         PsGetCurrentThread()));
+
             AFSReleaseResource( &pNPFcb->SectionObjectResource);
         }
 
@@ -791,11 +923,11 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
 
         pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSIOCtlWrite Acquiring Fcb lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( &pFcb->NPFcb->Resource,
                           TRUE);
@@ -934,24 +1066,24 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
     __Enter
     {
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
                       pFileObject,
                       StartingByte.HighPart,
                       StartingByte.LowPart,
-                      ByteCount);
+                      ByteCount));
 
         if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
                           Irp,
                           ByteCount,
                           pIrpSp->Parameters.Write.Length,
-                          pDevExt->Specific.RDR.MaxIo.QuadPart);
+                          pDevExt->Specific.RDR.MaxIo.QuadPart));
 
             try_return( ntStatus = STATUS_UNSUCCESSFUL);
         }
@@ -965,10 +1097,10 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if( pSystemBuffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Failed to map system buffer\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -978,7 +1110,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         // Provoke a get of the extents - if we need to.
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite Requesting extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                       pFcb->ObjectInformation->FileId.Cell,
@@ -986,7 +1118,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                       pFcb->ObjectInformation->FileId.Vnode,
                       pFcb->ObjectInformation->FileId.Unique,
                       StartingByte.QuadPart,
-                      ByteCount);
+                      ByteCount));
 
         ntStatus = AFSRequestExtentsAsync( pFcb,
                                            pCcb,
@@ -996,11 +1128,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if (!NT_SUCCESS(ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1010,11 +1142,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         while (TRUE)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Acquiring Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             ASSERT( !ExIsResourceAcquiredLite( &pFcb->NPFcb->Specific.File.ExtentsResource ));
 
@@ -1031,11 +1163,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
             KeClearEvent( &pFcb->NPFcb->Specific.File.ExtentsRequestComplete );
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Releasing(1) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
             bLocked= FALSE;
@@ -1049,7 +1181,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if( liCurrentTime.QuadPart - liLastRequestTime.QuadPart >= pControlDevExt->Specific.Control.ExtentRequestTimeCount.QuadPart)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSNonCachedWrite Requesting extents, again, for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
@@ -1057,7 +1189,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                               pFcb->ObjectInformation->FileId.Vnode,
                               pFcb->ObjectInformation->FileId.Unique,
                               StartingByte.QuadPart,
-                              ByteCount);
+                              ByteCount));
 
                 ntStatus = AFSRequestExtentsAsync( pFcb,
                                                    pCcb,
@@ -1067,11 +1199,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                 if (!NT_SUCCESS(ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
                                   Irp,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
@@ -1080,7 +1212,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             }
 
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Waiting for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                           pFcb->ObjectInformation->FileId.Cell,
@@ -1088,7 +1220,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                           pFcb->ObjectInformation->FileId.Vnode,
                           pFcb->ObjectInformation->FileId.Unique,
                           StartingByte.QuadPart,
-                          ByteCount);
+                          ByteCount));
 
             //
             // Wait for it
@@ -1099,7 +1231,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if (!NT_SUCCESS(ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSNonCachedWrite Failed wait for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
@@ -1108,7 +1240,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                               pFcb->ObjectInformation->FileId.Unique,
                               StartingByte.QuadPart,
                               ByteCount,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -1118,7 +1250,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         // As per the read path -
         //
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite Extents located for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                       pFcb->ObjectInformation->FileId.Cell,
@@ -1126,7 +1258,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                       pFcb->ObjectInformation->FileId.Vnode,
                       pFcb->ObjectInformation->FileId.Unique,
                       StartingByte.QuadPart,
-                      ByteCount);
+                      ByteCount));
 
         ntStatus = AFSGetExtents( pFcb,
                                   &StartingByte,
@@ -1138,21 +1270,21 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if (!NT_SUCCESS(ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Failed to retrieve mapped extents Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus );
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite (%p) Successfully retrieved map extents count %d run count %d\n",
                       Irp,
                       extentsCount,
-                      runCount);
+                      runCount));
 
         if( BooleanFlagOn( AFSLibControlFlags, AFS_REDIR_LIB_FLAGS_NONPERSISTENT_CACHE))
         {
@@ -1181,11 +1313,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if (!NT_SUCCESS(ntStatus))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSNonCachedWrite (%p) Failed to process extent run for non-persistent cache Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -1202,7 +1334,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
             ntStatus = STATUS_DEVICE_NOT_READY;
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_EXTENT_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_EXTENT_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite Failed to retrieve cache fileobject for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
                           pFcb->ObjectInformation->FileId.Cell,
@@ -1211,7 +1343,7 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                           pFcb->ObjectInformation->FileId.Unique,
                           StartingByte.QuadPart,
                           ByteCount,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1225,10 +1357,10 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if (NULL == pIoRuns)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSNonCachedWrite (%p) Failed to allocate IO run block\n",
-                              Irp);
+                              Irp));
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
             }
@@ -1253,11 +1385,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if (!NT_SUCCESS(ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Failed to initialize IO run block Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus );
         }
@@ -1267,11 +1399,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
         bDerefExtents = TRUE;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite Releasing(2) Fcb extents lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->Specific.File.ExtentsResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
         bLocked = FALSE;
@@ -1283,16 +1415,16 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if (NULL == pGatherIo)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWrite (%p) Failed to allocate IO gather block\n",
-                          Irp);
+                          Irp));
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Acquiring(1) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1350,20 +1482,20 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                                      runCount,
                                      pGatherIo);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite (%p) AFSStartIos completed Status %08lX\n",
                       Irp,
-                      ntStatus);
+                      ntStatus));
 
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Acquiring(2) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1394,11 +1526,11 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Acquiring(3) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1452,14 +1584,14 @@ try_exit:
             AFSReleaseCacheFileObject( pCacheFileObject);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
                       pFileObject,
                       StartingByte.HighPart,
                       StartingByte.LowPart,
                       ByteCount,
-                      ntStatus);
+                      ntStatus));
 
         if (NT_SUCCESS(ntStatus) &&
             !bPagingIo &&
@@ -1472,11 +1604,11 @@ try_exit:
         if( bLocked)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Releasing Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
         }
@@ -1495,12 +1627,12 @@ try_exit:
         if( bCompleteIrp)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSNonCachedWrite Completing Irp %p Status %08lX Info %08lX\n",
                           Irp,
                           ntStatus,
-                          Irp->IoStatus.Information);
+                          Irp->IoStatus.Information));
 
             AFSCompleteRequest( Irp, ntStatus);
         }
@@ -1535,24 +1667,24 @@ AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
     {
         Irp->IoStatus.Information = 0;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWriteDirect (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
                       pFileObject,
                       StartingByte.HighPart,
                       StartingByte.LowPart,
-                      ByteCount);
+                      ByteCount));
 
         if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWriteDirect (%p) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
                           Irp,
                           ByteCount,
                           pIrpSp->Parameters.Write.Length,
-                          pDevExt->Specific.RDR.MaxIo.QuadPart);
+                          pDevExt->Specific.RDR.MaxIo.QuadPart));
 
             try_return( ntStatus = STATUS_UNSUCCESSFUL);
         }
@@ -1566,10 +1698,10 @@ AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
         if( pSystemBuffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWriteDirect (%p) Failed to map system buffer\n",
-                          Irp);
+                          Irp));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -1640,24 +1772,23 @@ AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
         else
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSNonCachedWriteDirect (%p) Failed to send write to service Status %08lX\n",
                           Irp,
-                          ntStatus);
-
+                          ntStatus));
         }
 
 try_exit:
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWriteDirect (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
                       pFileObject,
                       StartingByte.HighPart,
                       StartingByte.LowPart,
                       ByteCount,
-                      ntStatus);
+                      ntStatus));
 
         if (NT_SUCCESS(ntStatus) &&
             !bPagingIo &&
@@ -1667,12 +1798,12 @@ try_exit:
             pFileObject->CurrentByteOffset.QuadPart = StartingByte.QuadPart + ByteCount;
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSNonCachedWriteDirect Completing Irp %p Status %08lX Info %08lX\n",
                       Irp,
                       ntStatus,
-                      Irp->IoStatus.Information);
+                      Irp->IoStatus.Information));
 
         AFSCompleteRequest( Irp, ntStatus);
     }
@@ -1719,15 +1850,15 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = Irp->IoStatus.Status;
             }
-            __except( EXCEPTION_EXECUTE_HANDLER)
+           __except( EXCEPTION_EXECUTE_HANDLER)
             {
                 ntStatus = GetExceptionCode();
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCachedWrite (%p) Exception thrown while preparing mdl write Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             if( !NT_SUCCESS( ntStatus))
@@ -1743,11 +1874,11 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 Irp->MdlAddress = NULL;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCachedWrite (%p) Failed to process MDL write Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -1785,10 +1916,10 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if( pSystemBuffer == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCachedWrite (%p) Failed to lock system buffer\n",
-                              Irp);
+                              Irp));
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
             }
@@ -1806,29 +1937,29 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                     // Failed to process request.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
                                   "AFSCachedWrite (%p) Failed to issue CcCopyWrite %wZ @ %0I64X Status %08lX\n",
                                   Irp,
                                   &pFileObject->FileName,
                                   liCurrentOffset.QuadPart,
-                                  Irp->IoStatus.Status);
+                                  Irp->IoStatus.Status));
 
                     try_return( ntStatus = STATUS_UNSUCCESSFUL);
                 }
             }
-            __except( EXCEPTION_EXECUTE_HANDLER)
+           __except( EXCEPTION_EXECUTE_HANDLER)
             {
 
                 ntStatus = GetExceptionCode();
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSCachedWrite (%p) CcCopyWrite Threw exception %wZ @ %0I64X Status %08lX\n",
                               Irp,
                               &pFileObject->FileName,
                               liCurrentOffset.QuadPart,
-                              ntStatus);
+                              ntStatus));
             }
 
             if( !NT_SUCCESS( ntStatus))
@@ -1840,31 +1971,49 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                 BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
             {
 
-                //
-                // We have detected a file we do a write through with.
-                //
-
-                CcFlushCache(&pFcb->NPFcb->SectionObjectPointers,
-                             &liCurrentOffset,
-                             ulCurrentIO,
-                             &iosbFlush);
-
-                if( !NT_SUCCESS( iosbFlush.Status))
+               __try
+               {
+                   //
+                   // We have detected a file we do a write through with.
+                   //
+
+                   CcFlushCache(&pFcb->NPFcb->SectionObjectPointers,
+                                 &liCurrentOffset,
+                                 ulCurrentIO,
+                                 &iosbFlush);
+
+                   if( !NT_SUCCESS( iosbFlush.Status))
+                   {
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                     AFS_TRACE_LEVEL_ERROR,
+                                     "AFSCachedWrite (%p) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+                                     Irp,
+                                     &pFileObject->FileName,
+                                     pFcb->ObjectInformation->FileId.Cell,
+                                     pFcb->ObjectInformation->FileId.Volume,
+                                     pFcb->ObjectInformation->FileId.Vnode,
+                                     pFcb->ObjectInformation->FileId.Unique,
+                                     iosbFlush.Status,
+                                     iosbFlush.Information));
+
+                       try_return( ntStatus = iosbFlush.Status);
+                   }
+               }
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                   ntStatus = GetExceptionCode();
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSCachedWrite (%p) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+                                 "AFSCachedWrite (%p) CcFlushCache Threw exception %wZ @ %0I64X Status %08lX\n",
                                   Irp,
                                   &pFileObject->FileName,
-                                  pFcb->ObjectInformation->FileId.Cell,
-                                  pFcb->ObjectInformation->FileId.Volume,
-                                  pFcb->ObjectInformation->FileId.Vnode,
-                                  pFcb->ObjectInformation->FileId.Unique,
-                                  iosbFlush.Status,
-                                  iosbFlush.Information);
-
-                    try_return( ntStatus = iosbFlush.Status);
+                                 liCurrentOffset.QuadPart,
+                                 ntStatus));
+
+                   try_return( ntStatus);
                 }
             }
 
@@ -1887,22 +2036,6 @@ try_exit:
 
             Irp->IoStatus.Information = ByteCount;
 
-            if( bSynchronousFo)
-            {
-
-                pFileObject->CurrentByteOffset.QuadPart = StartingByte.QuadPart + ByteCount;
-            }
-
-            //
-            // If this extended the Vdl, then update it accordingly
-            //
-
-            if( StartingByte.QuadPart + ByteCount > pFcb->Header.ValidDataLength.QuadPart)
-            {
-
-                pFcb->Header.ValidDataLength.QuadPart = StartingByte.QuadPart + ByteCount;
-            }
-
             if ( ForceFlush ||
                  BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
             {
@@ -1912,14 +2045,6 @@ try_exit:
                 //
                 pFcb->Specific.File.LastServerFlush.QuadPart = 0;
             }
-
-            if( !BooleanFlagOn( pFcb->Flags, AFS_FCB_FLAG_UPDATE_LAST_WRITE_TIME))
-            {
-
-                SetFlag( pFcb->Flags, AFS_FCB_FLAG_UPDATE_WRITE_TIME);
-
-                KeQuerySystemTime( &pFcb->ObjectInformation->LastWriteTime);
-            }
         }
 
         AFSCompleteRequest( Irp,
@@ -1929,6 +2054,10 @@ try_exit:
     return ntStatus;
 }
 
+//
+// Called with Fcb->NPFcb->SectionObjectResource and Fcb->NPFcb->Resource held
+//
+
 static
 NTSTATUS
 AFSExtendingWrite( IN AFSFcb *Fcb,
@@ -1974,6 +2103,9 @@ AFSExtendingWrite( IN AFSFcb *Fcb,
         //
         // If the file is currently cached, then let the MM know about the extension
         //
+       // The CcSetFileSizes call should be made with only the PagingResource held
+       // which we are currently not holding.
+       //
 
         if( CcIsFileCached( FileObject))
         {
@@ -2017,11 +2149,11 @@ AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
 
         pCcb = (AFSCcb *)pIrpSp->FileObject->FsContext2;
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSShareWrite On pipe %wZ Length %08lX\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      pIrpSp->Parameters.Write.Length);
+                      pIrpSp->Parameters.Write.Length));
 
         if( pIrpSp->Parameters.Write.Length == 0)
         {
@@ -2043,10 +2175,10 @@ AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
         if( pBuffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSShareWrite Failed to map buffer on pipe %wZ\n",
-                          &pCcb->DirectoryCB->NameInformation.FileName);
+                          &pCcb->DirectoryCB->NameInformation.FileName));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -2102,20 +2234,20 @@ AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
         if( !NT_SUCCESS( ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
                           "AFSShareWrite (%p) Failed service write Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_PIPE_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_PIPE_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
                       "AFSShareWrite Completed on pipe %wZ Length read %08lX\n",
                       &pCcb->DirectoryCB->NameInformation.FileName,
-                      stIoResult.BytesProcessed);
+                      stIoResult.BytesProcessed));
 
         Irp->IoStatus.Information = stIoResult.BytesProcessed;