Windows: Protect all Mm and Cc calls with try..except
authorJeffrey Altman <jaltman@your-file-system.com>
Wed, 26 Jun 2013 15:00:00 +0000 (11:00 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Thu, 4 Jul 2013 19:32:59 +0000 (12:32 -0700)
Wrap all Memory Manager and Cache Manager operations in a try..except
block to protect against leaking the SectionObjectResource if an exception
is thrown.  Failure to release the SectionObjectResource will result in
subsequent deadlocks.

Change-Id: I92096c1d4bfd5a23069bcc364b68b07327d662ae
Reviewed-on: http://gerrit.openafs.org/10039
Tested-by: BuildBot <buildbot@rampaginggeek.com>
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/AFSCreate.cpp
src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp
src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp
src/WINNT/afsrdr/kernel/lib/AFSLockControl.cpp
src/WINNT/afsrdr/kernel/lib/AFSRead.cpp
src/WINNT/afsrdr/kernel/lib/AFSWrite.cpp

index f0b26ed..5d61754 100644 (file)
@@ -303,6 +303,20 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                             }
                         }
                     }
+
+                   //
+                   // Uninitialize the cache map. This call is unconditional.
+                   //
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                 AFS_TRACE_LEVEL_VERBOSE,
+                                 "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n",
+                                 pFcb,
+                                 pFileObject));
+
+                   CcUninitializeCacheMap( pFileObject,
+                                           NULL,
+                                           NULL);
                }
                __except( EXCEPTION_EXECUTE_HANDLER)
                {
@@ -321,21 +335,6 @@ AFSCleanup( IN PDEVICE_OBJECT LibDeviceObject,
                    SetFlag( pObjectInfo->Fcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
                 }
 
-                //
-                // Uninitialize the cache map. This call is unconditional.
-                //
-
-                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                              AFS_TRACE_LEVEL_VERBOSE,
-                              "AFSCleanup Tearing down cache map for Fcb %p FileObject %p\n",
-                              pFcb,
-                              pFileObject));
-
-                CcUninitializeCacheMap( pFileObject,
-                                        NULL,
-                                        NULL);
-
-
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
                               "AFSCleanup Releasing Fcb SectionObject lock %p EXCL %08lX\n",
index ea10538..e661ce8 100644 (file)
@@ -3025,8 +3025,28 @@ AFSProcessOpen( IN PIRP Irp,
                 AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                                  MmFlushForWrite);
+               __try
+               {
+
+                   bMmFlushed = MmFlushImageSection( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                     MmFlushForWrite);
+               }
+               __except( EXCEPTION_EXECUTE_HANDLER)
+               {
+
+                   bMmFlushed = FALSE;
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSProcessOpen MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pObjectInfo->FileId.Cell,
+                                 pObjectInfo->FileId.Volume,
+                                 pObjectInfo->FileId.Vnode,
+                                 pObjectInfo->FileId.Unique,
+                                 ntStatus));
+               }
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -3504,13 +3524,33 @@ AFSProcessOverwriteSupersede( IN PDEVICE_OBJECT DeviceObject,
         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                         TRUE);
 
-        //
-        //  Before we actually truncate, check to see if the purge
-        //  is going to fail.
-        //
-
-        bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
-                                             &liZero);
+       __try
+       {
+
+           //
+           //  Before we actually truncate, check to see if the purge
+           //  is going to fail.
+           //
+
+           bUserMapped = !MmCanFileBeTruncated( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers,
+                                                &liZero);
+       }
+       __except( EXCEPTION_EXECUTE_HANDLER)
+       {
+
+           bUserMapped = FALSE;
+
+           ntStatus = GetExceptionCode();
+
+           AFSDbgTrace(( 0,
+                         0,
+                         "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                         pObjectInfo->FileId.Cell,
+                         pObjectInfo->FileId.Volume,
+                         pObjectInfo->FileId.Vnode,
+                         pObjectInfo->FileId.Unique,
+                         ntStatus));
+       }
 
         AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
index d739860..363e818 100644 (file)
@@ -2209,47 +2209,67 @@ AFSSetDispositionInfo( IN PIRP Irp,
                 AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                //
-                // Attempt to flush any outstanding data
-                //
-
-                bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
-                                                  MmFlushForDelete);
-
-                if ( bMmFlushed)
+               __try
                 {
 
                     //
-                    // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
-                    // deadlock with Trend Micro's Enterprise anti-virus product
-                    // which attempts to open the file which is being deleted.
+                   // Attempt to flush any outstanding data
                     //
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_VERBOSE,
-                                  "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
-                                  DirectoryCB,
-                                  &DirectoryCB->NameInformation.FileName));
+                   bMmFlushed = MmFlushImageSection( &pFcb->NPFcb->SectionObjectPointers,
+                                                     MmFlushForDelete);
 
-                    SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
+                   if ( bMmFlushed)
+                   {
 
-                    //
-                    // Purge the cache as well
-                    //
+                       //
+                       // Set PENDING_DELETE before CcPurgeCacheSection to avoid a
+                       // deadlock with Trend Micro's Enterprise anti-virus product
+                       // which attempts to open the file which is being deleted.
+                       //
 
-                    if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
-                    {
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_VERBOSE,
+                                     "AFSSetDispositionInfo Setting PENDING_DELETE on DirEntry %p Name %wZ\n",
+                                     DirectoryCB,
+                                     &DirectoryCB->NameInformation.FileName));
+
+                       SetFlag( pCcb->DirectoryCB->Flags, AFS_DIR_ENTRY_PENDING_DELETE);
 
-                        if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
-                                                   NULL,
-                                                   0,
-                                                   TRUE))
+                       //
+                       // Purge the cache as well
+                       //
+
+                       if( pFcb->NPFcb->SectionObjectPointers.DataSectionObject != NULL)
                         {
 
-                            SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                           if ( !CcPurgeCacheSection( &pFcb->NPFcb->SectionObjectPointers,
+                                                      NULL,
+                                                      0,
+                                                      TRUE))
+                           {
+
+                               SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+                           }
                         }
                     }
                 }
+               __except( EXCEPTION_EXECUTE_HANDLER)
+               {
+
+                   bMmFlushed = FALSE;
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSSetDispositionInfo MmFlushImageSection failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
+               }
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
@@ -3450,18 +3470,36 @@ AFSSetRenameInfo( IN PIRP Irp)
                 AFSAcquireExcl( &pTargetFcb->NPFcb->SectionObjectResource,
                                 TRUE);
 
-                //
-                // Close the section in the event it was mapped
-                //
+               __try
+               {
+
+                   //
+                   // Close the section in the event it was mapped
+                   //
+
+                   if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
+                                              TRUE))
+                   {
 
-                if( !MmForceSectionClosed( &pTargetFcb->NPFcb->SectionObjectPointers,
-                                           TRUE))
+                       AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
+                                     AFS_TRACE_LEVEL_ERROR,
+                                     "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
+                                     &uniTargetName));
+                   }
+               }
+               __except( EXCEPTION_EXECUTE_HANDLER)
                 {
 
-                    AFSDbgTrace(( AFS_SUBSYSTEM_FILE_PROCESSING,
-                                  AFS_TRACE_LEVEL_ERROR,
-                                  "AFSSetRenameInfo Failed to delete section for target file %wZ\n",
-                                  &uniTargetName));
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSSetRenameInfo MmForceSectionClosed failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pTargetFcb->ObjectInformation->FileId.Cell,
+                                 pTargetFcb->ObjectInformation->FileId.Volume,
+                                 pTargetFcb->ObjectInformation->FileId.Vnode,
+                                 pTargetFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
                 }
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
@@ -3615,8 +3653,28 @@ AFSSetAllocationInfo( IN PIRP Irp,
         AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                         TRUE);
 
-        bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
-                                             &pBuffer->AllocationSize);
+       __try
+       {
+
+           bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+                                                &pBuffer->AllocationSize);
+       }
+       __except( EXCEPTION_EXECUTE_HANDLER)
+       {
+
+           bUserMapped = FALSE;
+
+           ntStatus = GetExceptionCode();
+
+           AFSDbgTrace(( 0,
+                         0,
+                         "EXCEPTION - AFSSetAllocationInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                         pFcb->ObjectInformation->FileId.Cell,
+                         pFcb->ObjectInformation->FileId.Volume,
+                         pFcb->ObjectInformation->FileId.Vnode,
+                         pFcb->ObjectInformation->FileId.Unique,
+                         ntStatus));
+       }
 
         AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                       AFS_TRACE_LEVEL_VERBOSE,
@@ -3821,8 +3879,28 @@ AFSSetEndOfFileInfo( IN PIRP Irp,
             AFSAcquireExcl( &pFcb->NPFcb->SectionObjectResource,
                             TRUE);
 
-            bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
-                                                 &pBuffer->EndOfFile);
+           __try
+           {
+
+               bUserMapped = !MmCanFileBeTruncated( pFileObject->SectionObjectPointer,
+                                                    &pBuffer->EndOfFile);
+           }
+           __except( EXCEPTION_EXECUTE_HANDLER)
+           {
+
+               bUserMapped = FALSE;
+
+               ntStatus = GetExceptionCode();
+
+               AFSDbgTrace(( 0,
+                             0,
+                             "EXCEPTION - AFSSetEndOfFileInfo MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                             pFcb->ObjectInformation->FileId.Cell,
+                             pFcb->ObjectInformation->FileId.Volume,
+                             pFcb->ObjectInformation->FileId.Vnode,
+                             pFcb->ObjectInformation->FileId.Unique,
+                             ntStatus));
+           }
 
             AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                           AFS_TRACE_LEVEL_VERBOSE,
index c3e5cc7..85e7625 100644 (file)
@@ -3188,12 +3188,30 @@ AFSVerifyEntry( IN GUID *AuthGroup,
                     AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                     TRUE);
 
-                    pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
-
-                    if ( pCCFileObject != NULL)
+                   __try
+                   {
+
+                       pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+
+                       if ( pCCFileObject != NULL)
+                       {
+                           CcSetFileSizes( pCCFileObject,
+                                           (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+                       }
+                   }
+                   __except( EXCEPTION_EXECUTE_HANDLER)
                     {
-                        CcSetFileSizes( pCCFileObject,
-                                        (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
+                       ntStatus = GetExceptionCode();
+
+                       AFSDbgTrace(( 0,
+                                     0,
+                                     "EXCEPTION - AFSVerifyEntry CcSetFileSized failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                     pObjectInfo->FileId.Cell,
+                                     pObjectInfo->FileId.Volume,
+                                     pObjectInfo->FileId.Vnode,
+                                     pObjectInfo->FileId.Unique,
+                                     ntStatus));
                     }
 
                     AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
@@ -4347,16 +4365,34 @@ AFSValidateEntry( IN AFSDirectoryCB *DirEntry,
                         AFSAcquireExcl( &pObjectInfo->Fcb->NPFcb->SectionObjectResource,
                                         TRUE);
 
-                        pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
+                       __try
+                       {
 
-                        pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
-                        pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
-                        pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+                           pCCFileObject = CcGetFileObjectFromSectionPtrs( &pObjectInfo->Fcb->NPFcb->SectionObjectPointers);
 
-                        if ( pCCFileObject != NULL)
+                           pObjectInfo->Fcb->Header.AllocationSize.QuadPart  = pObjectInfo->AllocationSize.QuadPart;
+                           pObjectInfo->Fcb->Header.FileSize.QuadPart        = pObjectInfo->EndOfFile.QuadPart;
+                           pObjectInfo->Fcb->Header.ValidDataLength.QuadPart = pObjectInfo->EndOfFile.QuadPart;
+
+                           if ( pCCFileObject != NULL)
+                           {
+                               CcSetFileSizes( pCCFileObject,
+                                               (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+                           }
+                       }
+                       __except( EXCEPTION_EXECUTE_HANDLER)
                         {
-                            CcSetFileSizes( pCCFileObject,
-                                            (PCC_FILE_SIZES)&pObjectInfo->Fcb->Header.AllocationSize);
+
+                           ntStatus = GetExceptionCode();
+
+                           AFSDbgTrace(( 0,
+                                         0,
+                                         "EXCEPTION - AFSValidateEntry CcSetFileSizes failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                         pObjectInfo->FileId.Cell,
+                                         pObjectInfo->FileId.Volume,
+                                         pObjectInfo->FileId.Vnode,
+                                         pObjectInfo->FileId.Unique,
+                                         ntStatus));
                         }
 
                         AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
index b2298cf..3354bdc 100644 (file)
@@ -177,10 +177,28 @@ AFSLockControl( IN PDEVICE_OBJECT LibDeviceObject,
                 AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
                                   TRUE);
 
-                CcFlushCache( &pFcb->NPFcb->SectionObjectPointers,
-                              NULL,
-                              0,
-                              &stIoStatus);
+               __try
+               {
+
+                   CcFlushCache( &pFcb->NPFcb->SectionObjectPointers,
+                                 NULL,
+                                 0,
+                                 &stIoStatus);
+               }
+               __except( EXCEPTION_EXECUTE_HANDLER)
+               {
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSLockControl CcFlushCache failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
+               }
 
                 if( !NT_SUCCESS( stIoStatus.Status))
                 {
@@ -244,10 +262,29 @@ AFSLockControl( IN PDEVICE_OBJECT LibDeviceObject,
 
                 AFSAcquireShared( &pFcb->NPFcb->SectionObjectResource,
                                   TRUE);
-                CcFlushCache( &pFcb->NPFcb->SectionObjectPointers,
-                              &pIrpSp->Parameters.LockControl.ByteOffset,
-                              pIrpSp->Parameters.LockControl.Length->LowPart,
-                              &stIoStatus);
+
+               __try
+               {
+
+                   CcFlushCache( &pFcb->NPFcb->SectionObjectPointers,
+                                 &pIrpSp->Parameters.LockControl.ByteOffset,
+                                 pIrpSp->Parameters.LockControl.Length->LowPart,
+                                 &stIoStatus);
+               }
+               __except( EXCEPTION_EXECUTE_HANDLER)
+               {
+
+                   ntStatus = GetExceptionCode();
+
+                   AFSDbgTrace(( 0,
+                                 0,
+                                 "EXCEPTION - AFSLockControl CcFlushCache failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique,
+                                 ntStatus));
+               }
 
                 AFSDbgTrace(( AFS_SUBSYSTEM_LOCK_PROCESSING,
                               AFS_TRACE_LEVEL_VERBOSE,
index 317406b..6c5eea8 100644 (file)
@@ -1137,20 +1137,40 @@ AFSCommonRead( IN PDEVICE_OBJECT DeviceObject,
 
             bReleaseSectionObject = TRUE;
 
-            AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                          AFS_TRACE_LEVEL_VERBOSE,
-                          "AFSCommonRead (%p) IRP_MN_COMPLETE being processed\n",
-                          Irp));
+           __try
+           {
 
-            CcMdlReadComplete(pIrpSp->FileObject, Irp->MdlAddress);
+               AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                             AFS_TRACE_LEVEL_VERBOSE,
+                             "AFSCommonRead (%p) IRP_MN_COMPLETE being processed\n",
+                             Irp));
 
-            //
-            // Mdl is now Deallocated
-            //
+               CcMdlReadComplete(pIrpSp->FileObject, Irp->MdlAddress);
+
+               //
+               // Mdl is now Deallocated
+               //
+
+               Irp->MdlAddress = NULL;
+
+               try_return( ntStatus = STATUS_SUCCESS );
+           }
+           __except( EXCEPTION_EXECUTE_HANDLER)
+           {
+
+               ntStatus = GetExceptionCode();
 
-            Irp->MdlAddress = NULL;
+               AFSDbgTrace(( 0,
+                             0,
+                             "EXCEPTION - AFSCommonRead CcMdlReadComplete failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
+                             pFcb->ObjectInformation->FileId.Cell,
+                             pFcb->ObjectInformation->FileId.Volume,
+                             pFcb->ObjectInformation->FileId.Vnode,
+                             pFcb->ObjectInformation->FileId.Unique,
+                             ntStatus));
 
-            try_return( ntStatus = STATUS_SUCCESS );
+               try_return( ntStatus);
+           }
         }
 
         //
index 2853421..f6148b9 100644 (file)
@@ -759,19 +759,39 @@ try_exit:
                 bReleaseMain = FALSE;
             }
 
-            if ( !CcPurgeCacheSection( &pNPFcb->SectionObjectPointers,
-                                       &liStartingByte,
-                                       ulByteCount,
-                                       FALSE))
+           __try
             {
 
-                AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
-                              AFS_TRACE_LEVEL_WARNING,
-                              "AFSCommonWrite CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+               if ( !CcPurgeCacheSection( &pNPFcb->SectionObjectPointers,
+                                          &liStartingByte,
+                                          ulByteCount,
+                                          FALSE))
+               {
+
+                   AFSDbgTrace(( AFS_SUBSYSTEM_IO_PROCESSING,
+                                 AFS_TRACE_LEVEL_WARNING,
+                                 "AFSCommonWrite CcPurgeCacheSection failure FID %08lX-%08lX-%08lX-%08lX\n",
+                                 pFcb->ObjectInformation->FileId.Cell,
+                                 pFcb->ObjectInformation->FileId.Volume,
+                                 pFcb->ObjectInformation->FileId.Vnode,
+                                 pFcb->ObjectInformation->FileId.Unique));
+
+                   SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
+               }
+           }
+           __except( EXCEPTION_EXECUTE_HANDLER)
+           {
+
+               DWORD ntStatus2 = GetExceptionCode();
+
+               AFSDbgTrace(( 0,
+                             0,
+                             "EXCEPTION - AFSProcessOverwriteSupercede MmCanFileBeTruncated failed FID %08lX-%08lX-%08lX-%08lX Status 0x%08lX\n",
                               pFcb->ObjectInformation->FileId.Cell,
                               pFcb->ObjectInformation->FileId.Volume,
                               pFcb->ObjectInformation->FileId.Vnode,
-                              pFcb->ObjectInformation->FileId.Unique));
+                             pFcb->ObjectInformation->FileId.Unique,
+                             ntStatus2));
 
                 SetFlag( pFcb->Flags, AFS_FCB_FLAG_PURGE_ON_CLOSE);
             }