Windows: RDR capture Cc/Mm exceptions do not break
authorJeffrey Altman <jaltman@your-file-system.com>
Wed, 27 Nov 2013 17:26:44 +0000 (12:26 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Tue, 3 Dec 2013 21:28:22 +0000 (13:28 -0800)
All of the Cc and Mm functions are wrapped in try/except blocks.
The purpose is to ensure that Cc and Mm do not return an error as
an exception which could result in the afs redirector failing to
release a resource.   Instead of calling the AFS exception handler
just handle the exception with EXCEPTION_EXECUTE_HANDLER.  This permits
the __except block to capture the exception code.

The AFS exception handler will throw its own exception if the
AFSDebugFlags AFS_DBG_BUGCHECK_EXCEPTION bit is set.  This is helpful when
debugging exceptions thrown by errors in the afs redirector code.  It is
not helpful when a Cc function throws an exception.  For example,
CcReadCopy() will throw STATUS_DELETE_FILE as an exception if an attempt
to read from a deleted file is initiated.   This should simply fail the
read operation not BSOD the system.

Change-Id: I2fd1d4db530600441272e59353fbf28b831e2691
Reviewed-on: http://gerrit.openafs.org/10524
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsrdr/kernel/lib/AFSCleanup.cpp
src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/AFSRead.cpp
src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp

index 27e301f..5fa79a3 100644 (file)
@@ -328,7 +328,7 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                                            NULL,
                                            NULL);
                }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                {
 
                    ntStatus = GetExceptionCode();
index b0f8f53..71b7d00 100644 (file)
@@ -2272,7 +2272,7 @@ AFSSetDispositionInfo( IN PIRP Irp,
                         }
                     }
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                {
 
                    bMmFlushed = FALSE;
index c889513..7151a28 100644 (file)
@@ -1941,7 +1941,7 @@ AFSInvalidateObject( IN OUT AFSObjectInfoCB **ppObjectInfo,
                         }
                     }
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -3160,7 +3160,7 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                             }
                         }
                     }
-                   __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
                         ntStatus = GetExceptionCode();
 
@@ -4371,7 +4371,7 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                                }
                            }
                        }
-                       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                       __except( EXCEPTION_EXECUTE_HANDLER)
                        {
                            ntStatus = GetExceptionCode();
 
@@ -7051,7 +7051,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                             }
                         }
                     }
-                   __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
 
                         ntStatus = GetExceptionCode();
@@ -7247,7 +7247,7 @@ AFSCleanupFcb( IN AFSFcb *Fcb,
                         }
                     }
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -9335,7 +9335,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                SetFlag( ObjectInfo->Flags, AFS_OBJECT_FLAGS_VERIFY_DATA);
                             }
                         }
-                       __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                       __except( EXCEPTION_EXECUTE_HANDLER)
                         {
 
                             ntStatus = GetExceptionCode();
@@ -9483,7 +9483,7 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                             bCleanExtents = TRUE;
                                         }
                                     }
-                                   __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+                                   __except( EXCEPTION_EXECUTE_HANDLER)
                                     {
 
                                         ntStatus = GetExceptionCode();
@@ -9564,28 +9564,46 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                                 ulSize = ByteRangeList[ulIndex].Length.QuadPart > DWORD_MAX ? DWORD_MAX : ByteRangeList[ulIndex].Length.LowPart;
 
-                                                if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
-                                                    !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                          &ByteRangeList[ulIndex].FileOffset,
-                                                                          ulSize,
-                                                                          FALSE))
-                                                {
-
-                                                    AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                                  AFS_TRACE_LEVEL_WARNING,
-                                                                  "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                                  ObjectInfo->FileId.Cell,
-                                                                  ObjectInfo->FileId.Volume,
-                                                                  ObjectInfo->FileId.Vnode,
-                                                                  ObjectInfo->FileId.Unique));
-
-                                                    bPurgeOnClose = TRUE;
-                                                }
-                                                else
-                                                {
-
-                                                    bCleanExtents = TRUE;
-                                                }
+                                               __try
+                                               {
+
+                                                   if( ObjectInfo->Fcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL &&
+                                                       !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                             &ByteRangeList[ulIndex].FileOffset,
+                                                                             ulSize,
+                                                                             FALSE))
+                                                   {
+
+                                                       AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                     AFS_TRACE_LEVEL_WARNING,
+                                                                     "AFSPerformObjectInvalidation [1] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                     ObjectInfo->FileId.Cell,
+                                                                     ObjectInfo->FileId.Volume,
+                                                                     ObjectInfo->FileId.Vnode,
+                                                                     ObjectInfo->FileId.Unique));
+
+                                                       bPurgeOnClose = TRUE;
+                                                   }
+                                                   else
+                                                   {
+
+                                                       bCleanExtents = TRUE;
+                                                   }
+                                               }
+                                               __except( EXCEPTION_EXECUTE_HANDLER)
+                                               {
+
+                                                   ntStatus = GetExceptionCode();
+
+                                                   AFSDbgTrace(( 0,
+                                                                 0,
+                                                                 "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (1) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                 ObjectInfo->FileId.Cell,
+                                                                 ObjectInfo->FileId.Volume,
+                                                                 ObjectInfo->FileId.Vnode,
+                                                                 ObjectInfo->FileId.Unique,
+                                                                 ntStatus));
+                                               }
 
                                                 ByteRangeList[ulIndex].Length.QuadPart -= ulSize;
 
@@ -9623,27 +9641,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
 
                                                 if( !BooleanFlagOn( pEntry->Flags, AFS_EXTENT_DIRTY))
                                                 {
-                                                    if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                              &pEntry->FileOffset,
-                                                                              pEntry->Size,
-                                                                              FALSE))
-                                                    {
-
-                                                        AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                                      AFS_TRACE_LEVEL_WARNING,
-                                                                      "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                                      ObjectInfo->FileId.Cell,
-                                                                      ObjectInfo->FileId.Volume,
-                                                                      ObjectInfo->FileId.Vnode,
-                                                                      ObjectInfo->FileId.Unique));
-
-                                                        bPurgeOnClose = TRUE;
-                                                    }
-                                                    else
-                                                    {
-
-                                                        bCleanExtents = TRUE;
-                                                    }
+                                                   __try
+                                                   {
+                                                       if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                                 &pEntry->FileOffset,
+                                                                                 pEntry->Size,
+                                                                                 FALSE))
+                                                       {
+
+                                                           AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                         AFS_TRACE_LEVEL_WARNING,
+                                                                         "AFSPerformObjectInvalidation [2] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                         ObjectInfo->FileId.Cell,
+                                                                         ObjectInfo->FileId.Volume,
+                                                                         ObjectInfo->FileId.Vnode,
+                                                                         ObjectInfo->FileId.Unique));
+
+                                                           bPurgeOnClose = TRUE;
+                                                       }
+                                                       else
+                                                       {
+
+                                                           bCleanExtents = TRUE;
+                                                       }
+                                                   }
+                                                   __except( EXCEPTION_EXECUTE_HANDLER)
+                                                   {
+
+                                                       ntStatus = GetExceptionCode();
+
+                                                       AFSDbgTrace(( 0,
+                                                                     0,
+                                                                     "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (2) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                     ObjectInfo->FileId.Cell,
+                                                                     ObjectInfo->FileId.Volume,
+                                                                     ObjectInfo->FileId.Vnode,
+                                                                     ObjectInfo->FileId.Unique,
+                                                                     ntStatus));
+                                                   }
                                                 }
 
                                                 if( liCurrentOffset.QuadPart < pEntry->FileOffset.QuadPart)
@@ -9663,27 +9698,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                                             ulFlushLength = liFlushLength.LowPart;
                                                         }
 
-                                                        if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                                  &liCurrentOffset,
-                                                                                  ulFlushLength,
-                                                                                  FALSE))
-                                                        {
-
-                                                            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                                          AFS_TRACE_LEVEL_WARNING,
-                                                                          "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                                          ObjectInfo->FileId.Cell,
-                                                                          ObjectInfo->FileId.Volume,
-                                                                          ObjectInfo->FileId.Vnode,
-                                                                          ObjectInfo->FileId.Unique));
-
-                                                            bPurgeOnClose = TRUE;
-                                                        }
-                                                        else
-                                                        {
-
-                                                            bCleanExtents = TRUE;
-                                                        }
+                                                       __try
+                                                       {
+                                                           if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                                     &liCurrentOffset,
+                                                                                     ulFlushLength,
+                                                                                     FALSE))
+                                                           {
+
+                                                               AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                             AFS_TRACE_LEVEL_WARNING,
+                                                                             "AFSPerformObjectInvalidation [3] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                             ObjectInfo->FileId.Cell,
+                                                                             ObjectInfo->FileId.Volume,
+                                                                             ObjectInfo->FileId.Vnode,
+                                                                             ObjectInfo->FileId.Unique));
+
+                                                               bPurgeOnClose = TRUE;
+                                                           }
+                                                           else
+                                                           {
+
+                                                               bCleanExtents = TRUE;
+                                                           }
+                                                       }
+                                                       __except( EXCEPTION_EXECUTE_HANDLER)
+                                                       {
+
+                                                           ntStatus = GetExceptionCode();
+
+                                                           AFSDbgTrace(( 0,
+                                                                         0,
+                                                                         "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (3) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                                         ObjectInfo->FileId.Cell,
+                                                                         ObjectInfo->FileId.Volume,
+                                                                         ObjectInfo->FileId.Vnode,
+                                                                         ObjectInfo->FileId.Unique,
+                                                                         ntStatus));
+                                                       }
 
                                                         liFlushLength.QuadPart -= ulFlushLength;
                                                     }
@@ -9697,27 +9749,44 @@ AFSPerformObjectInvalidate( IN AFSObjectInfoCB *ObjectInfo,
                                         }
                                         else
                                         {
-                                            if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                                      NULL,
-                                                                      0,
-                                                                      FALSE))
-                                            {
-
-                                                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                                                              AFS_TRACE_LEVEL_WARNING,
-                                                              "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
-                                                              ObjectInfo->FileId.Cell,
-                                                              ObjectInfo->FileId.Volume,
-                                                              ObjectInfo->FileId.Vnode,
-                                                              ObjectInfo->FileId.Unique));
-
-                                                bPurgeOnClose = TRUE;
-                                            }
-                                            else
-                                            {
-
-                                                bCleanExtents = TRUE;
-                                            }
+                                           __try
+                                           {
+                                               if( !CcPurgeCacheSection( &ObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                                         NULL,
+                                                                         0,
+                                                                         FALSE))
+                                               {
+
+                                                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                                                 AFS_TRACE_LEVEL_WARNING,
+                                                                 "AFSPerformObjectInvalidation [4] CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                                                 ObjectInfo->FileId.Cell,
+                                                                 ObjectInfo->FileId.Volume,
+                                                                 ObjectInfo->FileId.Vnode,
+                                                                 ObjectInfo->FileId.Unique));
+
+                                                   bPurgeOnClose = TRUE;
+                                               }
+                                               else
+                                               {
+
+                                                   bCleanExtents = TRUE;
+                                               }
+                                           }
+                                           __except( EXCEPTION_EXECUTE_HANDLER)
+                                           {
+
+                                               ntStatus = GetExceptionCode();
+
+                                               AFSDbgTrace(( 0,
+                                                             0,
+                                                             "EXCEPTION - AFSPerformObjectInvalidation CcPurgeCacheSection (4) FID %08lX-%08lX-%08lX-%08lX Status %08lX\n",
+                                                             ObjectInfo->FileId.Cell,
+                                                             ObjectInfo->FileId.Volume,
+                                                             ObjectInfo->FileId.Vnode,
+                                                             ObjectInfo->FileId.Unique,
+                                                             ntStatus));
+                                           }
                                         }
 
                                         if ( bPurgeOnClose)
index 723429d..32575af 100644 (file)
@@ -128,7 +128,7 @@ AFSCachedRead( IN PDEVICE_OBJECT DeviceObject,
                     try_return( ntStatus = Irp->IoStatus.Status);
                 }
             }
-           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           __except( EXCEPTION_EXECUTE_HANDLER)
             {
                 ntStatus = GetExceptionCode();
 
@@ -1155,7 +1155,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject,
 
                try_return( ntStatus = STATUS_SUCCESS );
            }
-           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           __except( EXCEPTION_EXECUTE_HANDLER)
            {
 
                ntStatus = GetExceptionCode();
@@ -1339,7 +1339,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject,
                     CcSetDirtyPageThreshold( pFileObject,
                                              AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -1376,7 +1376,7 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject,
                                &Irp->IoStatus);
                     ntStatus = Irp->IoStatus.Status;
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
                     ntStatus = GetExceptionCode();
 
index 05a715d..141fccd 100644 (file)
@@ -386,7 +386,7 @@ AFSCommonWrite( IN PDEVICE_OBJECT DeviceObject,
                     CcSetDirtyPageThreshold( pFileObject,
                                              AFS_DIRTY_CHUNK_THRESHOLD * pDeviceExt->Specific.RDR.MaximumRPCLength / 4096);
                 }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                     ntStatus = GetExceptionCode();
@@ -829,7 +829,7 @@ try_exit:
                    SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                }
            }
-           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           __except( EXCEPTION_EXECUTE_HANDLER)
            {
 
                DWORD ntStatus2 = GetExceptionCode();
@@ -1848,7 +1848,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
 
                 ntStatus = Irp->IoStatus.Status;
             }
-           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           __except( EXCEPTION_EXECUTE_HANDLER)
             {
                 ntStatus = GetExceptionCode();
 
@@ -1946,7 +1946,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                     try_return( ntStatus = STATUS_UNSUCCESSFUL);
                 }
             }
-           __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+           __except( EXCEPTION_EXECUTE_HANDLER)
             {
 
                 ntStatus = GetExceptionCode();
@@ -1998,7 +1998,7 @@ AFSCachedWrite( IN PDEVICE_OBJECT DeviceObject,
                        try_return( ntStatus = iosbFlush.Status);
                    }
                }
-               __except( AFSExceptionFilter( __FUNCTION__, GetExceptionCode(), GetExceptionInformation()))
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
                    ntStatus = GetExceptionCode();