From 1b9c730b9961685f6c52d2b35390da4a9e5385e0 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Wed, 28 Aug 2002 07:13:04 +0000 Subject: [PATCH] Moved IoPageRead from io.h to iofuncs.h. Changed parameters for IoPageRead/IoPageWrite/IoSynchronousPageWrite. Fixed the length calculation in CcZeroData. svn path=/trunk/; revision=3421 --- reactos/include/ddk/iofuncs.h | 26 ++++++----- reactos/ntoskrnl/cc/copy.c | 60 +++++++++++++++++++------- reactos/ntoskrnl/include/internal/io.h | 18 +++----- reactos/ntoskrnl/mm/pagefile.c | 26 ++++++++--- reactos/ntoskrnl/mm/section.c | 14 ++++-- 5 files changed, 97 insertions(+), 47 deletions(-) diff --git a/reactos/include/ddk/iofuncs.h b/reactos/include/ddk/iofuncs.h index 97826383418..0426f4f40d5 100644 --- a/reactos/include/ddk/iofuncs.h +++ b/reactos/include/ddk/iofuncs.h @@ -1,6 +1,6 @@ #ifndef _INCLUDE_DDK_IOFUNCS_H #define _INCLUDE_DDK_IOFUNCS_H -/* $Id: iofuncs.h,v 1.30 2002/04/10 09:55:10 ekohl Exp $ */ +/* $Id: iofuncs.h,v 1.31 2002/08/28 07:13:04 hbirr Exp $ */ /* --- EXPORTED BY NTOSKRNL --- */ @@ -1031,15 +1031,21 @@ STDCALL IoStopTimer ( PDEVICE_OBJECT DeviceObject ); -NTSTATUS -STDCALL -IoSynchronousPageWrite ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4 - ); + +NTSTATUS STDCALL +IoPageRead(PFILE_OBJECT FileObject, + PMDL Mdl, + PLARGE_INTEGER Offset, + PKEVENT Event, + PIO_STATUS_BLOCK StatusBlock); + +NTSTATUS STDCALL +IoSynchronousPageWrite (PFILE_OBJECT FileObject, + PMDL Mdl, + PLARGE_INTEGER Offset, + PKEVENT Event, + PIO_STATUS_BLOCK StatusBlock); + struct _EPROCESS* STDCALL IoThreadToProcess (struct _ETHREAD* Thread); VOID STDCALL diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index ba70e46330d..116b4bc0df6 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -1,4 +1,4 @@ -/* $Id: copy.c,v 1.9 2002/08/17 15:14:26 hbirr Exp $ +/* $Id: copy.c,v 1.10 2002/08/28 07:13:04 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -60,6 +60,7 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, LARGE_INTEGER SegOffset; NTSTATUS Status; ULONG TempLength; + KEVENT Event; Status = CcRosGetCacheSegmentChain(Bcb, ReadOffset, Length, &head); if (!NT_SUCCESS(Status)) @@ -131,11 +132,17 @@ ReadCacheSegmentChain(PBCB Bcb, ULONG ReadOffset, ULONG Length, * Read in the information. */ SegOffset.QuadPart = current->FileOffset; + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageRead(Bcb->FileObject, Mdl, &SegOffset, - &Iosb, - TRUE); + &Event, + &Iosb); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = Iosb.Status; + } if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE) { while (current != NULL) @@ -169,6 +176,7 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg) NTSTATUS Status; LARGE_INTEGER SegOffset; IO_STATUS_BLOCK IoStatus; + KEVENT Event; SegOffset.QuadPart = CacheSeg->FileOffset; Size = CacheSeg->Bcb->AllocationSize.QuadPart - CacheSeg->FileOffset; @@ -178,8 +186,14 @@ ReadCacheSegment(PCACHE_SEGMENT CacheSeg) } Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); - Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &IoStatus, - TRUE); + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoPageRead(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, & Event, &IoStatus); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE) { CcRosReleaseCacheSegment(CacheSeg->Bcb, CacheSeg, FALSE, FALSE, FALSE); @@ -202,6 +216,7 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) NTSTATUS Status; IO_STATUS_BLOCK IoStatus; LARGE_INTEGER SegOffset; + KEVENT Event; CacheSeg->Dirty = FALSE; SegOffset.QuadPart = CacheSeg->FileOffset; @@ -212,8 +227,13 @@ WriteCacheSegment(PCACHE_SEGMENT CacheSeg) } Mdl = MmCreateMdl(NULL, CacheSeg->BaseAddress, Size); MmBuildMdlForNonPagedPool(Mdl); - Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &IoStatus, - TRUE); + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoPageWrite(CacheSeg->Bcb->FileObject, Mdl, &SegOffset, &Event, &IoStatus); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } if (!NT_SUCCESS(Status)) { DPRINT1("IoPageWrite failed, Status %x\n", Status); @@ -444,6 +464,7 @@ CcZeroData (IN PFILE_OBJECT FileObject, PMDL Mdl; ULONG i; IO_STATUS_BLOCK Iosb; + KEVENT Event; DPRINT("CcZeroData(FileObject %x, StartOffset %I64x, EndOffset %I64x, " "Wait %d\n", FileObject, StartOffset->QuadPart, EndOffset->QuadPart, @@ -487,7 +508,13 @@ CcZeroData (IN PFILE_OBJECT FileObject, { ((PULONG)(Mdl + 1))[i] = CcZeroPage.u.LowPart; } - Status = IoPageWrite(FileObject, Mdl, StartOffset, &Iosb, TRUE); + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoPageWrite(FileObject, Mdl, StartOffset, &Event, &Iosb); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = Iosb.Status; + } if (!NT_SUCCESS(Status)) { return(FALSE); @@ -558,16 +585,13 @@ CcZeroData (IN PFILE_OBJECT FileObject, else { ULONG RLength; - Mdl = MmCreateMdl(NULL, (PVOID)RStart, - ROUND_UP(Start % Bcb->CacheSegmentSize + - Length, Bcb->CacheSegmentSize)); + RLength = Start % Bcb->CacheSegmentSize + Length; + RLength = ROUND_UP(RLength, Bcb->CacheSegmentSize); + Mdl = MmCreateMdl(NULL, (PVOID)RStart, RLength); if (Mdl == NULL) { return(FALSE); } - RLength = ROUND_UP(RStart + Length, Bcb->CacheSegmentSize); - RLength = min(RLength, Bcb->AllocationSize.u.LowPart); - RLength -= RStart; Status = CcRosGetCacheSegmentChain (Bcb, RStart, RLength, &CacheSeg); if (!NT_SUCCESS(Status)) @@ -622,7 +646,13 @@ CcZeroData (IN PFILE_OBJECT FileObject, } /* Write the Segment */ - Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Iosb, TRUE); + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoPageWrite(FileObject, Mdl, &WriteOffset, &Event, &Iosb); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = Iosb.Status; + } if (!NT_SUCCESS(Status)) { DPRINT1("IoPageWrite failed, status %x\n", Status); diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 6ab2ca787e1..68390b8af5f 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: io.h,v 1.22 2002/06/12 23:28:38 ekohl Exp $ +/* $Id: io.h,v 1.23 2002/08/28 07:13:04 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -302,17 +302,11 @@ VOID IoShutdownRegisteredDevices(VOID); VOID IoShutdownRegisteredFileSystems(VOID); NTSTATUS STDCALL -IoPageRead(PFILE_OBJECT FileObject, - PMDL Mdl, - PLARGE_INTEGER Offset, - PIO_STATUS_BLOCK StatusBlock, - BOOLEAN PagingIo); -NTSTATUS STDCALL -IoPageWrite(PFILE_OBJECT FileObject, - PMDL Mdl, - PLARGE_INTEGER Offset, - PIO_STATUS_BLOCK StatusBlock, - BOOLEAN PagingIo); +IoPageWrite(PFILE_OBJECT FileObject, + PMDL Mdl, + PLARGE_INTEGER Offset, + PKEVENT Event, + PIO_STATUS_BLOCK StatusBlock); NTSTATUS IoCreateArcNames(VOID); diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index dfcba690991..d99a9efad36 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: pagefile.c,v 1.23 2002/08/17 01:42:02 dwelch Exp $ +/* $Id: pagefile.c,v 1.24 2002/08/28 07:13:04 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/pagefile.c @@ -125,6 +125,7 @@ NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) LARGE_INTEGER file_offset; IO_STATUS_BLOCK Iosb; NTSTATUS Status; + KEVENT Event; if (SwapEntry == 0) { @@ -148,12 +149,17 @@ NTSTATUS MmWriteToSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) } file_offset.QuadPart = offset * 4096; - + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageWrite(PagingFileList[i]->FileObject, Mdl, &file_offset, - &Iosb, - TRUE); + &Event, + &Iosb); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + return(Iosb.Status); + } return(Status); } @@ -163,6 +169,7 @@ NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) LARGE_INTEGER file_offset; IO_STATUS_BLOCK Iosb; NTSTATUS Status; + KEVENT Event; if (SwapEntry == 0) { @@ -186,12 +193,17 @@ NTSTATUS MmReadFromSwapPage(SWAPENTRY SwapEntry, PMDL Mdl) } file_offset.QuadPart = offset * 4096; - + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageRead(PagingFileList[i]->FileObject, Mdl, &file_offset, - &Iosb, - TRUE); + &Event, + &Iosb); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + return(Iosb.Status); + } return(Status); } diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 9acf7754f54..f1e3effbf78 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: section.c,v 1.93 2002/08/27 06:40:32 hbirr Exp $ +/* $Id: section.c,v 1.94 2002/08/28 07:13:04 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/section.c @@ -323,6 +323,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, PMDL Mdl; NTSTATUS Status; PREACTOS_COMMON_FCB_HEADER Fcb; + KEVENT Event; FileObject = MemoryArea->Data.SectionData.Section->FileObject; Fcb = (PREACTOS_COMMON_FCB_HEADER)FileObject->FsContext; @@ -399,11 +400,18 @@ MiReadPage(PMEMORY_AREA MemoryArea, /* * Call the FSD to read the page */ + + KeInitializeEvent(&Event, NotificationEvent, FALSE); Status = IoPageRead(FileObject, Mdl, Offset, - &IoStatus, - TRUE); + &Event, + &IoStatus); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + return(IoStatus.Status); + } return(Status); } }