sys: FSP_FSVOL_DEVICE_EXTENSION::VolumeDeleteResource

This commit is contained in:
Bill Zissimopoulos 2022-06-10 12:55:19 +01:00
parent 18842682c8
commit 805742f306
3 changed files with 25 additions and 0 deletions

View File

@ -410,6 +410,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
FsvolDeviceExtension->InitDoneStat = 1; FsvolDeviceExtension->InitDoneStat = 1;
/* initialize our context table */ /* initialize our context table */
ExInitializeResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource); ExInitializeResourceLite(&FsvolDeviceExtension->FileRenameResource);
ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource); ExInitializeResourceLite(&FsvolDeviceExtension->ContextTableResource);
InitializeListHead(&FsvolDeviceExtension->ContextList); InitializeListHead(&FsvolDeviceExtension->ContextList);
@ -495,6 +496,7 @@ static VOID FspFsvolDeviceFini(PDEVICE_OBJECT DeviceObject)
ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource); ExDeleteResourceLite(&FsvolDeviceExtension->ContextTableResource);
ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource); ExDeleteResourceLite(&FsvolDeviceExtension->FileRenameResource);
ExDeleteResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
} }
/* is there a virtual disk? */ /* is there a virtual disk? */

View File

@ -1211,6 +1211,8 @@ typedef struct
KSPIN_LOCK ExpirationLock; KSPIN_LOCK ExpirationLock;
WORK_QUEUE_ITEM ExpirationWorkItem; WORK_QUEUE_ITEM ExpirationWorkItem;
BOOLEAN ExpirationInProgress; BOOLEAN ExpirationInProgress;
ERESOURCE VolumeDeleteResource;
BOOLEAN VolumeDeleted;
ERESOURCE FileRenameResource; ERESOURCE FileRenameResource;
ERESOURCE ContextTableResource; ERESOURCE ContextTableResource;
LIST_ENTRY ContextList; LIST_ENTRY ContextList;

View File

@ -369,6 +369,9 @@ VOID FspVolumeDelete(
ULONG FileNodeCount, Index; ULONG FileNodeCount, Index;
NTSTATUS Result; NTSTATUS Result;
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
FsvolDeviceExtension->VolumeDeleted = TRUE;
/* /*
* If we have an fsvrt that is a mountdev, finalize it now! Finalizing a mountdev * If we have an fsvrt that is a mountdev, finalize it now! Finalizing a mountdev
* involves interaction with the MountManager, which tries to open our devices. * involves interaction with the MountManager, which tries to open our devices.
@ -403,6 +406,8 @@ VOID FspVolumeDelete(
FspFileNodeDeleteList(FileNodes, FileNodeCount); FspFileNodeDeleteList(FileNodes, FileNodeCount);
} }
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);
} }
@ -1184,6 +1189,14 @@ NTSTATUS FspVolumeNotify(
if (!FspDeviceReference(FsvolDeviceObject)) if (!FspDeviceReference(FsvolDeviceObject))
return STATUS_CANCELLED; return STATUS_CANCELLED;
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
ExAcquireResourceSharedLite(&FsvolDeviceExtension->VolumeDeleteResource, TRUE);
if (FsvolDeviceExtension->VolumeDeleted)
{
Result = STATUS_CANCELLED;
goto fail;
}
NotifyWorkItem = FspAllocNonPaged( NotifyWorkItem = FspAllocNonPaged(
FIELD_OFFSET(FSP_VOLUME_NOTIFY_WORK_ITEM, InputBuffer) + InputBufferLength); FIELD_OFFSET(FSP_VOLUME_NOTIFY_WORK_ITEM, InputBuffer) + InputBufferLength);
if (0 == NotifyWorkItem) if (0 == NotifyWorkItem)
@ -1205,6 +1218,9 @@ NTSTATUS FspVolumeNotify(
goto fail; goto fail;
} }
ExSetResourceOwnerPointer(&FsvolDeviceExtension->VolumeDeleteResource,
(PVOID)((UINT_PTR)NotifyWorkItem | 3));
ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem); ExInitializeWorkItem(&NotifyWorkItem->WorkItem, FspVolumeNotifyWork, NotifyWorkItem);
NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject; NotifyWorkItem->FsvolDeviceObject = FsvolDeviceObject;
@ -1216,6 +1232,8 @@ fail:
if (0 != NotifyWorkItem) if (0 != NotifyWorkItem)
FspFree(NotifyWorkItem); FspFree(NotifyWorkItem);
ExReleaseResourceLite(&FsvolDeviceExtension->VolumeDeleteResource);
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);
return Result; return Result;
@ -1365,6 +1383,9 @@ static VOID FspVolumeNotifyWork(PVOID NotifyWorkItem0)
ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex); ExReleaseFastMutex(&FsvolDeviceExtension->VolumeNotifyMutex);
} }
ExReleaseResourceForThreadLite(&FsvolDeviceExtension->VolumeDeleteResource,
(ERESOURCE_THREAD)((UINT_PTR)NotifyWorkItem | 3));
FspDeviceDereference(FsvolDeviceObject); FspDeviceDereference(FsvolDeviceObject);
FsRtlExitFileSystem(); FsRtlExitFileSystem();