Windows: Comment CommonWrite VDL Change
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSWrite.cpp
index 12ff9e6..2d5f44b 100644 (file)
@@ -54,6 +54,13 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
 static
 NTSTATUS
+AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
+                         IN PIRP Irp,
+                         IN LARGE_INTEGER StartingByte,
+                         IN ULONG ByteCount);
+
+static
+NTSTATUS
 AFSExtendingWrite( IN AFSFcb *Fcb,
                    IN PFILE_OBJECT FileObject,
                    IN LONGLONG NewLength);
@@ -74,14 +81,15 @@ AFSWrite( IN PDEVICE_OBJECT LibDeviceObject,
           IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(LibDeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
 
     __try
     {
 
-        ntStatus = AFSCommonWrite( AFSRDRDeviceObject, Irp, NULL);
+        ntStatus = AFSCommonWrite( AFSRDRDeviceObject, Irp, NULL, FALSE);
     }
-    __except( AFSExceptionFilter( GetExceptionCode(), GetExceptionInformation()) )
+    __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()) )
     {
 
         ntStatus = STATUS_INSUFFICIENT_RESOURCES;
@@ -93,7 +101,8 @@ AFSWrite( IN PDEVICE_OBJECT LibDeviceObject,
 NTSTATUS
 AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                 IN PIRP Irp,
-                IN HANDLE OnBehalfOf)
+                IN HANDLE OnBehalfOf,
+                IN BOOLEAN bRetry)
 {
 
     NTSTATUS           ntStatus = STATUS_SUCCESS;
@@ -108,21 +117,24 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
     BOOLEAN            bPagingIo = FALSE;
     BOOLEAN            bNonCachedIo = FALSE;
     BOOLEAN            bReleaseMain = FALSE;
+    BOOLEAN            bReleaseSectionObject = FALSE;
     BOOLEAN            bReleasePaging = FALSE;
     BOOLEAN            bExtendingWrite = FALSE;
+    BOOLEAN            bSynchronousFo = FALSE;
     BOOLEAN            bCompleteIrp = TRUE;
     BOOLEAN            bForceFlush = FALSE;
     BOOLEAN            bLockOK;
-    BOOLEAN            bMapped = TRUE;
     HANDLE             hCallingUser = OnBehalfOf;
-    ULONG              ulExtensionLength = 0;
-    BOOLEAN            bRetry = FALSE;
+    ULONGLONG          ullProcessId = (ULONGLONG)PsGetCurrentProcessId();
+    AFSDeviceExt       *pRDRDevExt = (AFSDeviceExt *)AFSRDRDeviceObject->DeviceExtension;
 
     pIrpSp = IoGetCurrentIrpStackLocation( Irp);
 
     __Enter
     {
 
+        Irp->IoStatus.Information = 0;
+
         pFileObject = pIrpSp->FileObject;
 
         //
@@ -137,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 (%08lX) when pFcb == NULL\n",
-                          Irp);
+                          "AFSCommonWrite Attempted write (%p) when pFcb == NULL\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -154,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 (%08lX) Open request after shutdown\n",
-                          Irp);
+                          "AFSCommonWrite (%p) Open request after shutdown\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_TOO_LATE);
         }
@@ -166,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 (%08lX) on an invalid node type %08lX\n",
+                          "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);
         }
@@ -189,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 (%08lX) Processing file (PIOCTL) Offset %I64X Length %08lX Irp Flags %08lX\n",
+                          "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);
@@ -205,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 (%08lX) Processing file (SHARE) Offset %I64X Length %08lX Irp Flags %08lX\n",
+                          "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);
@@ -223,25 +236,26 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         // Is the Cache not there yet?  Exit.
         //
         if( !BooleanFlagOn( AFSLibControlFlags, AFS_REDIR_LIB_FLAGS_NONPERSISTENT_CACHE) &&
+            !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_REDIR_INIT_PERFORM_SERVICE_IO) &&
             NULL == pDeviceExt->Specific.RDR.CacheFileObject)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSCommonWrite (%08lX) Request failed due to AFS cache closed\n",
-                          Irp);
+                          "AFSCommonWrite (%p) Request failed due to AFS cache closed\n",
+                          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 (%08lX) Request failed due to read only volume\n",
-                          Irp);
+                          "AFSCommonWrite (%p) Request failed due to read only volume\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_ACCESS_DENIED);
         }
@@ -270,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 (%08lX) Request completed due to zero length\n",
-                          Irp);
+                          "AFSCommonWrite (%p) Request completed due to zero length\n",
+                          Irp));
 
             try_return( ntStatus);
         }
@@ -285,12 +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 (%08lX) Failing request due to INVALID fcb\n",
-                          Irp);
-
-            Irp->IoStatus.Information = 0;
+                          "AFSCommonWrite (%p) Failing request due to INVALID fcb\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_FILE_DELETED);
         }
@@ -299,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 (%08lX) Request failed due to file deleted\n",
-                          Irp);
+                          "AFSCommonWrite (%p) Request failed due to file deleted\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_FILE_DELETED);
         }
@@ -310,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 (%08lX) IRP_MN_COMPLETE being processed\n",
-                          Irp);
+                          "AFSCommonWrite (%p) IRP_MN_COMPLETE being processed\n",
+                          Irp));
 
             CcMdlWriteComplete(pFileObject, &pIrpSp->Parameters.Write.ByteOffset, Irp->MdlAddress);
 
@@ -336,20 +348,31 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
             bForceFlush = TRUE;
         }
 
-        if( (!bPagingIo && !bNonCachedIo))
+        if ( !bNonCachedIo && !bPagingIo)
         {
 
             if( pFileObject->PrivateCacheMap == NULL)
             {
 
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                              &pNPFcb->SectionObjectResource,
+                              PsGetCurrentThread()));
+
+                AFSAcquireExcl( &pNPFcb->SectionObjectResource,
+                                TRUE);
+
+                bReleaseSectionObject = TRUE;
+
                 __try
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSCommonWrite Initialize caching on Fcb %08lX FileObject %08lX\n",
+                                  "AFSCommonWrite Initialize caching on Fcb %p FileObject %p\n",
                                   pFcb,
-                                  pFileObject);
+                                  pFileObject));
 
                     CcInitializeCacheMap( pFileObject,
                                           (PCC_FILE_SIZES)&pFcb->Header.AllocationSize,
@@ -358,37 +381,73 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                                           pFcb);
 
                     CcSetReadAheadGranularity( pFileObject,
-                                               READ_AHEAD_GRANULARITY);
+                                               pDeviceExt->Specific.RDR.MaximumRPCLength);
 
+                    CcSetDirtyPageThreshold( pFileObject,
+                                             AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
                 }
                 __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSCommonWrite (%08lX) Exception thrown while initializing cache map Status %08lX\n",
+                                  "AFSCommonWrite (%p) Exception thrown while initializing cache map Status %08lX\n",
                                   Irp,
-                                  ntStatus);
+                                  ntStatus));
                 }
 
+                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                              AFS_TRACE_LEVEL_VERBOSE,
+                              "AFSCommonWrite Releasing Fcb SectionObject lock %p EXCL %08lX\n",
+                              &pNPFcb->SectionObjectResource,
+                              PsGetCurrentThread()));
+
+                AFSReleaseResource( &pNPFcb->SectionObjectResource);
+
+                bReleaseSectionObject = FALSE;
+
                 if( !NT_SUCCESS( ntStatus))
                 {
 
                     try_return( ntStatus);
                 }
             }
-        }
 
-        while (!bNonCachedIo && !CcCanIWrite( pFileObject,
-                                              ulByteCount,
-                                              FALSE,
-                                              bRetry))
-        {
-            static const LONGLONG llWriteDelay = (LONGLONG)-100000;
-            bRetry = TRUE;
-            KeDelayExecutionThread(KernelMode, FALSE, (PLARGE_INTEGER)&llWriteDelay);
+            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);
+            }
         }
 
         //
@@ -397,68 +456,26 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
 
         if( !bPagingIo &&
             ( pFcb->Specific.File.ExtentRequestProcessId == 0 ||
-              ( PsGetCurrentProcessId() != AFSSysProcess &&
-                pFcb->Specific.File.ExtentRequestProcessId != (ULONGLONG)PsGetCurrentProcessId())))
+              ( ullProcessId != (ULONGLONG)AFSSysProcess &&
+                pFcb->Specific.File.ExtentRequestProcessId != ullProcessId)))
         {
 
-            pFcb->Specific.File.ExtentRequestProcessId = (ULONGLONG)PsGetCurrentProcessId();
+            pFcb->Specific.File.ExtentRequestProcessId = ullProcessId;
 
-            if( pFcb->Specific.File.ExtentRequestProcessId == (ULONGLONG)AFSSysProcess)
+            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));
             }
-
-            pFcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_SUCCESS;
-        }
-
-        //
-        // We should be ready to go.  So first of all ask for the extents
-        // Provoke a get of the extents - if we need to.
-        //
-
-        /*
-        if( !bPagingIo && !bNonCachedIo)
-        {
-
-            ntStatus = AFSRequestExtentsAsync( pFcb, &liStartingByte, ulByteCount);
-
-            if (!NT_SUCCESS(ntStatus))
-            {
-
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonWrite (%08lX) Failed to request extents Status %08lX\n",
-                              Irp,
-                              ntStatus);
-
-                try_return( ntStatus );
-            }
-        }
-        */
-
-        //
-        // If they are not mapped and we are the Lazy Writer then just
-        // say "not now"
-        //
-        if (!bMapped && pFcb->Specific.File.LazyWriterThread == PsGetCurrentThread())
-        {
-
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonWrite (%08lX) Failing lazy writer for unmapped request\n",
-                          Irp);
-
-            try_return ( ntStatus = STATUS_FILE_LOCK_CONFLICT);
         }
 
         //
         // Take locks
         //
-        //   - if Paging then we need to nothing (the precalls will
+        //   - if Paging then we need to do nothing (the precalls will
         //     have acquired the paging resource), for clarity we will collect
         //     the paging resource
         //   - If extending Write then take the fileresource EX (EOF will change, Allocation will only move out)
@@ -470,25 +487,16 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
         do
         {
 
-            if( !bPagingIo)
-            {
-
-                bExtendingWrite = (((liStartingByte.QuadPart + ulByteCount) >=
-                                    pFcb->Header.FileSize.QuadPart) ||
-                                   (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
-                                    liStartingByte.HighPart == -1)) ;
-            }
-
             if( bPagingIo)
             {
 
                 //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 %08lX SHARED %08lX\n",
+                              "AFSCommonWrite Acquiring Fcb PagingIo lock %p SHARED %08lX\n",
                               &pNPFcb->PagingResource,
-                              PsGetCurrentThread());
+                              PsGetCurrentThread()));
 
                 AFSAcquireShared( &pNPFcb->PagingResource,
                                   TRUE);
@@ -500,103 +508,139 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                 //
                 bLockOK = TRUE;
             }
-            else if( bExtendingWrite)
+            else
             {
-                //
-                // Check for lock inversion
-                //
 
-                ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
+                bExtendingWrite = (((liStartingByte.QuadPart + ulByteCount) >=
+                                     pFcb->Header.FileSize.QuadPart) ||
+                                    (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
+                                      liStartingByte.HighPart == -1)) ;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonWrite Acquiring Fcb lock %08lX EXCL %08lX\n",
-                              &pNPFcb->Resource,
-                              PsGetCurrentThread());
+                if( bExtendingWrite || bNonCachedIo)
+                {
+                    //
+                    // Check for lock inversion
+                    //
 
-                AFSAcquireExcl( &pNPFcb->Resource,
-                                TRUE);
+                    ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
 
-                if (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
-                    liStartingByte.HighPart == -1)
-                {
-                    if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
-                    {
-                        liStartingByte = pFcb->Header.ValidDataLength;
-                    }
-                    else
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonWrite Acquiring Fcb lock %p EXCL %08lX\n",
+                                  &pNPFcb->Resource,
+                                  PsGetCurrentThread()));
+
+                    AFSAcquireExcl( &pNPFcb->Resource,
+                                    TRUE);
+
+                    bReleaseMain = TRUE;
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonWrite Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
+                                  &pNPFcb->SectionObjectResource,
+                                  PsGetCurrentThread()));
+
+                    AFSAcquireExcl( &pNPFcb->SectionObjectResource,
+                                    TRUE);
+
+                    bReleaseSectionObject = TRUE;
+
+                    if (liStartingByte.LowPart == FILE_WRITE_TO_END_OF_FILE &&
+                         liStartingByte.HighPart == -1)
                     {
-                        liStartingByte = pFcb->Header.FileSize;
+                        if (pFcb->Header.ValidDataLength.QuadPart > pFcb->Header.FileSize.QuadPart)
+                        {
+                            liStartingByte = pFcb->Header.ValidDataLength;
+                        }
+                        else
+                        {
+                            liStartingByte = pFcb->Header.FileSize;
+                        }
                     }
+
+                    //
+                    // We have the correct lock - even if we don't end up truncating
+                    //
+                    bLockOK = TRUE;
                 }
-                bReleaseMain = TRUE;
+                else
+                {
+                    ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
 
-                //
-                // We have the correct lock - even if we don't end up truncating
-                //
-                bLockOK = TRUE;
-            }
-            else
-            {
-                ASSERT( !ExIsResourceAcquiredLite( &pNPFcb->PagingResource ));
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonWrite Acquiring Fcb lock %p SHARED %08lX\n",
+                                  &pNPFcb->Resource,
+                                  PsGetCurrentThread()));
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCommonWrite Acquiring Fcb lock %08lX SHARED %08lX\n",
-                              &pNPFcb->Resource,
-                              PsGetCurrentThread());
+                    AFSAcquireShared( &pNPFcb->Resource,
+                                      TRUE);
 
-                AFSAcquireShared( &pNPFcb->Resource,
-                                  TRUE);
+                    bReleaseMain = TRUE;
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                  AFS_TRACE_LEVEL_VERBOSE,
+                                  "AFSCommonWrite Acquiring Fcb SectionObject lock %p SHARED %08lX\n",
+                                  &pNPFcb->SectionObjectResource,
+                                  PsGetCurrentThread()));
 
-                bReleaseMain = TRUE;
+                    AFSAcquireShared( &pNPFcb->SectionObjectResource,
+                                      TRUE);
 
-                //
-                // Have things moved?  Are we extending? If so, the the lock isn't OK
-                //
-                bLockOK = (liStartingByte.QuadPart + ulByteCount) < pFcb->Header.FileSize.QuadPart;
+                    bReleaseSectionObject = TRUE;
 
-                if (!bLockOK)
-                {
-                    AFSReleaseResource( &pNPFcb->Resource);
-                    bReleaseMain = FALSE;
+                    //
+                    // Have things moved?  Are we extending? If so, the the lock isn't OK
+                    //
+                    bLockOK = (liStartingByte.QuadPart + ulByteCount) < pFcb->Header.FileSize.QuadPart;
+
+                    if (!bLockOK)
+                    {
+                        AFSReleaseResource( &pNPFcb->Resource);
+
+                        bReleaseMain = FALSE;
+                    }
                 }
             }
         }
         while (!bLockOK);
 
-        //
-        // Check the BR locks on the file.
-        //
-
-        if( !bPagingIo &&
-            !FsRtlCheckLockForWriteAccess( &pFcb->Specific.File.FileLock,
-                                           Irp))
+        if( !bPagingIo)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                          AFS_TRACE_LEVEL_ERROR,
-                          "AFSCommonWrite (%08lX) Request failed due to lock conflict\n",
-                          Irp);
+            //
+            // Check the BR locks on the file.
+            //
 
-            try_return( ntStatus = STATUS_FILE_LOCK_CONFLICT);
-        }
+            if ( !FsRtlCheckLockForWriteAccess( &pFcb->Specific.File.FileLock,
+                                                Irp))
+            {
 
-        if( bExtendingWrite)
-        {
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                              AFS_TRACE_LEVEL_ERROR,
+                              "AFSCommonWrite (%p) Request failed due to lock conflict\n",
+                              Irp));
 
-            ntStatus = AFSExtendingWrite( pFcb, pFileObject, (liStartingByte.QuadPart + ulByteCount));
+                try_return( ntStatus = STATUS_FILE_LOCK_CONFLICT);
+            }
 
-            if( !NT_SUCCESS(ntStatus))
+            if( bExtendingWrite)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
-                              AFS_TRACE_LEVEL_ERROR,
-                              "AFSCommonWrite (%08lX) Failed extending write request Status %08lX\n",
-                              Irp,
-                              ntStatus);
+                ntStatus = AFSExtendingWrite( pFcb, pFileObject, (liStartingByte.QuadPart + ulByteCount));
+
+                if( !NT_SUCCESS(ntStatus))
+                {
+
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                  AFS_TRACE_LEVEL_ERROR,
+                                  "AFSCommonWrite (%p) Failed extending write request Status %08lX\n",
+                                  Irp,
+                                  ntStatus));
 
-                try_return( ntStatus );
+                    try_return( ntStatus );
+                }
             }
         }
 
@@ -609,43 +653,131 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
             !bNonCachedIo)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            //
+            // Main and SectionObject resources held Shared
+            //
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonWrite (%08lX) Processing CACHED request Offset %I64X Len %08lX\n",
+                          "AFSCommonWrite (%p) Processing CACHED request Offset %0I64X Len %08lX%s\n",
                           Irp,
                           liStartingByte.QuadPart,
-                          ulByteCount);
+                          ulByteCount,
+                          bRetry ? " RETRY" : ""));
 
             ntStatus = AFSCachedWrite( DeviceObject, Irp, liStartingByte, ulByteCount, bForceFlush);
-
         }
         else
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonWrite (%08lX) Processing NON-CACHED request Offset %I64X Len %08lX\n",
+                          "AFSCommonWrite (%p) Processing NON-CACHED request Offset %0I64X Len %08lX%s\n",
                           Irp,
                           liStartingByte.QuadPart,
-                          ulByteCount);
+                          ulByteCount,
+                          bRetry ? " RETRY" : ""));
+
+            if( BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+            {
 
-            ntStatus = AFSNonCachedWrite( DeviceObject, Irp,  liStartingByte, ulByteCount);
+                ntStatus = AFSNonCachedWriteDirect( DeviceObject, Irp,  liStartingByte, ulByteCount);
+            }
+            else
+            {
+                ntStatus = AFSNonCachedWrite( DeviceObject, Irp,  liStartingByte, ulByteCount);
+            }
         }
 
 try_exit:
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSCommonWrite (%08lX) Process complete Status %08lX\n",
+                      "AFSCommonWrite (%p) Process complete Status %08lX\n",
                       Irp,
-                      ntStatus);
+                      ntStatus));
+
+        if ( NT_SUCCESS( ntStatus))
+        {
+            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 ( !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;
+            }
+
+            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);
+            }
+        }
 
         ObDereferenceObject(pFileObject);
 
-        if( bReleaseMain)
+        if( bReleaseSectionObject)
         {
 
-            AFSReleaseResource( &pNPFcb->Resource);
+            AFSReleaseResource( &pNPFcb->SectionObjectResource);
         }
 
         if( bReleasePaging)
@@ -654,6 +786,12 @@ try_exit:
             AFSReleaseResource( &pNPFcb->PagingResource);
         }
 
+        if( bReleaseMain)
+        {
+
+            AFSReleaseResource( &pNPFcb->Resource);
+        }
+
         if( bCompleteIrp)
         {
 
@@ -670,6 +808,7 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
                IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(DeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
     AFSPIOCtlIORequestCB stIORequestCB;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
@@ -682,6 +821,8 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
     __Enter
     {
 
+        Irp->IoStatus.Information = 0;
+
         RtlZeroMemory( &stIORequestCB,
                        sizeof( AFSPIOCtlIORequestCB));
 
@@ -699,11 +840,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 %08lX SHARED %08lX\n",
+                      "AFSIOCtlWrite Acquiring Fcb lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->Resource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( &pFcb->NPFcb->Resource,
                           TRUE);
@@ -715,14 +856,14 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
         RtlZeroMemory( &stParentFID,
                        sizeof( AFSFileID));
 
-        if( pFcb->ObjectInformation->ParentObjectInformation != NULL)
+        if( BooleanFlagOn( pFcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_PARENT_FID))
         {
 
             //
             // The parent directory FID of the node
             //
 
-            stParentFID = pFcb->ObjectInformation->ParentObjectInformation->FileId;
+            stParentFID = pFcb->ObjectInformation->ParentFileId;
         }
 
         //
@@ -761,9 +902,11 @@ AFSIOCtlWrite( IN PDEVICE_OBJECT DeviceObject,
 
         ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIOCTL_WRITE,
                                       AFS_REQUEST_FLAG_SYNCHRONOUS,
-                                      &pFcb->AuthGroup,
+                                      &pCcb->AuthGroup,
                                       NULL,
                                       &stParentFID,
+                                      NULL,
+                                      0,
                                       (void *)&stIORequestCB,
                                       sizeof( AFSPIOCtlIORequestCB),
                                       &stIOResultCB,
@@ -820,7 +963,6 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
     BOOLEAN            bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
     BOOLEAN            bLocked = FALSE;
     BOOLEAN            bCompleteIrp = TRUE;
-    BOOLEAN            bExtentsMapped = FALSE;
     AFSGatherIo       *pGatherIo = NULL;
     AFSIoRun          *pIoRuns = NULL;
     AFSIoRun           stIoRuns[AFS_MAX_STACK_IO_RUNS];
@@ -833,25 +975,32 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
     AFSCcb            *pCcb = (AFSCcb *)pFileObject->FsContext2;
     BOOLEAN            bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
     AFSDeviceExt      *pDevExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
-    ULONG              ulRequestCount = 0;
     LARGE_INTEGER      liCurrentTime, liLastRequestTime;
     AFSDeviceExt      *pControlDevExt = (AFSDeviceExt *)AFSControlDeviceObject->DeviceExtension;
     PFILE_OBJECT       pCacheFileObject = NULL;
+    BOOLEAN            bDerefExtents = FALSE;
 
     __Enter
     {
-        Irp->IoStatus.Information = 0;
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
+                      pFileObject,
+                      StartingByte.HighPart,
+                      StartingByte.LowPart,
+                      ByteCount));
 
         if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNonCachedWrite (%08lX) Request %08lX Actual %08lX larger than MaxIO %I64X\n",
+                          "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);
         }
@@ -865,10 +1014,10 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if( pSystemBuffer == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNonCachedWrite (%08lX) Failed to map system buffer\n",
-                          Irp);
+                          "AFSNonCachedWrite (%p) Failed to map system buffer\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
         }
@@ -878,28 +1027,29 @@ 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 %I64X Length %08lX\n",
+                      "AFSNonCachedWrite Requesting extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                       pFcb->ObjectInformation->FileId.Cell,
                       pFcb->ObjectInformation->FileId.Volume,
                       pFcb->ObjectInformation->FileId.Vnode,
                       pFcb->ObjectInformation->FileId.Unique,
                       StartingByte.QuadPart,
-                      ByteCount);
+                      ByteCount));
 
         ntStatus = AFSRequestExtentsAsync( pFcb,
+                                           pCcb,
                                            &StartingByte,
                                            ByteCount);
 
         if (!NT_SUCCESS(ntStatus))
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNonCachedWrite (%08lX) Failed to request extents Status %08lX\n",
+                          "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -909,11 +1059,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 %08lX SHARED %08lX\n",
+                          "AFSNonCachedWrite Acquiring Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             ASSERT( !ExIsResourceAcquiredLite( &pFcb->NPFcb->Specific.File.ExtentsResource ));
 
@@ -930,17 +1080,17 @@ 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 %08lX SHARED %08lX\n",
+                          "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;
 
             //
-            // We will re-request the extents after 10 seconds of waiting for them
+            // We will re-request the extents after waiting for them
             //
 
             KeQueryTickCount( &liCurrentTime);
@@ -948,28 +1098,29 @@ 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 %I64X Length %08lX\n",
+                              "AFSNonCachedWrite Requesting extents, again, for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
                               pFcb->ObjectInformation->FileId.Volume,
                               pFcb->ObjectInformation->FileId.Vnode,
                               pFcb->ObjectInformation->FileId.Unique,
                               StartingByte.QuadPart,
-                              ByteCount);
+                              ByteCount));
 
                 ntStatus = AFSRequestExtentsAsync( pFcb,
+                                                   pCcb,
                                                    &StartingByte,
                                                    ByteCount);
 
                 if (!NT_SUCCESS(ntStatus))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSNonCachedWrite (%08lX) Failed to request extents Status %08lX\n",
+                                  "AFSNonCachedWrite (%p) Failed to request extents Status %08lX\n",
                                   Irp,
-                                  ntStatus);
+                                  ntStatus));
 
                     try_return( ntStatus);
                 }
@@ -978,35 +1129,35 @@ 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 %I64X Length %08lX\n",
+                          "AFSNonCachedWrite Waiting for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                           pFcb->ObjectInformation->FileId.Cell,
                           pFcb->ObjectInformation->FileId.Volume,
                           pFcb->ObjectInformation->FileId.Vnode,
                           pFcb->ObjectInformation->FileId.Unique,
                           StartingByte.QuadPart,
-                          ByteCount);
+                          ByteCount));
 
             //
             // Wait for it
             //
 
-            ntStatus =  AFSWaitForExtentMapping ( pFcb );
+            ntStatus =  AFSWaitForExtentMapping ( pFcb, pCcb);
 
             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 %I64X Length %08lX Status %08lX\n",
+                              "AFSNonCachedWrite Failed wait for extents for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
                               pFcb->ObjectInformation->FileId.Volume,
                               pFcb->ObjectInformation->FileId.Vnode,
                               pFcb->ObjectInformation->FileId.Unique,
                               StartingByte.QuadPart,
                               ByteCount,
-                              ntStatus);
+                              ntStatus));
 
                 try_return( ntStatus);
             }
@@ -1016,15 +1167,15 @@ 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 %I64X Length %08lX\n",
+                      "AFSNonCachedWrite Extents located for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX\n",
                       pFcb->ObjectInformation->FileId.Cell,
                       pFcb->ObjectInformation->FileId.Volume,
                       pFcb->ObjectInformation->FileId.Vnode,
                       pFcb->ObjectInformation->FileId.Unique,
                       StartingByte.QuadPart,
-                      ByteCount);
+                      ByteCount));
 
         ntStatus = AFSGetExtents( pFcb,
                                   &StartingByte,
@@ -1036,21 +1187,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 (%08lX) Failed to retrieve mapped extents Status %08lX\n",
+                          "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 (%08lX) Successfully retrieved map extents count %08lX run count %08lX\n",
+                      "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))
         {
@@ -1079,11 +1230,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 (%08lX) Failed to process extent run for non-persistent cache Status %08lX\n",
+                              "AFSNonCachedWrite (%p) Failed to process extent run for non-persistent cache Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -1100,16 +1251,16 @@ 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 %I64X Length %08lX Status %08lX\n",
+                          "AFSNonCachedWrite Failed to retrieve cache fileobject for fid %08lX-%08lX-%08lX-%08lX Offset %0I64X Length %08lX Status %08lX\n",
                           pFcb->ObjectInformation->FileId.Cell,
                           pFcb->ObjectInformation->FileId.Volume,
                           pFcb->ObjectInformation->FileId.Vnode,
                           pFcb->ObjectInformation->FileId.Unique,
                           StartingByte.QuadPart,
                           ByteCount,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus);
         }
@@ -1123,10 +1274,10 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if (NULL == pIoRuns)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSNonCachedWrite (%08lX) Failed to allocate IO run block\n",
-                              Irp);
+                              "AFSNonCachedWrite (%p) Failed to allocate IO run block\n",
+                              Irp));
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES );
             }
@@ -1151,11 +1302,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 (%08lX) Failed to initialize IO run block Status %08lX\n",
+                          "AFSNonCachedWrite (%p) Failed to initialize IO run block Status %08lX\n",
                           Irp,
-                          ntStatus);
+                          ntStatus));
 
             try_return( ntStatus );
         }
@@ -1163,11 +1314,13 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         AFSReferenceActiveExtents( pStartExtent,
                                    extentsCount);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+        bDerefExtents = TRUE;
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSNonCachedWrite Releasing(2) Fcb extents lock %08lX SHARED %08lX\n",
+                      "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;
@@ -1179,16 +1332,16 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
         if (NULL == pGatherIo)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSNonCachedWrite (%08lX) Failed to allocate IO gather block\n",
-                          Irp);
+                          "AFSNonCachedWrite (%p) Failed to allocate IO gather block\n",
+                          Irp));
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNonCachedWrite Acquiring(1) Fcb extents lock %08lX SHARED %08lX\n",
+                          "AFSNonCachedWrite Acquiring(1) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1246,20 +1399,20 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                                      runCount,
                                      pGatherIo);
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSNonCachedWrite (%08lX) AFSStartIos completed Status %08lX\n",
+                      "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 %08lX SHARED %08lX\n",
+                          "AFSNonCachedWrite Acquiring(2) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1290,11 +1443,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 %08lX SHARED %08lX\n",
+                          "AFSNonCachedWrite Acquiring(3) Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
                               TRUE);
@@ -1306,42 +1459,56 @@ AFSNonCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             try_return( ntStatus);
         }
 
-        //
-        // Since this is dirty we can mark the extents dirty now.
-        // AFSMarkDirty will dereference the extents.  Do not call
-        // AFSDereferenceActiveExtents() in this code path.
-        //
-
-        AFSMarkDirty( pFcb,
-                      pStartExtent,
-                      extentsCount,
-                      &StartingByte);
+try_exit:
 
-        if (!bPagingIo)
+        if( NT_SUCCESS( ntStatus) &&
+            pStartExtent != NULL &&
+            Irp->IoStatus.Information > 0)
         {
+
+            if ( !bLocked)
+            {
+
+                AFSAcquireShared( &pFcb->NPFcb->Specific.File.ExtentsResource,
+                                  TRUE);
+                bLocked = TRUE;
+            }
+
             //
-            // This was an uncached user write - tell the server to do
-            // the flush when the worker thread next wakes up
+            // Since this is dirty we can mark the extents dirty now.
+            // AFSMarkDirty will dereference the extents.  Do not call
+            // AFSDereferenceActiveExtents() in this code path.
             //
-            pFcb->Specific.File.LastServerFlush.QuadPart = 0;
-        }
 
-        //
-        // All done
-        //
+            AFSMarkDirty( pFcb,
+                          pStartExtent,
+                          extentsCount,
+                          &StartingByte,
+                          bDerefExtents);
 
-try_exit:
+            if (!bPagingIo)
+            {
+                //
+                // This was an uncached user write - tell the server to do
+                // the flush when the worker thread next wakes up
+                //
+                pFcb->Specific.File.LastServerFlush.QuadPart = 0;
+            }
+        }
 
         if( pCacheFileObject != NULL)
         {
             AFSReleaseCacheFileObject( pCacheFileObject);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSNonCachedWrite (%08lX) Completed request Status %08lX\n",
-                      Irp,
-                      ntStatus);
+                      "AFSNonCachedWrite (FO: %p) StartingByte %08lX:%08lX Length %08lX Status %08lX\n",
+                      pFileObject,
+                      StartingByte.HighPart,
+                      StartingByte.LowPart,
+                      ByteCount,
+                      ntStatus));
 
         if (NT_SUCCESS(ntStatus) &&
             !bPagingIo &&
@@ -1354,35 +1521,35 @@ try_exit:
         if( bLocked)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNonCachedWrite Releasing Fcb extents lock %08lX SHARED %08lX\n",
+                          "AFSNonCachedWrite Releasing Fcb extents lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->Specific.File.ExtentsResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSReleaseResource( &pFcb->NPFcb->Specific.File.ExtentsResource );
         }
 
         if( pGatherIo)
         {
-            AFSExFreePool(pGatherIo);
+            AFSExFreePoolWithTag(pGatherIo, AFS_GATHER_TAG);
         }
 
         if( NULL != pIoRuns &&
             stIoRuns != pIoRuns)
         {
-            AFSExFreePool(pIoRuns);
+            AFSExFreePoolWithTag(pIoRuns, AFS_IO_RUN_TAG);
         }
 
         if( bCompleteIrp)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSNonCachedWrite Completing Irp %08lX Status %08lX Info %08lX\n",
+                          "AFSNonCachedWrite Completing Irp %p Status %08lX Info %08lX\n",
                           Irp,
                           ntStatus,
-                          Irp->IoStatus.Information);
+                          Irp->IoStatus.Information));
 
             AFSCompleteRequest( Irp, ntStatus);
         }
@@ -1393,21 +1560,190 @@ try_exit:
 
 static
 NTSTATUS
+AFSNonCachedWriteDirect( IN PDEVICE_OBJECT DeviceObject,
+                         IN PIRP Irp,
+                         IN LARGE_INTEGER StartingByte,
+                         IN ULONG ByteCount)
+{
+    NTSTATUS           ntStatus = STATUS_UNSUCCESSFUL;
+    VOID              *pSystemBuffer = NULL;
+    BOOLEAN            bPagingIo = BooleanFlagOn( Irp->Flags, IRP_PAGING_IO);
+    IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
+    PFILE_OBJECT       pFileObject = pIrpSp->FileObject;
+    AFSFcb            *pFcb = (AFSFcb *)pFileObject->FsContext;
+    AFSCcb            *pCcb = (AFSCcb *)pFileObject->FsContext2;
+    BOOLEAN            bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
+    BOOLEAN            bNoIntermediateBuffering = BooleanFlagOn( pFileObject->Flags, FO_NO_INTERMEDIATE_BUFFERING);
+    AFSDeviceExt      *pDevExt = (AFSDeviceExt *)DeviceObject->DeviceExtension;
+    AFSFileIOCB        stFileIORequest;
+    AFSFileIOResultCB  stFileIOResult;
+    ULONG              ulResultLen = 0;
+    ULONG              ulFlags;
+
+    __Enter
+    {
+        Irp->IoStatus.Information = 0;
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSNonCachedWriteDirect (FO: %p) StartingByte %08lX:%08lX Length %08lX\n",
+                      pFileObject,
+                      StartingByte.HighPart,
+                      StartingByte.LowPart,
+                      ByteCount));
+
+        if (ByteCount > pDevExt->Specific.RDR.MaxIo.QuadPart)
+        {
+
+            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));
+
+            try_return( ntStatus = STATUS_UNSUCCESSFUL);
+        }
+
+        //
+        // Get the mapping for the buffer
+        //
+        pSystemBuffer = AFSLockSystemBuffer( Irp,
+                                             ByteCount);
+
+        if( pSystemBuffer == NULL)
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSNonCachedWriteDirect (%p) Failed to map system buffer\n",
+                          Irp));
+
+            try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
+        }
+
+        //
+        // Issue the request at the service for processing
+        //
+
+        ulResultLen = sizeof( AFSFileIOResultCB);
+
+        RtlZeroMemory( &stFileIORequest,
+                       sizeof( AFSFileIOCB));
+
+        RtlZeroMemory( &stFileIOResult,
+                       sizeof( AFSFileIOResultCB));
+
+        stFileIORequest.SystemIOBuffer = pSystemBuffer;
+
+        stFileIORequest.SystemIOBufferMdl = Irp->MdlAddress;
+
+        stFileIORequest.IOLength = ByteCount;
+
+        stFileIORequest.IOOffset = StartingByte;
+
+        ulFlags = AFS_REQUEST_FLAG_SYNCHRONOUS;
+
+        if ( bNoIntermediateBuffering)
+        {
+
+            ulFlags |= AFS_REQUEST_FLAG_CACHE_BYPASS;
+        }
+
+        //
+        // Update file metadata
+        //
+
+        stFileIORequest.EndOfFile = pFcb->ObjectInformation->EndOfFile;
+
+        stFileIORequest.CreateTime = pFcb->ObjectInformation->CreationTime;
+
+        stFileIORequest.ChangeTime = pFcb->ObjectInformation->ChangeTime;
+
+        stFileIORequest.LastAccessTime = pFcb->ObjectInformation->LastAccessTime;
+
+        stFileIORequest.LastWriteTime = pFcb->ObjectInformation->LastWriteTime;
+
+        //
+        // Write the data to the service
+        //
+
+        ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PROCESS_WRITE_FILE,
+                                      ulFlags,
+                                      &pCcb->AuthGroup,
+                                      &pCcb->DirectoryCB->NameInformation.FileName,
+                                      &pFcb->ObjectInformation->FileId,
+                                      pFcb->ObjectInformation->VolumeCB->VolumeInformation.Cell,
+                                      pFcb->ObjectInformation->VolumeCB->VolumeInformation.CellLength,
+                                      &stFileIORequest,
+                                      sizeof( AFSFileIOCB),
+                                      &stFileIOResult,
+                                      &ulResultLen);
+
+        if( NT_SUCCESS( ntStatus))
+        {
+
+            Irp->IoStatus.Information = (ULONG_PTR)stFileIOResult.Length;
+        }
+        else
+        {
+
+            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                          AFS_TRACE_LEVEL_ERROR,
+                          "AFSNonCachedWriteDirect (%p) Failed to send write to service Status %08lX\n",
+                          Irp,
+                          ntStatus));
+        }
+
+try_exit:
+
+        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));
+
+        if (NT_SUCCESS(ntStatus) &&
+            !bPagingIo &&
+            bSynchronousFo)
+        {
+
+            pFileObject->CurrentByteOffset.QuadPart = StartingByte.QuadPart + ByteCount;
+        }
+
+        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                      AFS_TRACE_LEVEL_VERBOSE,
+                      "AFSNonCachedWriteDirect Completing Irp %p Status %08lX Info %08lX\n",
+                      Irp,
+                      ntStatus,
+                      Irp->IoStatus.Information));
+
+        AFSCompleteRequest( Irp, ntStatus);
+    }
+
+    return ntStatus;
+}
+
+static
+NTSTATUS
 AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                 IN PIRP Irp,
                 IN LARGE_INTEGER StartingByte,
                 IN ULONG ByteCount,
                 IN BOOLEAN ForceFlush)
 {
+    UNREFERENCED_PARAMETER(DeviceObject);
     PVOID              pSystemBuffer = NULL;
     NTSTATUS           ntStatus = STATUS_SUCCESS;
     IO_STATUS_BLOCK    iosbFlush;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PFILE_OBJECT       pFileObject = pIrpSp->FileObject;
     AFSFcb            *pFcb = (AFSFcb *)pFileObject->FsContext;
-    AFSCcb            *pCcb = (AFSCcb *)pFileObject->FsContext2;
     BOOLEAN            bSynchronousFo = BooleanFlagOn( pFileObject->Flags, FO_SYNCHRONOUS_IO);
-    BOOLEAN            bMapped = FALSE;
     ULONG              ulCurrentIO = 0, ulTotalLen = ByteCount;
     PMDL               pCurrentMdl = Irp->MdlAddress;
     LARGE_INTEGER      liCurrentOffset;
@@ -1435,11 +1771,11 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             {
                 ntStatus = GetExceptionCode();
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCachedWrite (%08lX) Exception thrown while preparing mdl write Status %08lX\n",
+                              "AFSCachedWrite (%p) Exception thrown while preparing mdl write Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             if( !NT_SUCCESS( ntStatus))
@@ -1455,11 +1791,11 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 Irp->MdlAddress = NULL;
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCachedWrite (%08lX) Failed to process MDL write Status %08lX\n",
+                              "AFSCachedWrite (%p) Failed to process MDL write Status %08lX\n",
                               Irp,
-                              ntStatus);
+                              ntStatus));
             }
 
             try_return( ntStatus);
@@ -1497,10 +1833,10 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
             if( pSystemBuffer == NULL)
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCachedWrite (%08lX) Failed to lock system buffer\n",
-                              Irp);
+                              "AFSCachedWrite (%p) Failed to lock system buffer\n",
+                              Irp));
 
                 try_return( ntStatus = STATUS_INSUFFICIENT_RESOURCES);
             }
@@ -1518,13 +1854,13 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                     // Failed to process request.
                     //
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSCachedWrite (%08lX) Failed to issue CcCopyWrite %wZ @ %0I64X Status %08lX\n",
+                                  "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);
                 }
@@ -1534,13 +1870,13 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = GetExceptionCode();
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
-                              "AFSCachedWrite (%08lX) CcCopyWrite Threw exception %wZ @ %0I64X Status %08lX\n",
+                              "AFSCachedWrite (%p) CcCopyWrite Threw exception %wZ @ %0I64X Status %08lX\n",
                               Irp,
                               &pFileObject->FileName,
                               liCurrentOffset.QuadPart,
-                              ntStatus);
+                              ntStatus));
             }
 
             if( !NT_SUCCESS( ntStatus))
@@ -1548,7 +1884,8 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                 try_return( ntStatus);
             }
 
-            if( ForceFlush)
+            if( ForceFlush ||
+                BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
             {
 
                 //
@@ -1563,9 +1900,9 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                 if( !NT_SUCCESS( iosbFlush.Status))
                 {
 
-                    AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                                   AFS_TRACE_LEVEL_ERROR,
-                                  "AFSCachedWrite (%08lX) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
+                                  "AFSCachedWrite (%p) CcFlushCache failure %wZ FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                                   Irp,
                                   &pFileObject->FileName,
                                   pFcb->ObjectInformation->FileId.Cell,
@@ -1573,7 +1910,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                                   pFcb->ObjectInformation->FileId.Vnode,
                                   pFcb->ObjectInformation->FileId.Unique,
                                   iosbFlush.Status,
-                                  iosbFlush.Information);
+                                  iosbFlush.Information));
 
                     try_return( ntStatus = iosbFlush.Status);
                 }
@@ -1598,23 +1935,8 @@ 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 (BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
+            if ( ForceFlush ||
+                 BooleanFlagOn(pFileObject->Flags, (FO_NO_INTERMEDIATE_BUFFERING + FO_WRITE_THROUGH)))
             {
                 //
                 // Write through asked for... Set things so that we get
@@ -1622,14 +1944,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,
@@ -1670,15 +1984,9 @@ AFSExtendingWrite( IN AFSFcb *Fcb,
     // Tell the server
     //
 
-    ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentObjectInformation->FileId,
+    ntStatus = AFSUpdateFileInformation( &Fcb->ObjectInformation->ParentFileId,
                                          Fcb->ObjectInformation,
-                                         &Fcb->AuthGroup);
-
-    AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                  AFS_TRACE_LEVEL_VERBOSE,
-                  "AFSExtendingWrite Acquiring Fcb lock %08lX EXCL %08lX\n",
-                  &Fcb->NPFcb->Resource,
-                  PsGetCurrentThread());
+                                         &pCcb->AuthGroup);
 
     if (NT_SUCCESS(ntStatus))
     {
@@ -1716,8 +2024,8 @@ AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
                IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(DeviceObject);
     NTSTATUS ntStatus = STATUS_SUCCESS;
-    AFSPIOCtlIORequestCB stIORequestCB;
     PIO_STACK_LOCATION pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     AFSFcb *pFcb = NULL;
     AFSCcb *pCcb = NULL;
@@ -1733,11 +2041,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)
         {
@@ -1759,10 +2067,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);
         }
@@ -1804,9 +2112,11 @@ AFSShareWrite( IN PDEVICE_OBJECT DeviceObject,
 
         ntStatus = AFSProcessRequest( AFS_REQUEST_TYPE_PIPE_WRITE,
                                       AFS_REQUEST_FLAG_SYNCHRONOUS,
-                                      &pFcb->AuthGroup,
+                                      &pCcb->AuthGroup,
                                       &pCcb->DirectoryCB->NameInformation.FileName,
                                       NULL,
+                                      NULL,
+                                      0,
                                       pIoRequest,
                                       sizeof( AFSPipeIORequestCB) +
                                                 pIrpSp->Parameters.Write.Length,
@@ -1816,20 +2126,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 (%08lX) Failed service write Status %08lX\n",
+                          "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;
 
@@ -1844,7 +2154,7 @@ try_exit:
         if( pIoRequest != NULL)
         {
 
-            AFSExFreePool( pIoRequest);
+            AFSExFreePoolWithTag( pIoRequest, AFS_GENERIC_MEMORY_14_TAG);
         }
     }