===================================================================

cctypes.h
ntoskrnl/cc/copy.c
===================================================================
Added CcFastMdlReadNotPossible
 
 
===================================================================
fastio.c
===================================================================
Added #ifdef to allow the file to compile "as is" in my windows 
framework. This doesnt affect RosBE

Brought back Alex's code for 

 FsRtlMdlReadCompleteDev
 FsRtlMdlReadDev
 FsRtlMdlReadComplete 

after having code reviewed it.

===================================================================
ntoskrnl/include/internal/cc.h
ntoskrnl/cc/mdl.c
===================================================================
Change the name of CcMdlReadCompleteDev to CcMdlReadComplete2


svn path=/trunk/; revision=25550
This commit is contained in:
Dominique Cote 2007-01-21 04:46:38 +00:00
parent 9b89b48609
commit 3658aa350d
5 changed files with 159 additions and 19 deletions

View file

@ -33,6 +33,7 @@ extern ULONG NTSYSAPI CcFastReadNotPossible;
extern ULONG NTSYSAPI CcFastReadWait; extern ULONG NTSYSAPI CcFastReadWait;
extern ULONG NTSYSAPI CcFastReadResourceMiss; extern ULONG NTSYSAPI CcFastReadResourceMiss;
extern ULONG NTSYSAPI CcFastReadNoWait; extern ULONG NTSYSAPI CcFastReadNoWait;
extern ULONG NTSYSAPI CcFastMdlReadNotPossible;
#ifdef _NTIFS_INCLUDED_ #ifdef _NTIFS_INCLUDED_

View file

@ -30,12 +30,12 @@ void* _alloca(size_t size);
#endif #endif
ULONG CcFastMdlReadWait; ULONG CcFastMdlReadWait;
ULONG CcFastMdlReadNotPossible;
ULONG CcFastReadNotPossible; ULONG CcFastReadNotPossible;
ULONG CcFastReadWait; ULONG CcFastReadWait;
ULONG CcFastReadNoWait; ULONG CcFastReadNoWait;
ULONG CcFastReadResourceMiss; ULONG CcFastReadResourceMiss;
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
VOID VOID

View file

@ -51,15 +51,15 @@ CcMdlRead(
*/ */
VOID VOID
STDCALL STDCALL
CcMdlReadCompleteDev(IN PMDL MdlChain, CcMdlReadComplete2(IN PMDL MemoryDescriptorList,
IN PFILE_OBJECT FileObject) IN PFILE_OBJECT FileObject)
{ {
PMDL Mdl; PMDL Mdl;
/* Free MDLs */ /* Free MDLs */
while ((Mdl = MdlChain)) while ((Mdl = MemoryDescriptorList))
{ {
MdlChain = Mdl->Next; MemoryDescriptorList = Mdl->Next;
MmUnlockPages(Mdl); MmUnlockPages(Mdl);
IoFreeMdl(Mdl); IoFreeMdl(Mdl);
} }
@ -103,7 +103,7 @@ CcMdlReadComplete(IN PFILE_OBJECT FileObject,
} }
/* Use slow path */ /* Use slow path */
CcMdlReadCompleteDev(MdlChain, FileObject); CcMdlReadComplete2(MdlChain, FileObject);
} }
/* /*

View file

@ -8,11 +8,18 @@
/* INCLUDES ******************************************************************/ /* INCLUDES ******************************************************************/
#ifdef _WINDOWS_TESTING
#include <ntifs.h>
#include "ntndk.h"
#include "fsrtl_glue.h"
#else
#include <ntoskrnl.h> #include <ntoskrnl.h>
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
#include <ntifs.h> #include <ntifs.h>
#include <cctypes.h> #include <cctypes.h>
#endif /* _WINDOWS_TESTING */
/* PUBLIC FUNCTIONS **********************************************************/ /* PUBLIC FUNCTIONS **********************************************************/
@ -708,31 +715,57 @@ FsRtlMdlRead(IN PFILE_OBJECT FileObject,
return FALSE; return FALSE;
} }
/*
* @implemented
*/
BOOLEAN BOOLEAN
NTAPI NTAPI
FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject, FsRtlMdlReadComplete(IN PFILE_OBJECT FileObject,
IN OUT PMDL MdlChain) IN OUT PMDL MdlChain)
{ {
KEBUGCHECK(0); PDEVICE_OBJECT DeviceObject, BaseDeviceObject;
PFAST_IO_DISPATCH FastDispatch;
/* Get Device Object and Fast Calls */
DeviceObject = IoGetRelatedDeviceObject(FileObject);
FastDispatch = DeviceObject->DriverObject->FastIoDispatch;
/* Check if we support Fast Calls, and check this one */
if (FastDispatch && FastDispatch->MdlReadComplete)
{
/* Use the fast path */
return FastDispatch->MdlReadComplete(FileObject,
MdlChain,
DeviceObject);
}
/* Get the Base File System (Volume) and Fast Calls */
BaseDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
FastDispatch = BaseDeviceObject->DriverObject->FastIoDispatch;
/* If the Base Device Object has its own FastDispatch Routine, fail */
if ((BaseDeviceObject != DeviceObject) && FastDispatch
&& FastDispatch->MdlReadComplete)
{
return FALSE; return FALSE;
} }
/* No fast path, use slow path */
return FsRtlMdlReadCompleteDev(FileObject, MdlChain, DeviceObject);
}
/* /*
* @implemented * @implemented
*/ */
BOOLEAN BOOLEAN
NTAPI NTAPI
FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject, FsRtlMdlReadCompleteDev(IN PFILE_OBJECT FileObject,
IN PMDL MdlChain, IN PMDL MemoryDescriptorList,
IN PDEVICE_OBJECT DeviceObject) IN PDEVICE_OBJECT DeviceObject)
{ {
KEBUGCHECK(0); /* Call the Cache Manager */
return FALSE; CcMdlReadComplete2(MemoryDescriptorList, FileObject);
return TRUE;
} }
/* /*
* @implemented * @implemented
*/ */
@ -746,8 +779,114 @@ FsRtlMdlReadDev(IN PFILE_OBJECT FileObject,
OUT PIO_STATUS_BLOCK IoStatus, OUT PIO_STATUS_BLOCK IoStatus,
IN PDEVICE_OBJECT DeviceObject) IN PDEVICE_OBJECT DeviceObject)
{ {
KEBUGCHECK(0); PFSRTL_COMMON_FCB_HEADER FcbHeader;
return FALSE; BOOLEAN Result = TRUE;
LARGE_INTEGER Offset;
PFAST_IO_DISPATCH FastIoDispatch;
PDEVICE_OBJECT Device;
PAGED_CODE();
/* No actual read */
if (!Length)
{
/* Return success */
IoStatus->Status = STATUS_SUCCESS;
IoStatus->Information = 0;
return TRUE;
}
/* Sanity check */
ASSERT(MAXLONGLONG - FileOffset->QuadPart >= (LONGLONG)Length);
/* Get the offset and FCB header */
Offset.QuadPart = FileOffset->QuadPart + Length;
FcbHeader = (PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext;
/* Enter the FS */
FsRtlEnterFileSystem();
CcFastMdlReadWait++;
/* Lock the FCB */
ExAcquireResourceShared(FcbHeader->Resource, TRUE);
/* Check if this is a fast I/O cached file */
if (!(FileObject->PrivateCacheMap) ||
(FcbHeader->IsFastIoPossible == FastIoIsNotPossible))
{
/* It's not, so fail */
CcFastMdlReadNotPossible += 1;
Result = FALSE;
goto Cleanup;
}
/* Check if we need to find out if fast I/O is available */
if (FcbHeader->IsFastIoPossible == FastIoIsQuestionable)
{
/* Get the Fast I/O table */
Device = IoGetRelatedDeviceObject(FileObject);
FastIoDispatch = Device->DriverObject->FastIoDispatch;
/* Sanity check */
ASSERT(!KeIsExecutingDpc());
ASSERT(FastIoDispatch != NULL);
ASSERT(FastIoDispatch->FastIoCheckIfPossible != NULL);
/* Ask the driver if we can do it */
if (!FastIoDispatch->FastIoCheckIfPossible(FileObject,
FileOffset,
Length,
TRUE,
LockKey,
TRUE,
IoStatus,
Device))
{
/* It's not, fail */
CcFastMdlReadNotPossible += 1;
Result = FALSE;
goto Cleanup;
}
}
/* Check if we read too much */
if (Offset.QuadPart > FcbHeader->FileSize.QuadPart)
{
/* We did, check if the file offset is past the end */
if (FileOffset->QuadPart >= FcbHeader->FileSize.QuadPart)
{
/* Set end of file */
IoStatus->Status = STATUS_END_OF_FILE;
IoStatus->Information = 0;
goto Cleanup;
}
/* Otherwise, just normalize the length */
Length = (ULONG)(FcbHeader->FileSize.QuadPart - FileOffset->QuadPart);
}
/* Set this as top-level IRP */
PsGetCurrentThread()->TopLevelIrp = FSRTL_FAST_IO_TOP_LEVEL_IRP;
_SEH_TRY
{
/* Attempt a read */
CcMdlRead(FileObject, FileOffset, Length, MdlChain, IoStatus);
FileObject->Flags |= FO_FILE_FAST_IO_READ;
}
_SEH_EXCEPT(FsRtlCcCopyFilter)
{
Result = FALSE;
} _SEH_END;
/* Remove the top-level IRP flag */
PsGetCurrentThread()->TopLevelIrp = 0;
/* Return to caller */
Cleanup:
ExReleaseResourceLite(FcbHeader->Resource);
FsRtlExitFileSystem();
return Result;
} }
/* /*

View file

@ -63,8 +63,8 @@ typedef struct _INTERNAL_BCB
VOID VOID
NTAPI NTAPI
CcMdlReadCompleteDev( CcMdlReadComplete2(
IN PMDL MdlChain, IN PMDL MemoryDescriptorList,
IN PFILE_OBJECT FileObject IN PFILE_OBJECT FileObject
); );