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
This commit is contained in:
Hartmut Birr 2002-08-28 07:13:04 +00:00
parent fdd13c6ff5
commit 1b9c730b99
5 changed files with 97 additions and 47 deletions

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
}
}