mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 17:32:57 -05:00
sys: major change in device management: introduce FspDeviceGlobalLock and remove FSP_FSVOL_DEVICE_EXTENSION::DeleteResource; makes locking coarse-grained but more generic and safe
This commit is contained in:
@ -8,12 +8,18 @@
|
||||
|
||||
NTSTATUS FspVolumeCreate(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
static NTSTATUS FspVolumeCreateNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
static WORKER_THREAD_ROUTINE FspVolumeCreateRegisterMup;
|
||||
VOID FspVolumeDelete(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
static VOID FspVolumeDeleteNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
static WORKER_THREAD_ROUTINE FspVolumeDeleteDelayed;
|
||||
NTSTATUS FspVolumeMount(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
static NTSTATUS FspVolumeMountNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
NTSTATUS FspVolumeRedirQueryPathEx(
|
||||
PDEVICE_OBJECT FsvolDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp);
|
||||
NTSTATUS FspVolumeGetName(
|
||||
@ -27,14 +33,17 @@ NTSTATUS FspVolumeWork(
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text(PAGE, FspVolumeCreate)
|
||||
#pragma alloc_text(PAGE, FspVolumeCreateNoLock)
|
||||
#pragma alloc_text(PAGE, FspVolumeCreateRegisterMup)
|
||||
// ! #pragma alloc_text(PAGE, FspVolumeDelete)
|
||||
// ! #pragma alloc_text(PAGE, FspVolumeDeleteNoLock)
|
||||
// ! #pragma alloc_text(PAGE, FspVolumeDeleteDelayed)
|
||||
// ! #pragma alloc_text(PAGE, FspVolumeMount)
|
||||
// ! #pragma alloc_text(PAGE, FspVolumeMountNoLock)
|
||||
#pragma alloc_text(PAGE, FspVolumeRedirQueryPathEx)
|
||||
#pragma alloc_text(PAGE, FspVolumeGetName)
|
||||
#pragma alloc_text(PAGE, FspVolumeTransact)
|
||||
#pragma alloc_text(PAGE, FspVolumeStop)
|
||||
#pragma alloc_text(PAGE, FspVolumeRedirQueryPathEx)
|
||||
#pragma alloc_text(PAGE, FspVolumeWork)
|
||||
#endif
|
||||
|
||||
@ -50,6 +59,16 @@ typedef struct
|
||||
|
||||
NTSTATUS FspVolumeCreate(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
NTSTATUS Result;
|
||||
FspDeviceGlobalLock();
|
||||
Result = FspVolumeCreateNoLock(FsctlDeviceObject, Irp, IrpSp);
|
||||
FspDeviceGlobalUnlock();
|
||||
return Result;
|
||||
}
|
||||
|
||||
static NTSTATUS FspVolumeCreateNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
@ -239,6 +258,14 @@ static VOID FspVolumeCreateRegisterMup(PVOID Context)
|
||||
|
||||
VOID FspVolumeDelete(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
FspDeviceGlobalLock();
|
||||
FspVolumeDeleteNoLock(FsctlDeviceObject, Irp, IrpSp);
|
||||
FspDeviceGlobalUnlock();
|
||||
}
|
||||
|
||||
static VOID FspVolumeDeleteNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
// !PAGED_CODE();
|
||||
|
||||
@ -249,9 +276,6 @@ VOID FspVolumeDelete(
|
||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||
IrpSp->FileObject->FsContext2 = 0;
|
||||
|
||||
/* acquire the volume device DeleteResource */
|
||||
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->DeleteResource, TRUE);
|
||||
|
||||
/* stop the I/O queue */
|
||||
FspIoqStop(FsvolDeviceExtension->Ioq);
|
||||
|
||||
@ -319,9 +343,6 @@ VOID FspVolumeDelete(
|
||||
FsvolDeviceExtension->MupHandle = 0;
|
||||
}
|
||||
|
||||
/* release the volume device DeleteResource */
|
||||
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
||||
|
||||
/* release the volume device object */
|
||||
FspDeviceDereference(FsvolDeviceObject);
|
||||
}
|
||||
@ -344,9 +365,11 @@ static VOID FspVolumeDeleteDelayed(PVOID Context)
|
||||
IoReleaseVpbSpinLock(Irql);
|
||||
if (DeleteVpb)
|
||||
{
|
||||
FspDeviceGlobalLock();
|
||||
FspFreeExternal(FsvolDeviceExtension->SwapVpb);
|
||||
FsvolDeviceExtension->SwapVpb = 0;
|
||||
FspDeviceDereference(FsvolDeviceObject);
|
||||
FspDeviceGlobalUnlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -357,6 +380,16 @@ static VOID FspVolumeDeleteDelayed(PVOID Context)
|
||||
|
||||
NTSTATUS FspVolumeMount(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
NTSTATUS Result;
|
||||
FspDeviceGlobalLock();
|
||||
Result = FspVolumeMountNoLock(FsctlDeviceObject, Irp, IrpSp);
|
||||
FspDeviceGlobalUnlock();
|
||||
return Result;
|
||||
}
|
||||
|
||||
static NTSTATUS FspVolumeMountNoLock(
|
||||
PDEVICE_OBJECT FsctlDeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp)
|
||||
{
|
||||
// !PAGED_CODE();
|
||||
|
||||
@ -386,14 +419,12 @@ NTSTATUS FspVolumeMount(
|
||||
FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||
if (FsvolDeviceExtension->FsvrtDeviceObject == FsvrtDeviceObject)
|
||||
{
|
||||
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->DeleteResource, TRUE);
|
||||
if (!FspIoqStopped(FsvolDeviceExtension->Ioq))
|
||||
{
|
||||
Result = STATUS_SUCCESS;
|
||||
/* break out of the loop without FspDeviceDereference or DeleteResource release! */
|
||||
/* break out of the loop without FspDeviceDereference */
|
||||
break;
|
||||
}
|
||||
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
||||
}
|
||||
}
|
||||
FspDeviceDereference(DeviceObjects[i]);
|
||||
@ -405,10 +436,10 @@ NTSTATUS FspVolumeMount(
|
||||
|
||||
/*
|
||||
* At this point the volume device object we are going to use in the VPB
|
||||
* has been FspDeviceReference'ed and the volume DeleteResource has been acquired.
|
||||
* has been FspDeviceReference'd.
|
||||
*
|
||||
* We will increment the VPB's ReferenceCount so that we can do a delayed delete
|
||||
* of the volume device later on. Once done with the VPB we can release the
|
||||
* DeleteResource. [The volume device remains FspDeviceReference'ed!]
|
||||
* of the volume device later on.
|
||||
*/
|
||||
ASSERT(0 != FsvolDeviceObject && 0 != FsvolDeviceExtension);
|
||||
IoAcquireVpbSpinLock(&Irql);
|
||||
@ -417,9 +448,6 @@ NTSTATUS FspVolumeMount(
|
||||
Vpb->SerialNumber = FsvolDeviceExtension->VolumeParams.VolumeSerialNumber;
|
||||
IoReleaseVpbSpinLock(Irql);
|
||||
|
||||
/* done with mounting; release the DeleteResource */
|
||||
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
||||
|
||||
Irp->IoStatus.Information = 0;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
@ -449,9 +477,6 @@ NTSTATUS FspVolumeRedirQueryPathEx(
|
||||
NTSTATUS Result;
|
||||
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FsvolDeviceObject);
|
||||
|
||||
/* acquire our DeleteResource */
|
||||
ExAcquireResourceExclusiveLite(&FsvolDeviceExtension->DeleteResource, TRUE);
|
||||
|
||||
Result = STATUS_BAD_NETWORK_PATH;
|
||||
if (!FspIoqStopped(FsvolDeviceExtension->Ioq))
|
||||
{
|
||||
@ -469,9 +494,6 @@ NTSTATUS FspVolumeRedirQueryPathEx(
|
||||
}
|
||||
}
|
||||
|
||||
/* release the DeleteResource */
|
||||
ExReleaseResourceLite(&FsvolDeviceExtension->DeleteResource);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user