mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 17:03:12 -05:00
sys: eliminate multiple uses of FspFsvolFileRename locking
This commit is contained in:
parent
342fd6a996
commit
4d3a169da6
@ -30,8 +30,7 @@ FSP_DRIVER_DISPATCH FspCleanup;
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
/* Cleanup */
|
/* Cleanup */
|
||||||
RequestDeviceObject = 0,
|
RequestIrp = 0,
|
||||||
RequestIrp = 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -81,10 +80,7 @@ static NTSTATUS FspFsvolCleanup(
|
|||||||
|
|
||||||
FspFileNodeCleanup(FileNode, FileObject, &DeletePending);
|
FspFileNodeCleanup(FileNode, FileObject, &DeletePending);
|
||||||
if (DeletePending)
|
if (DeletePending)
|
||||||
{
|
|
||||||
FspFsvolDeviceFileRenameAcquireShared(FsvolDeviceObject);
|
|
||||||
FspFileNodeAcquireExclusive(FileNode, Full);
|
FspFileNodeAcquireExclusive(FileNode, Full);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
FspFileNodeAcquireShared(FileNode, Full);
|
FspFileNodeAcquireShared(FileNode, Full);
|
||||||
|
|
||||||
@ -96,11 +92,6 @@ static NTSTATUS FspFsvolCleanup(
|
|||||||
Request->Req.Cleanup.UserContext2 = FileDesc->UserContext2;
|
Request->Req.Cleanup.UserContext2 = FileDesc->UserContext2;
|
||||||
Request->Req.Cleanup.Delete = DeletePending;
|
Request->Req.Cleanup.Delete = DeletePending;
|
||||||
|
|
||||||
if (DeletePending)
|
|
||||||
{
|
|
||||||
FspFsvolDeviceFileRenameSetOwner(FsvolDeviceObject, Request);
|
|
||||||
FspIopRequestContext(Request, RequestDeviceObject) = FsvolDeviceObject;
|
|
||||||
}
|
|
||||||
FspFileNodeSetOwner(FileNode, Full, Request);
|
FspFileNodeSetOwner(FileNode, Full, Request);
|
||||||
FspIopRequestContext(Request, RequestIrp) = Irp;
|
FspIopRequestContext(Request, RequestIrp) = Irp;
|
||||||
|
|
||||||
@ -134,7 +125,6 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
PDEVICE_OBJECT FsvolDeviceObject = Context[RequestDeviceObject];
|
|
||||||
PIRP Irp = Context[RequestIrp];
|
PIRP Irp = Context[RequestIrp];
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
@ -165,8 +155,6 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
|
|
||||||
if (DeletePending)
|
if (DeletePending)
|
||||||
{
|
{
|
||||||
ASSERT(0 != FsvolDeviceObject);
|
|
||||||
|
|
||||||
/* FileNode is Exclusive Full; release Pgio */
|
/* FileNode is Exclusive Full; release Pgio */
|
||||||
FspFileNodeReleaseOwner(FileNode, Pgio, Request);
|
FspFileNodeReleaseOwner(FileNode, Pgio, Request);
|
||||||
|
|
||||||
@ -174,8 +162,6 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ASSERT(0 == FsvolDeviceObject);
|
|
||||||
|
|
||||||
/* FileNode is Shared Full; reacquire as Exclusive Main for CcUnitializeCacheMap */
|
/* FileNode is Shared Full; reacquire as Exclusive Main for CcUnitializeCacheMap */
|
||||||
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
|
|
||||||
@ -208,9 +194,6 @@ static VOID FspFsvolCleanupRequestFini(FSP_FSCTL_TRANSACT_REQ *Request, PVOID Co
|
|||||||
|
|
||||||
/* this works correctly even if owner is current thread */
|
/* this works correctly even if owner is current thread */
|
||||||
FspFileNodeReleaseOwner(FileNode, Main, Request);
|
FspFileNodeReleaseOwner(FileNode, Main, Request);
|
||||||
|
|
||||||
if (DeletePending)
|
|
||||||
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, Request);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FspFsvolCleanupUninitialize(PVOID Context)
|
static VOID FspFsvolCleanupUninitialize(PVOID Context)
|
||||||
|
@ -752,7 +752,7 @@ typedef struct
|
|||||||
LONG OpenCount;
|
LONG OpenCount;
|
||||||
SHARE_ACCESS ShareAccess;
|
SHARE_ACCESS ShareAccess;
|
||||||
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT ContextByNameElementStorage;
|
||||||
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource */
|
/* locked under FSP_FSVOL_DEVICE_EXTENSION::FileRenameResource or Header.Resource */
|
||||||
UNICODE_STRING FileName;
|
UNICODE_STRING FileName;
|
||||||
PWSTR ExternalFileName;
|
PWSTR ExternalFileName;
|
||||||
/* locked under Header.Resource */
|
/* locked under Header.Resource */
|
||||||
|
@ -224,7 +224,7 @@ static NTSTATUS FspFsvolQueryNameInformation(PFILE_OBJECT FileObject,
|
|||||||
if ((PVOID)(Info + 1) > BufferEnd)
|
if ((PVOID)(Info + 1) > BufferEnd)
|
||||||
return STATUS_BUFFER_TOO_SMALL;
|
return STATUS_BUFFER_TOO_SMALL;
|
||||||
|
|
||||||
FspFsvolDeviceFileRenameAcquireShared(FsvolDeviceObject);
|
FspFileNodeAcquireShared(FileNode, Main);
|
||||||
|
|
||||||
Info->FileNameLength = FsvolDeviceExtension->VolumePrefix.Length + FileNode->FileName.Length;
|
Info->FileNameLength = FsvolDeviceExtension->VolumePrefix.Length + FileNode->FileName.Length;
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ static NTSTATUS FspFsvolQueryNameInformation(PFILE_OBJECT FileObject,
|
|||||||
RtlCopyMemory(Buffer, FileNode->FileName.Buffer, CopyLength);
|
RtlCopyMemory(Buffer, FileNode->FileName.Buffer, CopyLength);
|
||||||
Buffer += CopyLength;
|
Buffer += CopyLength;
|
||||||
|
|
||||||
FspFsvolDeviceFileRenameRelease(FsvolDeviceObject);
|
FspFileNodeRelease(FileNode, Main);
|
||||||
|
|
||||||
*PBuffer = Buffer;
|
*PBuffer = Buffer;
|
||||||
|
|
||||||
@ -715,7 +715,6 @@ static NTSTATUS FspFsvolSetDispositionInformation(
|
|||||||
/* cannot delete root directory */
|
/* cannot delete root directory */
|
||||||
return STATUS_CANNOT_DELETE;
|
return STATUS_CANNOT_DELETE;
|
||||||
|
|
||||||
FspFsvolDeviceFileRenameAcquireShared(FsvolDeviceObject);
|
|
||||||
FspFileNodeAcquireExclusive(FileNode, Full);
|
FspFileNodeAcquireExclusive(FileNode, Full);
|
||||||
|
|
||||||
if (Info->DeleteFile)
|
if (Info->DeleteFile)
|
||||||
@ -740,16 +739,13 @@ static NTSTATUS FspFsvolSetDispositionInformation(
|
|||||||
Request->Req.SetInformation.FileInformationClass = FileDispositionInformation;
|
Request->Req.SetInformation.FileInformationClass = FileDispositionInformation;
|
||||||
Request->Req.SetInformation.Info.Disposition.Delete = Info->DeleteFile;
|
Request->Req.SetInformation.Info.Disposition.Delete = Info->DeleteFile;
|
||||||
|
|
||||||
FspFsvolDeviceFileRenameSetOwner(FsvolDeviceObject, Request);
|
|
||||||
FspFileNodeSetOwner(FileNode, Full, Request);
|
FspFileNodeSetOwner(FileNode, Full, Request);
|
||||||
FspIopRequestContext(Request, RequestFileNode) = FileNode;
|
FspIopRequestContext(Request, RequestFileNode) = FileNode;
|
||||||
FspIopRequestContext(Request, RequestDeviceObject) = FsvolDeviceObject;
|
|
||||||
|
|
||||||
return FSP_STATUS_IOQ_POST;
|
return FSP_STATUS_IOQ_POST;
|
||||||
|
|
||||||
unlock_exit:
|
unlock_exit:
|
||||||
FspFileNodeRelease(FileNode, Full);
|
FspFileNodeRelease(FileNode, Full);
|
||||||
FspFsvolDeviceFileRenameRelease(FsvolDeviceObject);
|
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
@ -760,7 +756,6 @@ static NTSTATUS FspFsvolSetDispositionInformationSuccess(
|
|||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
|
||||||
PDEVICE_OBJECT FsvolDeviceObject = IrpSp->DeviceObject;
|
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PFILE_DISPOSITION_INFORMATION Info = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
|
PFILE_DISPOSITION_INFORMATION Info = (PFILE_DISPOSITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer;
|
||||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||||
@ -770,9 +765,7 @@ static NTSTATUS FspFsvolSetDispositionInformationSuccess(
|
|||||||
FileObject->DeletePending = Info->DeleteFile;
|
FileObject->DeletePending = Info->DeleteFile;
|
||||||
|
|
||||||
FspIopRequestContext(Request, RequestFileNode) = 0;
|
FspIopRequestContext(Request, RequestFileNode) = 0;
|
||||||
FspIopRequestContext(Request, RequestDeviceObject) = 0;
|
|
||||||
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
FspFileNodeReleaseOwner(FileNode, Full, Request);
|
||||||
FspFsvolDeviceFileRenameReleaseOwner(FsvolDeviceObject, Request);
|
|
||||||
|
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user