/*++ BUILD Version: 0003 // Increment this if a change has global effects Copyright (c) 1989 Microsoft Corporation Module Name: Cache.h Abstract: This module contains the public data structures and procedure prototypes for the cache management system. Author: Revision History: --*/ #ifndef _CACHE_ #define _CACHE_ #include "prefetch.h" #include "perf.h" // begin_ntifs // // Define two constants describing the view size (and alignment) // that the Cache Manager uses to map files. // #define VACB_MAPPING_GRANULARITY (0x40000) #define VACB_OFFSET_SHIFT (18) // // Public portion of BCB // typedef struct _PUBLIC_BCB { // // Type and size of this record // // NOTE: The first four fields must be the same as the BCB in cc.h. // CSHORT NodeTypeCode; CSHORT NodeByteSize; // // Description of range of file which is currently mapped. // ULONG MappedLength; LARGE_INTEGER MappedFileOffset; } PUBLIC_BCB, *PPUBLIC_BCB; // // File Sizes structure. // typedef struct _CC_FILE_SIZES { LARGE_INTEGER AllocationSize; LARGE_INTEGER FileSize; LARGE_INTEGER ValidDataLength; } CC_FILE_SIZES, *PCC_FILE_SIZES; // // Define a Cache Manager callback structure. These routines are required // by the Lazy Writer, so that it can acquire resources in the right order // to avoid deadlocks. Note that otherwise you would have most FS requests // acquiring FS resources first and caching structures second, while the // Lazy Writer needs to acquire its own resources first, and then FS // structures later as it calls the file system. // // // First define the procedure pointer typedefs // // // This routine is called by the Lazy Writer prior to doing a write, // since this will require some file system resources associated with // this cached file. The context parameter supplied is whatever the FS // passed as the LazyWriteContext parameter when is called // CcInitializeCacheMap. // typedef BOOLEAN (*PACQUIRE_FOR_LAZY_WRITE) ( IN PVOID Context, IN BOOLEAN Wait ); // // This routine releases the Context acquired above. // typedef VOID (*PRELEASE_FROM_LAZY_WRITE) ( IN PVOID Context ); // // This routine is called by the Lazy Writer prior to doing a readahead. // typedef BOOLEAN (*PACQUIRE_FOR_READ_AHEAD) ( IN PVOID Context, IN BOOLEAN Wait ); // // This routine releases the Context acquired above. // typedef VOID (*PRELEASE_FROM_READ_AHEAD) ( IN PVOID Context ); typedef struct _CACHE_MANAGER_CALLBACKS { PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; } CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; // // This structure is passed into CcUninitializeCacheMap // if the caller wants to know when the cache map is deleted. // typedef struct _CACHE_UNINITIALIZE_EVENT { struct _CACHE_UNINITIALIZE_EVENT *Next; KEVENT Event; } CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; // // Callback routine for retrieving dirty pages from Cache Manager. // typedef VOID (*PDIRTY_PAGE_ROUTINE) ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN PLARGE_INTEGER OldestLsn, IN PLARGE_INTEGER NewestLsn, IN PVOID Context1, IN PVOID Context2 ); // // Callback routine for doing log file flushes to Lsn. // typedef VOID (*PFLUSH_TO_LSN) ( IN PVOID LogHandle, IN LARGE_INTEGER Lsn ); // // Macro to test whether a file is cached or not. // #define CcIsFileCached(FO) ( \ ((FO)->SectionObjectPointer != NULL) && \ (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ ) // end_ntifs // // Throw away miss counter // extern ULONG CcThrowAway; // // Performance Counters // extern ULONG CcFastReadNoWait; extern ULONG CcFastReadWait; extern ULONG CcFastReadResourceMiss; extern ULONG CcFastReadNotPossible; extern ULONG CcFastMdlReadNoWait; extern ULONG CcFastMdlReadWait; // ntifs extern ULONG CcFastMdlReadResourceMiss; extern ULONG CcFastMdlReadNotPossible; extern ULONG CcMapDataNoWait; extern ULONG CcMapDataWait; extern ULONG CcMapDataNoWaitMiss; extern ULONG CcMapDataWaitMiss; extern ULONG CcPinMappedDataCount; extern ULONG CcPinReadNoWait; extern ULONG CcPinReadWait; extern ULONG CcPinReadNoWaitMiss; extern ULONG CcPinReadWaitMiss; extern ULONG CcCopyReadNoWait; extern ULONG CcCopyReadWait; extern ULONG CcCopyReadNoWaitMiss; extern ULONG CcCopyReadWaitMiss; extern ULONG CcMdlReadNoWait; extern ULONG CcMdlReadWait; extern ULONG CcMdlReadNoWaitMiss; extern ULONG CcMdlReadWaitMiss; extern ULONG CcReadAheadIos; extern ULONG CcLazyWriteIos; extern ULONG CcLazyWritePages; extern ULONG CcDataFlushes; extern ULONG CcDataPages; extern ULONG CcLostDelayedWrites; extern PULONG CcMissCounter; // // Global Maintenance routines // NTKERNELAPI BOOLEAN CcInitializeCacheManager ( VOID ); LOGICAL CcHasInactiveViews ( VOID ); LOGICAL CcUnmapInactiveViews ( IN ULONG NumberOfViewsToUnmap ); // begin_ntifs // // The following routines are intended for use by File Systems Only. // NTKERNELAPI VOID CcInitializeCacheMap ( IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes, IN BOOLEAN PinAccess, IN PCACHE_MANAGER_CALLBACKS Callbacks, IN PVOID LazyWriteContext ); NTKERNELAPI BOOLEAN CcUninitializeCacheMap ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER TruncateSize OPTIONAL, IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL ); NTKERNELAPI VOID CcSetFileSizes ( IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes ); // // VOID // CcFastIoSetFileSizes ( // IN PFILE_OBJECT FileObject, // IN PCC_FILE_SIZES FileSizes // ); // #define CcGetFileSizePointer(FO) ( \ ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ ) NTKERNELAPI BOOLEAN CcPurgeCacheSection ( IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN PLARGE_INTEGER FileOffset OPTIONAL, IN ULONG Length, IN BOOLEAN UninitializeCacheMaps ); NTKERNELAPI VOID CcSetDirtyPageThreshold ( IN PFILE_OBJECT FileObject, IN ULONG DirtyPageThreshold ); NTKERNELAPI VOID CcFlushCache ( IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN PLARGE_INTEGER FileOffset OPTIONAL, IN ULONG Length, OUT PIO_STATUS_BLOCK IoStatus OPTIONAL ); NTKERNELAPI LARGE_INTEGER CcGetFlushedValidData ( IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN BOOLEAN BcbListHeld ); // end_ntifs NTKERNELAPI VOID CcZeroEndOfLastPage ( IN PFILE_OBJECT FileObject ); // begin_ntifs NTKERNELAPI BOOLEAN CcZeroData ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER StartOffset, IN PLARGE_INTEGER EndOffset, IN BOOLEAN Wait ); NTKERNELAPI PVOID CcRemapBcb ( IN PVOID Bcb ); NTKERNELAPI VOID CcRepinBcb ( IN PVOID Bcb ); NTKERNELAPI VOID CcUnpinRepinnedBcb ( IN PVOID Bcb, IN BOOLEAN WriteThrough, OUT PIO_STATUS_BLOCK IoStatus ); NTKERNELAPI PFILE_OBJECT CcGetFileObjectFromSectionPtrs ( IN PSECTION_OBJECT_POINTERS SectionObjectPointer ); NTKERNELAPI PFILE_OBJECT CcGetFileObjectFromBcb ( IN PVOID Bcb ); // // These routines are implemented to support write throttling. // // // BOOLEAN // CcCopyWriteWontFlush ( // IN PFILE_OBJECT FileObject, // IN PLARGE_INTEGER FileOffset, // IN ULONG Length // ); // #define CcCopyWriteWontFlush(FO,FOFF,LEN) ((LEN) <= 0X10000) NTKERNELAPI BOOLEAN CcCanIWrite ( IN PFILE_OBJECT FileObject, IN ULONG BytesToWrite, IN BOOLEAN Wait, IN BOOLEAN Retrying ); typedef VOID (*PCC_POST_DEFERRED_WRITE) ( IN PVOID Context1, IN PVOID Context2 ); NTKERNELAPI VOID CcDeferWrite ( IN PFILE_OBJECT FileObject, IN PCC_POST_DEFERRED_WRITE PostRoutine, IN PVOID Context1, IN PVOID Context2, IN ULONG BytesToWrite, IN BOOLEAN Retrying ); // // The following routines provide a data copy interface to the cache, and // are intended for use by File Servers and File Systems. // NTKERNELAPI BOOLEAN CcCopyRead ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus ); NTKERNELAPI VOID CcFastCopyRead ( IN PFILE_OBJECT FileObject, IN ULONG FileOffset, IN ULONG Length, IN ULONG PageCount, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus ); NTKERNELAPI BOOLEAN CcCopyWrite ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN PVOID Buffer ); NTKERNELAPI VOID CcFastCopyWrite ( IN PFILE_OBJECT FileObject, IN ULONG FileOffset, IN ULONG Length, IN PVOID Buffer ); // // The following routines provide an Mdl interface for transfers to and // from the cache, and are primarily intended for File Servers. // // NOBODY SHOULD BE CALLING THESE MDL ROUTINES DIRECTLY, USE FSRTL AND // FASTIO INTERFACES. // NTKERNELAPI VOID CcMdlRead ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus ); // // This routine is now a wrapper for FastIo if present or CcMdlReadComplete2 // NTKERNELAPI VOID CcMdlReadComplete ( IN PFILE_OBJECT FileObject, IN PMDL MdlChain ); // end_ntifs NTKERNELAPI VOID CcMdlReadComplete2 ( IN PFILE_OBJECT FileObject, IN PMDL MdlChain ); // begin_ntifs NTKERNELAPI VOID CcPrepareMdlWrite ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, OUT PMDL *MdlChain, OUT PIO_STATUS_BLOCK IoStatus ); // // This routine is now a wrapper for FastIo if present or CcMdlWriteComplete2 // NTKERNELAPI VOID CcMdlWriteComplete ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain ); VOID CcMdlWriteAbort ( IN PFILE_OBJECT FileObject, IN PMDL MdlChain ); // end_ntifs NTKERNELAPI VOID CcMdlWriteComplete2 ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PMDL MdlChain ); // begin_ntifs // // Common ReadAhead call for Copy Read and Mdl Read. // // ReadAhead should always be invoked by calling the CcReadAhead macro, // which tests first to see if the read is large enough to warrant read // ahead. Measurements have shown that, calling the read ahead routine // actually decreases performance for small reads, such as issued by // many compilers and linkers. Compilers simply want all of the include // files to stay in memory after being read the first time. // #define CcReadAhead(FO,FOFF,LEN) { \ if ((LEN) >= 256) { \ CcScheduleReadAhead((FO),(FOFF),(LEN)); \ } \ } NTKERNELAPI VOID CcScheduleReadAhead ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length ); // // The following routine allows a caller to wait for the next batch // of lazy writer work to complete. In particular, this provides a // mechanism for a caller to be sure that all avaliable lazy closes // at the time of this call have issued. // NTSTATUS CcWaitForCurrentLazyWriterActivity ( VOID ); // // This routine changes the read ahead granularity for a file, which is // PAGE_SIZE by default. // NTKERNELAPI VOID CcSetReadAheadGranularity ( IN PFILE_OBJECT FileObject, IN ULONG Granularity ); // // The following routines provide direct access data which is pinned in the // cache, and is primarily intended for use by File Systems. In particular, // this mode of access is ideal for dealing with volume structures. // // // Flags for pinning // // // Synchronous Wait - normally specified. This pattern may be specified as TRUE. // #define PIN_WAIT (1) // // Acquire metadata Bcb exclusive (default is shared, Lazy Writer uses exclusive). // // Must be set with PIN_WAIT. // #define PIN_EXCLUSIVE (2) // // Acquire metadata Bcb but do not fault data in. Default is to fault the data in. // This unusual flag is only used by Ntfs for cache coherency synchronization between // compressed and uncompressed streams for the same compressed file. // // Must be set with PIN_WAIT. // #define PIN_NO_READ (4) // // This option may be used to pin data only if the Bcb already exists. If the Bcb // does not already exist - the pin is unsuccessful and no Bcb is returned. This routine // provides a way to see if data is already pinned (and possibly dirty) in the cache, // without forcing a fault if the data is not there. // #define PIN_IF_BCB (8) // // Flags for mapping // // // Synchronous Wait - normally specified. This pattern may be specified as TRUE. // #define MAP_WAIT (1) // // Acquire metadata Bcb but do not fault data in. Default is to fault the data in. // This should not overlap with any of the PIN_ flags so they can be passed down to // CcPinFileData // #define MAP_NO_READ (16) NTKERNELAPI BOOLEAN CcPinRead ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer ); NTKERNELAPI BOOLEAN CcMapData ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer ); NTKERNELAPI BOOLEAN CcPinMappedData ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, IN OUT PVOID *Bcb ); NTKERNELAPI BOOLEAN CcPreparePinWrite ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Zero, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer ); NTKERNELAPI VOID CcSetDirtyPinnedData ( IN PVOID BcbVoid, IN PLARGE_INTEGER Lsn OPTIONAL ); NTKERNELAPI VOID CcUnpinData ( IN PVOID Bcb ); NTKERNELAPI VOID CcSetBcbOwnerPointer ( IN PVOID Bcb, IN PVOID OwnerPointer ); NTKERNELAPI VOID CcUnpinDataForThread ( IN PVOID Bcb, IN ERESOURCE_THREAD ResourceThreadId ); // end_ntifs // // The following routines are in logsup.c, and provide special Cache Manager // support for storting Lsns with dirty file pages, and peforming subsequent // operations based on them. // NTKERNELAPI BOOLEAN CcSetPrivateWriteFile( PFILE_OBJECT FileObject ); // begin_ntifs NTKERNELAPI VOID CcSetAdditionalCacheAttributes ( IN PFILE_OBJECT FileObject, IN BOOLEAN DisableReadAhead, IN BOOLEAN DisableWriteBehind ); NTKERNELAPI VOID CcSetLogHandleForFile ( IN PFILE_OBJECT FileObject, IN PVOID LogHandle, IN PFLUSH_TO_LSN FlushToLsnRoutine ); NTKERNELAPI LARGE_INTEGER CcGetDirtyPages ( IN PVOID LogHandle, IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, IN PVOID Context1, IN PVOID Context2 ); NTKERNELAPI BOOLEAN CcIsThereDirtyData ( IN PVPB Vpb ); // end_ntifs NTKERNELAPI LARGE_INTEGER CcGetLsnForFileObject( IN PFILE_OBJECT FileObject, OUT PLARGE_INTEGER OldestLsn OPTIONAL ); // // Internal kernel interfaces for the prefetcher. // extern LONG CcPfNumActiveTraces; #define CCPF_IS_PREFETCHER_ACTIVE() (CcPfNumActiveTraces) extern LOGICAL CcPfEnablePrefetcher; #define CCPF_IS_PREFETCHER_ENABLED() (CcPfEnablePrefetcher) extern LOGICAL CcPfPrefetchingForBoot; #define CCPF_IS_PREFETCHING_FOR_BOOT() (CcPfPrefetchingForBoot) NTSTATUS CcPfInitializePrefetcher( VOID ); NTSTATUS CcPfBeginBootPhase( PF_BOOT_PHASE_ID Phase ); NTSTATUS CcPfBeginAppLaunch( PEPROCESS Process, PVOID Section ); NTSTATUS CcPfProcessExitNotification( PEPROCESS Process ); #define CCPF_TYPE_IMAGE 0x00000001 // Current fault is for an image #define CCPF_TYPE_ROM 0x00000002 // Current fault is for a ROM VOID CcPfLogPageFault( IN PFILE_OBJECT FileObject, IN ULONGLONG FileOffset, IN ULONG Flags ); NTSTATUS CcPfQueryPrefetcherInformation ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, IN KPROCESSOR_MODE PreviousMode, OUT PULONG Length ); NTSTATUS CcPfSetPrefetcherInformation ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, IN KPROCESSOR_MODE PreviousMode ); // // Internal kernel interfaces for Perf FileName rundowns. // VOID CcPerfFileRunDown ( IN PPERFINFO_ENTRY_TABLE HashTable ); #endif // CACHE