windows-nt/Source/XPSP1/NT/base/fs/rdr2/inc/scavengr.h
2020-09-26 16:20:57 +08:00

229 lines
7.5 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
scavengr.h
Abstract:
This module defines data structures related to scavenging in the RDBSS
Author:
Balan Sethu Raman [SethuR] 9-Sep-1995
Revision History:
Notes:
The dormant file limit must be made configurable on a per server basis
--*/
#ifndef _SCAVENGR_H_
#define _SCAVENGR_H_
// currently, only a single scavengermutex is across all scavenging operations
// for all underlying deviceobjects
extern KMUTEX RxScavengerMutex;
// An instance of this data structure is embedded as part of those data structures
// that are scavenged, i.e., FCB, RX_CONTEXT, etc.
#define RX_SCAVENGER_ENTRY_TYPE_MARKER (0x0001)
#define RX_SCAVENGER_ENTRY_TYPE_FCB (0x0002)
#define RX_SCAVENGER_OP_PURGE (0x0001)
#define RX_SCAVENGER_OP_CLOSE (0x0002)
#define RX_SCAVENGER_INITIATED_OPERATION (0x0001)
typedef enum _RX_SCAVENGER_ENTRY_STATE {
RX_SCAVENGING_INACTIVE,
RX_SCAVENGING_PENDING,
RX_SCAVENGING_IN_PROGRESS,
RX_SCAVENGING_AWAITING_RESPONSE
} RX_SCAVENGER_ENTRY_STATE, *PRX_SCAVENGER_ENTRY_STATE;
typedef struct _RX_SCAVENGER_ENTRY {
// List of related items to be scavenged
LIST_ENTRY List;
UCHAR Type;
UCHAR Operation;
UCHAR State;
UCHAR Flags;
struct _RX_SCAVENGER_ENTRY *pContinuationEntry;
} RX_SCAVENGER_ENTRY, *PRX_SCAVENGER_ENTRY;
#define RxInitializeScavengerEntry(pScavengerEntry) \
(pScavengerEntry)->State = 0; \
(pScavengerEntry)->Flags = 0; \
(pScavengerEntry)->Type = 0; \
(pScavengerEntry)->Operation = 0; \
InitializeListHead(&(pScavengerEntry)->List); \
(pScavengerEntry)->pContinuationEntry = NULL
#define RX_SCAVENGER_MUTEX_ACQUIRED (1)
typedef enum _RDBSS_SCAVENGER_STATE {
RDBSS_SCAVENGER_INACTIVE,
RDBSS_SCAVENGER_DORMANT,
RDBSS_SCAVENGER_ACTIVE,
RDBSS_SCAVENGER_SUSPENDED
} RDBSS_SCAVENGER_STATE, *PRDBSS_SCAVENGER_STATE;
typedef struct _RDBSS_SCAVENGER {
RDBSS_SCAVENGER_STATE State;
LONG MaximumNumberOfDormantFiles;
LONG NumberOfDormantFiles;
ULONG SrvCallsToBeFinalized;
ULONG NetRootsToBeFinalized;
ULONG VNetRootsToBeFinalized;
ULONG FcbsToBeFinalized;
ULONG SrvOpensToBeFinalized;
ULONG FobxsToBeFinalized;
LIST_ENTRY SrvCallFinalizationList;
LIST_ENTRY NetRootFinalizationList;
LIST_ENTRY VNetRootFinalizationList;
LIST_ENTRY FcbFinalizationList;
LIST_ENTRY SrvOpenFinalizationList;
LIST_ENTRY FobxFinalizationList;
LIST_ENTRY ClosePendingFobxsList;
RX_WORK_ITEM WorkItem;
KEVENT SyncEvent;
PETHREAD CurrentScavengerThread;
PNET_ROOT CurrentNetRootForClosePendingProcessing;
PFCB CurrentFcbForClosePendingProcessing;
KEVENT ClosePendingProcessingSyncEvent;
} RDBSS_SCAVENGER, *PRDBSS_SCAVENGER;
#if 0
//this is not used anywhere
typedef struct _RX_FCB_SCAVENGER_ {
ULONG State;
ULONG OperationsCompleted;
PRX_SCAVENGER_ENTRY pLastActiveMarkerEntry;
LIST_ENTRY OperationsPendingList;
LIST_ENTRY OperationsInProgressList;
LIST_ENTRY OperationsAwaitingResponseList;
} RX_FCB_SCAVENGER, *PRX_FCB_SCAVENGER;
#define RxInitializeFcbScavenger(pFcbScavenger) \
(pFcbScavenger)->pLastActiveMarkerEntry = NULL; \
(pFcbScavenger)->OperationsCompleted = 0; \
(pFcbScavenger)->State = 0; \
InitializeListHead(&(pFcbScavenger)->OperationsPendingList); \
InitializeListHead(&(pFcbScavenger)->OperationsInProgressList); \
InitializeListHead(&(pFcbScavenger)->OperationsAwaitingResponseList)
#endif
#define RxInitializeRdbssScavenger(pScavenger) \
(pScavenger)->State = RDBSS_SCAVENGER_INACTIVE; \
(pScavenger)->SrvCallsToBeFinalized = 0; \
(pScavenger)->NetRootsToBeFinalized = 0; \
(pScavenger)->VNetRootsToBeFinalized = 0; \
(pScavenger)->FcbsToBeFinalized = 0; \
(pScavenger)->SrvOpensToBeFinalized = 0; \
(pScavenger)->FobxsToBeFinalized = 0; \
(pScavenger)->NumberOfDormantFiles = 0; \
(pScavenger)->MaximumNumberOfDormantFiles = 50; \
(pScavenger)->CurrentFcbForClosePendingProcessing = NULL; \
(pScavenger)->CurrentNetRootForClosePendingProcessing = NULL; \
KeInitializeEvent(&((pScavenger)->SyncEvent),NotificationEvent,FALSE); \
KeInitializeEvent(&((pScavenger)->ClosePendingProcessingSyncEvent),NotificationEvent,FALSE); \
InitializeListHead(&(pScavenger)->SrvCallFinalizationList); \
InitializeListHead(&(pScavenger)->NetRootFinalizationList); \
InitializeListHead(&(pScavenger)->VNetRootFinalizationList); \
InitializeListHead(&(pScavenger)->SrvOpenFinalizationList); \
InitializeListHead(&(pScavenger)->FcbFinalizationList); \
InitializeListHead(&(pScavenger)->FobxFinalizationList); \
InitializeListHead(&(pScavenger)->ClosePendingFobxsList)
#define RxAcquireScavengerMutex() \
KeWaitForSingleObject(&RxScavengerMutex,Executive,KernelMode,FALSE,NULL)
#define RxReleaseScavengerMutex() \
KeReleaseMutex(&RxScavengerMutex,FALSE)
extern NTSTATUS
RxMarkFcbForScavengingAtCleanup(PFCB pFcb);
extern NTSTATUS
RxMarkFcbForScavengingAtClose(PFCB pFcb);
extern VOID
RxUpdateScavengerOnCloseCompletion(PFCB pFcb);
extern VOID
RxMarkFobxOnCleanup(PFOBX pFobx, BOOLEAN *pNeedPurge);
extern VOID
RxMarkFobxOnClose(PFOBX pFobx);
extern NTSTATUS
RxPurgeRelatedFobxs(PNET_ROOT pNetRoot,PRX_CONTEXT pRxContext,BOOLEAN AttemptFinalization,PFCB PurgingFcb);
#define DONT_ATTEMPT_FINALIZE_ON_PURGE FALSE
#define ATTEMPT_FINALIZE_ON_PURGE TRUE
//
// the purge_sync context is used to synchronize contexts that are attempting to purge...
// notatbly creates and dirctrls. these are planted in various structures because various minirdrs
// require different granularity of purge operations
typedef struct _PURGE_SYNCHRONIZATION_CONTEXT {
LIST_ENTRY ContextsAwaitingPurgeCompletion; // the list of purge requests active for this netroot.
BOOLEAN PurgeInProgress;
} PURGE_SYNCHRONIZATION_CONTEXT, *PPURGE_SYNCHRONIZATION_CONTEXT;
VOID
RxInitializePurgeSyncronizationContext (
PPURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext
);
extern NTSTATUS
RxScavengeRelatedFcbs(PRX_CONTEXT pRxContext);
extern BOOLEAN
RxScavengeRelatedFobxs(PFCB pFcb);
extern VOID
RxScavengeFobxsForNetRoot(
struct _NET_ROOT *pNetRoot,
PFCB PurgingFcb);
extern VOID
RxpMarkInstanceForScavengedFinalization(
PVOID pInstance);
extern VOID
RxpUndoScavengerFinalizationMarking(
PVOID pInstance);
extern VOID
RxTerminateScavenging(
PRX_CONTEXT pRxContext);
extern BOOLEAN
RxScavengeVNetRoots(
PRDBSS_DEVICE_OBJECT RxDeviceObject);
extern VOID
RxSynchronizeWithScavenger(
PRX_CONTEXT RxContext);
#endif // _SCAVENGR_H_