Windows: Skip Extent operations if Direct IO
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSFlushBuffers.cpp
index 0028383..524feec 100644 (file)
@@ -43,6 +43,8 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
                  IN PIRP Irp)
 {
 
+    UNREFERENCED_PARAMETER(LibDeviceObject);
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     NTSTATUS           ntStatus = STATUS_SUCCESS;
     IO_STACK_LOCATION *pIrpSp = IoGetCurrentIrpStackLocation( Irp);
     PFILE_OBJECT       pFileObject = pIrpSp->FileObject;
@@ -59,10 +61,10 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
         if( pFcb == NULL)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING,
+            AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
                           AFS_TRACE_LEVEL_ERROR,
-                          "AFSFlushBuffers Attempted access (%08lX) when pFcb == NULL\n",
-                          Irp);
+                          "AFSFlushBuffers Attempted access (%p) when pFcb == NULL\n",
+                          Irp));
 
             try_return( ntStatus = STATUS_INVALID_DEVICE_REQUEST);
         }
@@ -86,11 +88,11 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
             try_return( ntStatus = STATUS_INVALID_PARAMETER);
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                       AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSFlushBuffers Acquiring Fcb SectionObject lock %08lX SHARED %08lX\n",
+                      "AFSFlushBuffers Acquiring Fcb SectionObject lock %p SHARED %08lX\n",
                       &pFcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+                      PsGetCurrentThread()));
 
         AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
                           TRUE);
@@ -110,7 +112,7 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
             if (!NT_SUCCESS( iosb.Status ))
             {
 
-                AFSDbgLogMsg( AFS_SUBSYSTEM_IO_PROCESSING,
+                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
                               AFS_TRACE_LEVEL_ERROR,
                               "AFSFlushBuffers CcFlushCache [1] failure FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX Bytes 0x%08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
@@ -118,54 +120,58 @@ AFSFlushBuffers( IN PDEVICE_OBJECT LibDeviceObject,
                               pFcb->ObjectInformation->FileId.Vnode,
                               pFcb->ObjectInformation->FileId.Unique,
                               iosb.Status,
-                              iosb.Information);
+                              iosb.Information));
 
                 try_return( ntStatus = iosb.Status );
             }
         }
-        __except( EXCEPTION_EXECUTE_HANDLER)
+       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
         {
 
             try_return( ntStatus = GetExceptionCode());
         }
 
-        AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                      AFS_TRACE_LEVEL_VERBOSE,
-                      "AFSFlushBuffers Releasing Fcb SectionObject lock %08lX SHARED %08lX\n",
-                      &pFcb->NPFcb->SectionObjectResource,
-                      PsGetCurrentThread());
+       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+       {
 
-        AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSFlushBuffers Releasing Fcb SectionObject lock %p SHARED %08lX\n",
+                         &pFcb->NPFcb->SectionObjectResource,
+                         PsGetCurrentThread()));
 
-        bReleaseSectionObject = FALSE;
+           AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
 
-        //
-        // Now, flush to the server - if there is stuff to do
-        //
+           bReleaseSectionObject = FALSE;
 
-        ntStatus = AFSFlushExtents( pFcb,
-                                    &pCcb->AuthGroup);
+           //
+           // Now, flush to the server - if there is stuff to do
+           //
 
-        if( !NT_SUCCESS( ntStatus))
-        {
+           ntStatus = AFSFlushExtents( pFcb,
+                                       &pCcb->AuthGroup);
 
-            AFSReleaseExtentsWithFlush( pFcb,
-                                        &pCcb->AuthGroup,
-                                        TRUE);
+           if( !NT_SUCCESS( ntStatus))
+           {
 
-            ntStatus = STATUS_SUCCESS;
-        }
+               AFSReleaseExtentsWithFlush( pFcb,
+                                           &pCcb->AuthGroup,
+                                           TRUE);
+
+               ntStatus = STATUS_SUCCESS;
+           }
+       }
 
 try_exit:
 
         if ( bReleaseSectionObject)
         {
 
-            AFSDbgLogMsg( AFS_SUBSYSTEM_LOCK_PROCESSING,
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                           AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSFlushBuffers Releasing Fcb SectionObject lock %08lX SHARED %08lX\n",
+                          "AFSFlushBuffers Releasing Fcb SectionObject lock %p SHARED %08lX\n",
                           &pFcb->NPFcb->SectionObjectResource,
-                          PsGetCurrentThread());
+                          PsGetCurrentThread()));
 
             AFSReleaseResource( &pFcb->NPFcb->SectionObjectResource);
         }