From 3f112398465fd8827c6289a46e95c4de3bf8a217 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Sun, 16 Aug 2009 01:20:50 +0000 Subject: [PATCH] Synchronize with paging I/O. svn path=/trunk/; revision=42724 --- reactos/drivers/filesystems/ext2/src/close.c | 81 +++++++++++++++++--- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/reactos/drivers/filesystems/ext2/src/close.c b/reactos/drivers/filesystems/ext2/src/close.c index 9ef83b4fca8..1674bf0e533 100644 --- a/reactos/drivers/filesystems/ext2/src/close.c +++ b/reactos/drivers/filesystems/ext2/src/close.c @@ -115,6 +115,7 @@ BOOLEAN FirstAttempt ) PtrExt2VCB PtrVCB = NULL; PtrExt2NTRequiredFCB PtrReqdFCB = NULL; PERESOURCE PtrResourceAcquired = NULL; + PERESOURCE PtrPagingIoResourceAcquired = NULL; BOOLEAN CompleteIrp = TRUE; BOOLEAN PostRequest = FALSE; @@ -180,10 +181,11 @@ BOOLEAN FirstAttempt ) { DebugTrace(DEBUG_TRACE_FILE_OBJ, "###### File Pointer 0x%LX [Close]", PtrFileObject); } + i = 1; while( !AcquiredVCB ) { - DebugTraceState( "VCB AC:0x%LX SW:0x%LX EX:0x%LX [Close]", PtrVCB->VCBResource.ActiveCount, PtrVCB->VCBResource.NumberOfExclusiveWaiters, PtrVCB->VCBResource.NumberOfSharedWaiters ); + DebugTraceState( "VCB AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrVCB->VCBResource.ActiveCount, PtrVCB->VCBResource.NumberOfExclusiveWaiters, PtrVCB->VCBResource.NumberOfSharedWaiters ); if(! ExAcquireResourceExclusiveLite( &(PtrVCB->VCBResource), FALSE ) ) { DebugTrace(DEBUG_TRACE_MISC, "*** VCB Acquisition FAILED [Close]", 0); @@ -231,13 +233,14 @@ BOOLEAN FirstAttempt ) { DebugTrace(DEBUG_TRACE_FILE_OBJ, "###### File Pointer 0x%LX [Close]", PtrFileObject); } + + PtrReqdFCB = &PtrFCB->NTRequiredFCB; + i = 1; while( !PtrResourceAcquired ) { - PtrReqdFCB = &(PtrFCB->NTRequiredFCB); - - DebugTraceState( "FCBMain AC:0x%LX SW:0x%LX EX:0x%LX [Close]", PtrReqdFCB->MainResource.ActiveCount, PtrReqdFCB->MainResource.NumberOfExclusiveWaiters, PtrReqdFCB->MainResource.NumberOfSharedWaiters ); - if(! ExAcquireResourceExclusiveLite( &(PtrFCB->NTRequiredFCB.MainResource ), FALSE ) ) + DebugTraceState( "FCBMain AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrReqdFCB->MainResource.ActiveCount, PtrReqdFCB->MainResource.NumberOfExclusiveWaiters, PtrReqdFCB->MainResource.NumberOfSharedWaiters ); + if(! ExAcquireResourceExclusiveLite( &(PtrReqdFCB->MainResource), FALSE ) ) { DebugTrace(DEBUG_TRACE_MISC, "*** FCB Acquisition FAILED [Close]", 0); if( BlockForResource && i != 1000 ) @@ -261,7 +264,40 @@ BOOLEAN FirstAttempt ) else { DebugTrace(DEBUG_TRACE_MISC, "*** FCB acquired [Close]", 0); - PtrResourceAcquired = & ( PtrFCB->NTRequiredFCB.MainResource ); + PtrResourceAcquired = & ( PtrReqdFCB->MainResource ); + } + i *= 10; + } + + i = 1; + while( !PtrPagingIoResourceAcquired ) + { + DebugTraceState( "FCBPaging AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrReqdFCB->PagingIoResource.ActiveCount, PtrReqdFCB->PagingIoResource.NumberOfExclusiveWaiters, PtrReqdFCB->PagingIoResource.NumberOfSharedWaiters ); + if(! ExAcquireResourceExclusiveLite( &(PtrReqdFCB->PagingIoResource), FALSE ) ) + { + DebugTrace(DEBUG_TRACE_MISC, "*** FCB Acquisition FAILED [Close]", 0); + if( BlockForResource && i != 1000 ) + { + LARGE_INTEGER Delay; + + // KeSetPriorityThread( PsGetCurrentThread(), LOW_REALTIME_PRIORITY ); + + Delay.QuadPart = -500 * i; + KeDelayExecutionThread( KernelMode, FALSE, &Delay ); + DebugTrace(DEBUG_TRACE_MISC, "*** Retrying... after 50 * %ld ms [Close]", i); + } + else + { + if( i == 1000 ) + DebugTrace(DEBUG_TRACE_MISC, "*** Reposting... [Close]", 0 ); + PostRequest = TRUE; + try_return( RC = STATUS_PENDING ); + } + } + else + { + DebugTrace(DEBUG_TRACE_MISC, "*** FCB acquired [Close]", 0); + PtrPagingIoResourceAcquired = & ( PtrReqdFCB->PagingIoResource ); } i *= 10; } @@ -372,11 +408,22 @@ BOOLEAN FirstAttempt ) DebugTrace(DEBUG_TRACE_MISC, "^^^^^Deleting FCB [Close]", 0); RemoveEntryList( &PtrFCB->NextFCB ); + if ( PtrPagingIoResourceAcquired ) + { + Ext2ReleaseResource(PtrPagingIoResourceAcquired); + DebugTraceState( "Resource AC:0x%LX EX:0x%LX SW:0x%LX [Close]", + PtrPagingIoResourceAcquired->ActiveCount, + PtrPagingIoResourceAcquired->NumberOfExclusiveWaiters, + PtrPagingIoResourceAcquired->NumberOfSharedWaiters ); + + PtrPagingIoResourceAcquired = NULL; + } + if ( PtrResourceAcquired ) { Ext2ReleaseResource(PtrResourceAcquired); DebugTrace(DEBUG_TRACE_MISC, "*** FCB Released [Close]", 0); - DebugTraceState( "Resource AC:0x%LX SW:0x%LX EX:0x%LX [Close]", + DebugTraceState( "Resource AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrResourceAcquired->ActiveCount, PtrResourceAcquired->NumberOfExclusiveWaiters, PtrResourceAcquired->NumberOfSharedWaiters ); @@ -385,8 +432,9 @@ BOOLEAN FirstAttempt ) { DebugTrace(DEBUG_TRACE_FILE_OBJ, "###### File Pointer 0x%LX [Close]", PtrFileObject); } - PtrResourceAcquired = FALSE; + PtrResourceAcquired = NULL; } + Ext2ReleaseFCB( PtrFCB ); } @@ -407,11 +455,22 @@ BOOLEAN FirstAttempt ) } finally { + if ( PtrPagingIoResourceAcquired ) + { + Ext2ReleaseResource(PtrPagingIoResourceAcquired); + DebugTraceState( "Resource AC:0x%LX EX:0x%LX SW:0x%LX [Close]", + PtrPagingIoResourceAcquired->ActiveCount, + PtrPagingIoResourceAcquired->NumberOfExclusiveWaiters, + PtrPagingIoResourceAcquired->NumberOfSharedWaiters ); + + PtrPagingIoResourceAcquired = NULL; + } + if ( PtrResourceAcquired ) { Ext2ReleaseResource(PtrResourceAcquired); DebugTrace(DEBUG_TRACE_MISC, "*** FCB Released [Close]", 0); - DebugTraceState( "Resource AC:0x%LX SW:0x%LX EX:0x%LX [Close]", + DebugTraceState( "Resource AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrResourceAcquired->ActiveCount, PtrResourceAcquired->NumberOfExclusiveWaiters, PtrResourceAcquired->NumberOfSharedWaiters ); @@ -420,14 +479,14 @@ BOOLEAN FirstAttempt ) { DebugTrace(DEBUG_TRACE_FILE_OBJ, "###### File Pointer 0x%LX [Close]", PtrFileObject); } - PtrResourceAcquired = FALSE; + PtrResourceAcquired = NULL; } if (AcquiredVCB) { ASSERT(PtrVCB); Ext2ReleaseResource(&(PtrVCB->VCBResource)); - DebugTraceState( "VCB AC:0x%LX SW:0x%LX EX:0x%LX [Close]", PtrVCB->VCBResource.ActiveCount, PtrVCB->VCBResource.NumberOfExclusiveWaiters, PtrVCB->VCBResource.NumberOfSharedWaiters ); + DebugTraceState( "VCB AC:0x%LX EX:0x%LX SW:0x%LX [Close]", PtrVCB->VCBResource.ActiveCount, PtrVCB->VCBResource.NumberOfExclusiveWaiters, PtrVCB->VCBResource.NumberOfSharedWaiters ); DebugTrace(DEBUG_TRACE_MISC, "*** VCB Released [Close]", 0); AcquiredVCB = FALSE;