sys: FspFileNodeOpen,FspFileNode: maintain active list

This commit is contained in:
Bill Zissimopoulos 2017-01-03 18:57:00 -08:00
parent 1d8241cba7
commit 95bbb584eb
3 changed files with 27 additions and 5 deletions

View File

@ -45,7 +45,7 @@ VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject);
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject); VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
PVOID **PContexts, PULONG PContextCount); PVOID **PContexts, PULONG PContextCount);
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount); VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount);
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey); BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
@ -81,7 +81,7 @@ VOID FspDeviceDeleteAll(VOID);
#pragma alloc_text(PAGE, FspFsvolDeviceLockContextTable) #pragma alloc_text(PAGE, FspFsvolDeviceLockContextTable)
#pragma alloc_text(PAGE, FspFsvolDeviceUnlockContextTable) #pragma alloc_text(PAGE, FspFsvolDeviceUnlockContextTable)
#pragma alloc_text(PAGE, FspFsvolDeviceCopyContextByNameList) #pragma alloc_text(PAGE, FspFsvolDeviceCopyContextByNameList)
#pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextByNameList) #pragma alloc_text(PAGE, FspFsvolDeviceDeleteContextList)
#pragma alloc_text(PAGE, FspFsvolDeviceEnumerateContextByName) #pragma alloc_text(PAGE, FspFsvolDeviceEnumerateContextByName)
#pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName) #pragma alloc_text(PAGE, FspFsvolDeviceLookupContextByName)
#pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName) #pragma alloc_text(PAGE, FspFsvolDeviceInsertContextByName)
@ -373,6 +373,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
/* initialize our context table */ /* initialize our context table */
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource); ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
InitializeListHead(&FsvolDeviceExtension->ContextList);
RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable, RtlInitializeGenericTableAvl(&FsvolDeviceExtension->ContextByNameTable,
FspFsvolDeviceCompareContextByName, FspFsvolDeviceCompareContextByName,
FspFsvolDeviceAllocateContextByName, FspFsvolDeviceAllocateContextByName,
@ -620,7 +621,7 @@ NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount) VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount)
{ {
PAGED_CODE(); PAGED_CODE();

View File

@ -1025,6 +1025,7 @@ typedef struct
BOOLEAN ExpirationInProgress; BOOLEAN ExpirationInProgress;
ERESOURCE FileRenameResource; ERESOURCE FileRenameResource;
ERESOURCE ContextTableResource; ERESOURCE ContextTableResource;
LIST_ENTRY ContextList;
RTL_AVL_TABLE ContextByNameTable; RTL_AVL_TABLE ContextByNameTable;
PVOID ContextByNameTableElementStorage; PVOID ContextByNameTableElementStorage;
UNICODE_STRING VolumeName; UNICODE_STRING VolumeName;
@ -1067,7 +1068,7 @@ VOID FspFsvolDeviceLockContextTable(PDEVICE_OBJECT DeviceObject);
VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject); VOID FspFsvolDeviceUnlockContextTable(PDEVICE_OBJECT DeviceObject);
NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject,
PVOID **PContexts, PULONG PContextCount); PVOID **PContexts, PULONG PContextCount);
VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount); VOID FspFsvolDeviceDeleteContextList(PVOID *Contexts, ULONG ContextCount);
PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName,
BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey); BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey);
PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName);
@ -1169,11 +1170,13 @@ typedef struct FSP_FILE_NODE
LONG RefCount; LONG RefCount;
UINT32 DeletePending; UINT32 DeletePending;
/* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */ /* locked under FSP_FSVOL_DEVICE_EXTENSION::ContextTableResource */
LONG ActiveCount; /* CREATE w/o CLOSE count */
LONG OpenCount; /* ContextTable ref count */ LONG OpenCount; /* ContextTable ref count */
LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */ LONG HandleCount; /* HANDLE count (CREATE/CLEANUP) */
SHARE_ACCESS ShareAccess; SHARE_ACCESS ShareAccess;
ULONG MainFileDenyDeleteCount; /* number of times main file is denying delete */ ULONG MainFileDenyDeleteCount; /* number of times main file is denying delete */
ULONG StreamDenyDeleteCount; /* number of times open streams are denying delete */ ULONG StreamDenyDeleteCount; /* number of times open streams are denying delete */
LIST_ENTRY ActiveEntry;
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage; FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */ /* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
UNICODE_STRING FileName; UNICODE_STRING FileName;

View File

@ -256,7 +256,7 @@ VOID FspFileNodeDeleteList(FSP_FILE_NODE **FileNodes, ULONG FileNodeCount)
for (Index = 0; FileNodeCount > Index; Index++) for (Index = 0; FileNodeCount > Index; Index++)
FspFileNodeDereference(FileNodes[Index]); FspFileNodeDereference(FileNodes[Index]);
FspFsvolDeviceDeleteContextByNameList(FileNodes, FileNodeCount); FspFsvolDeviceDeleteContextList(FileNodes, FileNodeCount);
} }
NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject, NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
@ -692,6 +692,14 @@ exit:
if (0 != OpenedFileNode) if (0 != OpenedFileNode)
{ {
FspFileNodeReference(OpenedFileNode); FspFileNodeReference(OpenedFileNode);
ASSERT(0 <= OpenedFileNode->ActiveCount);
ASSERT(0 <= OpenedFileNode->OpenCount);
ASSERT(0 <= OpenedFileNode->HandleCount);
if (0 == OpenedFileNode->ActiveCount++)
InsertTailList(&FspFsvolDeviceExtension(FsvolDeviceObject)->ContextList,
&FileNode->ActiveEntry);
OpenedFileNode->OpenCount++; OpenedFileNode->OpenCount++;
OpenedFileNode->HandleCount++; OpenedFileNode->HandleCount++;
} }
@ -776,6 +784,7 @@ VOID FspFileNodeCleanupComplete(FSP_FILE_NODE *FileNode, PFILE_OBJECT FileObject
IoRemoveShareAccess(FileObject, &FileNode->ShareAccess); IoRemoveShareAccess(FileObject, &FileNode->ShareAccess);
ASSERT(0 < FileNode->HandleCount);
if (0 == --FileNode->HandleCount) if (0 == --FileNode->HandleCount)
{ {
DeletePending = 0 != FileNode->DeletePending; DeletePending = 0 != FileNode->DeletePending;
@ -908,6 +917,15 @@ VOID FspFileNodeClose(FSP_FILE_NODE *FileNode,
ASSERT(DeletedFromContextTable); ASSERT(DeletedFromContextTable);
} }
ASSERT(0 < FileNode->ActiveCount);
if (0 == --FileNode->ActiveCount)
{
ASSERT(0 == FileNode->OpenCount);
ASSERT(0 == FileNode->HandleCount);
RemoveEntryList(&FileNode->ActiveEntry);
}
FspFsvolDeviceUnlockContextTable(FsvolDeviceObject); FspFsvolDeviceUnlockContextTable(FsvolDeviceObject);
if (DeletedFromContextTable) if (DeletedFromContextTable)