sys: eliminate multiple uses of FspFsvolFileRename locking

This commit is contained in:
Bill Zissimopoulos 2016-03-04 15:08:42 -08:00
parent 342fd6a996
commit 4d3a169da6
3 changed files with 4 additions and 28 deletions

View File

@ -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)

View File

@ -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 */

View File

@ -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;