Windows: Skip Extent operations if Direct IO
[openafs.git] / src / WINNT / afsrdr / kernel / lib / AFSGeneric.cpp
index 668d420..94fb9e1 100644 (file)
@@ -1695,6 +1695,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     IO_STATUS_BLOCK stIoStatus;
     ULONG ulFilter = 0;
     AFSObjectInfoCB * pParentObjectInfo = NULL;
@@ -1870,6 +1871,15 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                               (*ppObjectInfo)->FileId.Vnode,
                               (*ppObjectInfo)->FileId.Unique));
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Acquiring Fcb lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSAcquireExcl( &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                               TRUE);
+
                AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                              AFS_TRACE_LEVEL_VERBOSE,
                              "AFSInvalidateObject Flush/purge Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
@@ -1950,14 +1960,26 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
 
                 AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->SectionObjectResource);
 
-                //
-                // Clear out the extents
-                // Get rid of them (note this involves waiting
-                // for any writes or reads to the cache to complete)
-                //
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSInvalidateObject Flush/purge Releasing Fcb lock %p EXCL %08lX\n",
+                             &(*ppObjectInfo)->Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
 
-                AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
-                                       NULL);
+               AFSReleaseResource( &(*ppObjectInfo)->Fcb->NPFcb->Resource);
+
+               if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+
+                   //
+                   // Clear out the extents
+                   // Get rid of them (note this involves waiting
+                   // for any writes or reads to the cache to complete)
+                   //
+
+                   AFSTearDownFcbExtents( (*ppObjectInfo)->Fcb,
+                                          NULL);
+               }
             }
 
             (*ppObjectInfo)->DataVersion.QuadPart = (ULONGLONG)-1;
@@ -2900,6 +2922,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSObjectInfoCB *pObjectInfo = DirEntry->ObjectInformation;
     IO_STATUS_BLOCK stIoStatus;
@@ -3050,6 +3073,15 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                                   pObjectInfo->FileId.Vnode,
                                   pObjectInfo->FileId.Unique));
 
+                   AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+                                 &pObjectInfo->Fcb->NPFcb->Resource,
+                                 PsGetCurrentThread()));
+
+                   AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                                   TRUE);
+
                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                                  AFS_TRACE_LEVEL_VERBOSE,
                                  "AFSVerifyEntry Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
@@ -3131,21 +3163,33 @@ AFSVerifyEntry( IN GUID *AuthGroup,
 
                     AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->SectionObjectResource);
 
-                   AFSFlushExtents( pObjectInfo->Fcb,
-                                    AuthGroup);
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    //
-                   // Acquire the Fcb to purge the cache
-                    //
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Releasing Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
-                                  &pObjectInfo->Fcb->NPFcb->Resource,
-                                  PsGetCurrentThread()));
+                       AFSReleaseResource( &pObjectInfo->Fcb->NPFcb->Resource);
 
-                    AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
-                                    TRUE);
+                       AFSFlushExtents( pObjectInfo->Fcb,
+                                        AuthGroup);
+
+                       //
+                       // Acquire the Fcb to purge the cache
+                       //
+
+                       AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSVerifyEntry Acquiring Fcb lock %p EXCL %08lX\n",
+                                     &pObjectInfo->Fcb->NPFcb->Resource,
+                                     PsGetCurrentThread()));
+
+                       AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->Resource,
+                                       TRUE);
+                   }
 
                     //
                     // Update the metadata for the entry
@@ -3976,6 +4020,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 {
 
     NTSTATUS ntStatus = STATUS_SUCCESS;
+    AFSDeviceExt *pRDRDevExt = (AFSDeviceExt *) AFSRDRDeviceObject->DeviceExtension;
     LARGE_INTEGER liSystemTime;
     AFSDirEnumEntry *pDirEnumEntry = NULL;
     AFSFcb *pCurrentFcb = NULL;
@@ -4214,14 +4259,6 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                        AFSAcquireExcl( &pCurrentFcb->NPFcb->SectionObjectResource,
                                        TRUE);
 
-                       //
-                       // Release Fcb->Resource to avoid Trend Micro deadlock
-                       //
-
-                       AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
-
-                       bReleaseFcb = FALSE;
-
                        __try
                        {
 
@@ -4305,7 +4342,10 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
 
                            SetFlag( pObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                        }
+                   }
 
+                   if (bReleaseFcb)
+                   {
                        AFSReleaseResource( &pCurrentFcb->NPFcb->Resource);
 
                        bReleaseFcb = FALSE;
@@ -4314,8 +4354,12 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                    if ( bPurgeExtents &&
                         bSafeToPurge)
                    {
-                       AFSFlushExtents( pCurrentFcb,
-                                        AuthGroup);
+
+                       if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                       {
+                           AFSFlushExtents( pCurrentFcb,
+                                            AuthGroup);
+                       }
                    }
                }
 
@@ -6865,11 +6909,11 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Acquiring Fcb lock %p SHARED %08lX\n",
+                             "AFSCleanupEntry Acquiring Fcb lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->Resource,
                               PsGetCurrentThread()));
 
-                AFSAcquireShared( &Fcb->NPFcb->Resource,
+               AFSAcquireExcl( &Fcb->NPFcb->Resource,
                                   TRUE);
 
                 if( Fcb->OpenReferenceCount > 0)
@@ -6957,76 +7001,87 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanupEntry Releasing Fcb lock %p SHARED %08lX\n",
+                             "AFSCleanupEntry Releasing Fcb lock %p EXCL %08lX\n",
                               &Fcb->NPFcb->Resource,
                               PsGetCurrentThread()));
 
                 AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                //
-                // Wait for any currently running flush or release requests to complete
-                //
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+                   //
+                   // Wait for any currently running flush or release requests to complete
+                   //
 
-                AFSWaitOnQueuedFlushes( Fcb);
+                   AFSWaitOnQueuedFlushes( Fcb);
 
-                //
-                // Now perform another flush on the file
-                //
+                   //
+                   // Now perform another flush on the file
+                   //
 
-                if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                                  NULL)))
-                {
+                   if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                     NULL)))
+                   {
 
-                    AFSReleaseExtentsWithFlush( Fcb,
-                                                NULL,
-                                                TRUE);
-                }
-            }
+                       AFSReleaseExtentsWithFlush( Fcb,
+                                                   NULL,
+                                                   TRUE);
+                   }
+               }
+           }
 
-            if( Fcb->OpenReferenceCount == 0 ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-                BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-            {
+           if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+           {
 
-                AFSTearDownFcbExtents( Fcb,
-                                       NULL);
-            }
+               if( Fcb->OpenReferenceCount == 0 ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+                   BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+               {
+
+                   AFSTearDownFcbExtents( Fcb,
+                                          NULL);
+               }
+           }
 
             try_return( ntStatus);
         }
 
         KeQueryTickCount( &liTime);
 
-        //
-        // First up are there dirty extents in the cache to flush?
-        //
-
-        if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
-            BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
-        {
-
-            //
-            // The file has been marked as invalid.  Dump it
-            //
+       if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+       {
+           //
+           // First up are there dirty extents in the cache to flush?
+           //
 
-            AFSTearDownFcbExtents( Fcb,
-                                   NULL);
-        }
-        else if( ForceFlush ||
-            ( ( Fcb->Specific.File.ExtentsDirtyCount ||
-                Fcb->Specific.File.ExtentCount) &&
-              (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
-                                                    >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
-        {
-            if( !NT_SUCCESS( AFSFlushExtents( Fcb,
-                                              NULL)) &&
-                Fcb->OpenReferenceCount == 0)
-            {
+           if( BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_OBJECT_INVALID) ||
+               BooleanFlagOn( Fcb->ObjectInformation->Flags, AFS_OBJECT_FLAGS_DELETED))
+           {
+
+               //
+               // The file has been marked as invalid.  Dump it
+               //
+
+               AFSTearDownFcbExtents( Fcb,
+                                      NULL);
+           }
+           else if( ForceFlush ||
+                    ( ( Fcb->Specific.File.ExtentsDirtyCount ||
+                        Fcb->Specific.File.ExtentCount) &&
+                      (liTime.QuadPart - Fcb->Specific.File.LastServerFlush.QuadPart)
+                      >= pControlDeviceExt->Specific.Control.FcbFlushTimeCount.QuadPart))
+           {
+
+               if( !NT_SUCCESS( AFSFlushExtents( Fcb,
+                                                 NULL)) &&
+                   Fcb->OpenReferenceCount == 0)
+               {
 
-                AFSReleaseExtentsWithFlush( Fcb,
-                                            NULL,
-                                            TRUE);
-            }
+                   AFSReleaseExtentsWithFlush( Fcb,
+                                               NULL,
+                                               TRUE);
+               }
+           }
         }
 
         //
@@ -7041,6 +7096,24 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                                         (AFS_SERVER_PURGE_SLEEP * pControlDeviceExt->Specific.Control.FcbPurgeTimeCount.QuadPart))))
         {
 
+           AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                         AFS_TRACE_LEVEL_VERBOSE,
+                         "AFSCleanupFcb Acquiring Fcb lock %p EXCL %08lX\n",
+                         &Fcb->NPFcb->Resource,
+                         PsGetCurrentThread()));
+
+           if ( AFSAcquireExcl( &Fcb->NPFcb->Resource, ForceFlush) == FALSE)
+           {
+
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Failed to Acquire Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               try_return( ntStatus = STATUS_RETRY);
+           }
+
            AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING|AFS_SUBSYSTEM_SECTION_OBJECT,
                           AFS_TRACE_LEVEL_VERBOSE,
                           "AFSCleanupFcb Acquiring Fcb SectionObject lock %p EXCL %08lX\n",
@@ -7119,16 +7192,28 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
 
                 AFSReleaseResource( &Fcb->NPFcb->SectionObjectResource);
 
-                if( Fcb->OpenReferenceCount <= 0)
-                {
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
 
-                    //
-                    // Tear em down we'll not be needing them again
-                    //
+               AFSReleaseResource( &Fcb->NPFcb->Resource);
 
-                    AFSTearDownFcbExtents( Fcb,
-                                           NULL);
-                }
+               if( !BooleanFlagOn( pRDRDeviceExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+               {
+
+                   if( Fcb->OpenReferenceCount <= 0)
+                   {
+
+                       //
+                       // Tear em down we'll not be needing them again
+                       //
+
+                       AFSTearDownFcbExtents( Fcb,
+                                              NULL);
+                   }
+               }
             }
             else
             {
@@ -7139,6 +7224,14 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                              &Fcb->NPFcb->SectionObjectResource,
                              PsGetCurrentThread()));
 
+               AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCleanupFcb Releasing Fcb lock %p EXCL %08lX\n",
+                             &Fcb->NPFcb->Resource,
+                             PsGetCurrentThread()));
+
+               AFSReleaseResource( &Fcb->NPFcb->Resource);
+
                 ntStatus = STATUS_RETRY;
             }
         }
@@ -9054,38 +9147,51 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
     __Enter
     {
 
-        switch( InvalidateReason)
+       switch( InvalidateReason)
         {
 
             case AFS_INVALIDATE_DELETED:
             {
 
-                if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
+               AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSPerformObjectInvalidation on node type %d for FID %08lX-%08lX-%08lX-%08lX Reason DELETED\n",
+                             ObjectInfo->FileType,
+                             ObjectInfo->FileId.Cell,
+                             ObjectInfo->FileId.Volume,
+                             ObjectInfo->FileId.Vnode,
+                             ObjectInfo->FileId.Unique));
+
+               if( ObjectInfo->FileType == AFS_FILE_TYPE_FILE &&
                     ObjectInfo->Fcb != NULL)
                 {
 
-                    AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
-                                    TRUE);
+                   if( !BooleanFlagOn( pRDRDevExt->DeviceFlags, AFS_DEVICE_FLAG_DIRECT_SERVICE_IO))
+                   {
 
-                    ObjectInfo->Links = 0;
+                       AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource,
+                                       TRUE);
 
-                    ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
+                       ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestStatus = STATUS_FILE_DELETED;
 
-                    KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
-                                0,
-                                FALSE);
+                       KeSetEvent( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsRequestComplete,
+                                   0,
+                                   FALSE);
 
-                    //
-                    // Clear out the extents
-                    // And get rid of them (note this involves waiting
-                    // for any writes or reads to the cache to complete)
-                    //
+                       //
+                       // Clear out the extents
+                       // And get rid of them (note this involves waiting
+                       // for any writes or reads to the cache to complete)
+                       //
 
-                    AFSTearDownFcbExtents( ObjectInfo->Fcb,
-                                           NULL);
+                       AFSTearDownFcbExtents( ObjectInfo->Fcb,
+                                              NULL);
 
-                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
-                }
+                       AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Specific.File.ExtentsResource);
+                   }
+               }
+
+               ObjectInfo->Links = 0;
 
                 break;
             }
@@ -9118,7 +9224,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                         AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                         TRUE);
 
-                        __try
+                       __try
                         {
 
                             if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
@@ -9257,10 +9363,6 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                     AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                                     TRUE);
 
-                                    AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
-                                    bLocked = FALSE;
-
                                     __try
                                     {
 
@@ -9311,6 +9413,10 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                   PsGetCurrentThread()));
 
                                     AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                                   AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+                                   bLocked = FALSE;
                                 }
                             }
                             else
@@ -9329,10 +9435,6 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                 AFSAcquireExcl( &ObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                                 TRUE);
 
-                                AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
-
-                                bLocked = FALSE;
-
                                 //
                                 // Must build a list of non-dirty ranges from the beginning of the file
                                 // to the end.  There can be at most (Fcb->Specific.File.ExtentsDirtyCount + 1)
@@ -9551,6 +9653,10 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                               PsGetCurrentThread()));
 
                                 AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->SectionObjectResource);
+
+                               AFSReleaseResource( &ObjectInfo->Fcb->NPFcb->Resource);
+
+                               bLocked = FALSE;
                             }
                         }