sys: wait groups and notify implementation

This commit is contained in:
Bill Zissimopoulos
2020-10-09 12:40:49 -07:00
parent a004e4be10
commit 3687df53c6
4 changed files with 104 additions and 5 deletions

View File

@ -477,6 +477,7 @@ static VOID FspVolumeDeleteNoLock(
}
/* release the volume notify lock if held (so that any pending rename will abort) */
FspWgroupSignalPermanently(&FsvolDeviceExtension->VolumeNotifyWgroup);
if (1 == InterlockedCompareExchange(&FsvolDeviceExtension->VolumeNotifyLock, 0, 1))
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, FsvolDeviceObject);
@ -1097,6 +1098,7 @@ NTSTATUS FspVolumeNotify(
ASSERT(0 != IrpSp->FileObject->FsContext2);
PDEVICE_OBJECT FsvolDeviceObject = IrpSp->FileObject->FsContext2;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
PVOID InputBuffer = IrpSp->Parameters.FileSystemControl.Type3InputBuffer;
ULONG InputBufferLength = IrpSp->Parameters.FileSystemControl.InputBufferLength;
FSP_VOLUME_NOTIFY_WORK_ITEM *NotifyWorkItem = 0;
@ -1131,6 +1133,8 @@ NTSTATUS FspVolumeNotify(
ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem);
NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject;
FspWgroupIncrement(&FsvolDeviceExtension->VolumeNotifyWgroup);
ExQueueWorkItem(&NotifyWorkItem->WorkItem, DelayedWorkQueue);
return STATUS_SUCCESS;
@ -1196,6 +1200,7 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
ULONG NotifyInfoSize;
UNICODE_STRING FileName = { 0 }, StreamPart = { 0 }, AbsFileName = { 0 }, FullFileName = { 0 };
ULONG StreamType = FspFileNameStreamTypeNone;
BOOLEAN Unlock = FALSE;
NTSTATUS Result;
/* iterate over notify information and invalidate/notify each file */
@ -1206,9 +1211,7 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
if (sizeof(FSP_FSCTL_NOTIFY_INFO) > NotifyInfoSize)
{
/* !!!: we should wait until all pending notify work is done! */
if (1 == InterlockedCompareExchange(&FsvolDeviceExtension->VolumeNotifyLock, 0, 1))
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, FsvolDeviceObject);
Unlock = TRUE;
break;
}
@ -1265,6 +1268,14 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
FspFree(NotifyWorkItem);
FspWgroupDecrement(&FsvolDeviceExtension->VolumeNotifyWgroup);
if (Unlock)
{
FspWgroupWait(&FsvolDeviceExtension->VolumeNotifyWgroup, KernelMode, FALSE, 0);
if (1 == InterlockedCompareExchange(&FsvolDeviceExtension->VolumeNotifyLock, 0, 1))
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, FsvolDeviceObject);
}
FspDeviceDereference(FsvolDeviceObject);
FsRtlExitFileSystem();