229 lines
7.5 KiB
C
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_
|
|
|