From e25b46f43ddb0128df300162dc67b547af429fe5 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 11 Sep 2013 17:10:30 +0000 Subject: [PATCH] [NPFS-NEW]: Use locking and IRP completion macros from NPFS snippet at "Common Driver Reliability Issues - Microsoft download.microsoft.com/download/5/7/7/577a5684-8a83.../drvqa.doc". Fix a few incorrect exclusive vs shared lock acquires. svn path=/trunk/; revision=60034 --- .../drivers/filesystems/npfs_new/cleanup.c | 23 ++----- reactos/drivers/filesystems/npfs_new/close.c | 23 ++----- reactos/drivers/filesystems/npfs_new/create.c | 50 ++++----------- .../drivers/filesystems/npfs_new/datasup.c | 26 +++----- .../drivers/filesystems/npfs_new/fileinfo.c | 28 +++------ .../drivers/filesystems/npfs_new/flushbuf.c | 4 +- reactos/drivers/filesystems/npfs_new/fsctrl.c | 59 +++++++----------- reactos/drivers/filesystems/npfs_new/main.c | 4 +- reactos/drivers/filesystems/npfs_new/npfs.h | 62 +++++++++++++++++-- reactos/drivers/filesystems/npfs_new/read.c | 24 ++----- reactos/drivers/filesystems/npfs_new/seinfo.c | 16 ++--- .../drivers/filesystems/npfs_new/statesup.c | 4 +- reactos/drivers/filesystems/npfs_new/write.c | 24 ++----- 13 files changed, 149 insertions(+), 198 deletions(-) diff --git a/reactos/drivers/filesystems/npfs_new/cleanup.c b/reactos/drivers/filesystems/npfs_new/cleanup.c index 55f1d55a4c6..2905587eb29 100644 --- a/reactos/drivers/filesystems/npfs_new/cleanup.c +++ b/reactos/drivers/filesystems/npfs_new/cleanup.c @@ -7,18 +7,16 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject, { PIO_STACK_LOCATION IoStack; NODE_TYPE_CODE NodeTypeCode; - LIST_ENTRY List; + LIST_ENTRY DeferredList; PNP_FCB Fcb; PNP_CCB Ccb; ULONG NamedPipeEnd; - PLIST_ENTRY ThisEntry, NextEntry; - PIRP LocalIrp; PAGED_CODE(); IoStack = IoGetCurrentIrpStackLocation(Irp); - InitializeListHead(&List); + InitializeListHead(&DeferredList); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); NodeTypeCode = NpDecodeFileObject(IoStack->FileObject, (PVOID*)&Fcb, &Ccb, @@ -31,20 +29,11 @@ NpCommonCleanup(IN PDEVICE_OBJECT DeviceObject, --Ccb->Fcb->ServerOpenCount; } - NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &List); + NpSetClosingPipeState(Ccb, Irp, NamedPipeEnd, &DeferredList); } - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); return STATUS_SUCCESS; } diff --git a/reactos/drivers/filesystems/npfs_new/close.c b/reactos/drivers/filesystems/npfs_new/close.c index cca905bf9e3..3a5c66d71af 100644 --- a/reactos/drivers/filesystems/npfs_new/close.c +++ b/reactos/drivers/filesystems/npfs_new/close.c @@ -7,18 +7,16 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject, { PIO_STACK_LOCATION IoStack; NODE_TYPE_CODE NodeTypeCode; - LIST_ENTRY List; + LIST_ENTRY DeferredList; PNP_FCB Fcb; PNP_CCB Ccb; ULONG NamedPipeEnd; - PLIST_ENTRY ThisEntry, NextEntry; - PIRP LocalIrp; PAGED_CODE(); IoStack = IoGetCurrentIrpStackLocation(Irp); - InitializeListHead(&List); + InitializeListHead(&DeferredList); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); NodeTypeCode = NpDecodeFileObject(IoStack->FileObject, (PVOID*)&Fcb, &Ccb, @@ -26,24 +24,15 @@ NpCommonClose(IN PDEVICE_OBJECT DeviceObject, if (NodeTypeCode == NPFS_NTC_ROOT_DCB) { --Fcb->CurrentInstances; - NpDeleteCcb(Ccb, &List); + NpDeleteCcb(Ccb, &DeferredList); } else if (NodeTypeCode == NPFS_NTC_VCB) { --NpVcb->ReferenceCount; } - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); diff --git a/reactos/drivers/filesystems/npfs_new/create.c b/reactos/drivers/filesystems/npfs_new/create.c index 1ecd11a8c41..649f2d3b2b9 100644 --- a/reactos/drivers/filesystems/npfs_new/create.c +++ b/reactos/drivers/filesystems/npfs_new/create.c @@ -205,12 +205,10 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject, PNP_FCB Fcb; PNP_DCB Dcb; ACCESS_MASK DesiredAccess; - LIST_ENTRY List; - PLIST_ENTRY NextEntry, ThisEntry; + LIST_ENTRY DeferredList; UNICODE_STRING Prefix; - PIRP ListIrp; - InitializeListHead(&List); + InitializeListHead(&DeferredList); IoStack = (PEXTENDED_IO_STACK_LOCATION)IoGetCurrentIrpStackLocation(Irp); FileObject = IoStack->FileObject; RelatedFileObject = FileObject->RelatedFileObject; @@ -240,7 +238,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb, FileObject, DesiredAccess, - &List); + &DeferredList); goto Quickie; } } @@ -255,7 +253,7 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus = NpOpenNamedPipeRootDirectory(NpVcb->RootDcb, FileObject, DesiredAccess, - &List); + &DeferredList); goto Quickie; } @@ -329,21 +327,11 @@ NpFsdCreate(IN PDEVICE_OBJECT DeviceObject, SL_FORCE_ACCESS_CHECK ? UserMode : Irp->RequestorMode, Irp->Tail.Overlay.Thread, - &List); + &DeferredList); Quickie: ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT); - } - + NpCompleteDeferredIrps(&DeferredList); FsRtlExitFileSystem(); IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -622,16 +610,14 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject, PFILE_OBJECT RelatedFileObject; USHORT Disposition, ShareAccess; PEPROCESS Process; - LIST_ENTRY LocalList; - PLIST_ENTRY NextEntry, ThisEntry; + LIST_ENTRY DeferredList; UNICODE_STRING FileName; PNP_FCB Fcb; UNICODE_STRING Prefix; PNAMED_PIPE_CREATE_PARAMETERS Parameters; IO_STATUS_BLOCK IoStatus; - PIRP ListIrp; - InitializeListHead(&LocalList); + InitializeListHead(&DeferredList); Process = IoGetRequestorProcess(Irp); IoStack = (PEXTENDED_IO_STACK_LOCATION) IoGetCurrentIrpStackLocation(Irp); @@ -650,7 +636,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject, IoStatus.Information = 0; FsRtlEnterFileSystem(); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); if (RelatedFileObject) { @@ -701,7 +687,7 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject, ShareAccess, Parameters, Process, - &LocalList, + &DeferredList, &IoStatus); goto Quickie; } @@ -731,21 +717,11 @@ NpFsdCreateNamedPipe(IN PDEVICE_OBJECT DeviceObject, ShareAccess, Parameters, Process, - &LocalList); + &DeferredList); Quickie: - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = LocalList.Flink; - while (NextEntry != &LocalList) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT); - } - + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); FsRtlExitFileSystem(); Irp->IoStatus = IoStatus; diff --git a/reactos/drivers/filesystems/npfs_new/datasup.c b/reactos/drivers/filesystems/npfs_new/datasup.c index 9dfaec1030b..74a193e3593 100644 --- a/reactos/drivers/filesystems/npfs_new/datasup.c +++ b/reactos/drivers/filesystems/npfs_new/datasup.c @@ -129,7 +129,7 @@ NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue, if (Irp && IoSetCancelRoutine(Irp, NULL)) { - Irp->Tail.Overlay.DriverContext[3] = 0; + Irp->Tail.Overlay.DriverContext[3] = NULL; } ExFreePool(QueueEntry); @@ -188,15 +188,13 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject, { PNP_DATA_QUEUE DataQueue; PNP_DATA_QUEUE_ENTRY DataEntry; - LIST_ENTRY List; + LIST_ENTRY DeferredList; PSECURITY_CLIENT_CONTEXT ClientSecurityContext; BOOLEAN CompleteWrites, FirstEntry; - PLIST_ENTRY NextEntry, ThisEntry; - PIRP LocalIrp; if (DeviceObject) IoReleaseCancelSpinLock(Irp->CancelIrql); - InitializeListHead(&List); + InitializeListHead(&DeferredList); DataQueue = (PNP_DATA_QUEUE)Irp->Tail.Overlay.DriverContext[2]; ClientSecurityContext = NULL; @@ -204,7 +202,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject, if (DeviceObject) { FsRtlEnterFileSystem(); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); } DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3]; @@ -245,18 +243,18 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject, { if (FirstEntry) { - NpGetNextRealDataQueueEntry(DataQueue, &List); + NpGetNextRealDataQueueEntry(DataQueue, &DeferredList); } if (CompleteWrites) { - NpCompleteStalledWrites(DataQueue, &List); + NpCompleteStalledWrites(DataQueue, &DeferredList); } } } if (DeviceObject) { - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); FsRtlExitFileSystem(); } @@ -266,15 +264,7 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Status = STATUS_CANCELLED; IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + NpCompleteDeferredIrps(&DeferredList); } NTSTATUS diff --git a/reactos/drivers/filesystems/npfs_new/fileinfo.c b/reactos/drivers/filesystems/npfs_new/fileinfo.c index cd05c7b154e..dfb7009d350 100644 --- a/reactos/drivers/filesystems/npfs_new/fileinfo.c +++ b/reactos/drivers/filesystems/npfs_new/fileinfo.c @@ -100,30 +100,18 @@ NpFsdSetInformation(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status; - LIST_ENTRY List; - PLIST_ENTRY NextEntry, ThisEntry; - PIRP LocalIrp; + LIST_ENTRY DeferredList; PAGED_CODE(); - InitializeListHead(&List); + InitializeListHead(&DeferredList); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); - Status = NpCommonSetInformation(DeviceObject, Irp, &List); - - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + Status = NpCommonSetInformation(DeviceObject, Irp, &DeferredList); + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); FsRtlExitFileSystem(); if (Status != STATUS_PENDING) @@ -462,11 +450,11 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject, PAGED_CODE(); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireSharedVcb(); Status = NpCommonQueryInformation(DeviceObject, Irp); - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); FsRtlExitFileSystem(); if (Status != STATUS_PENDING) diff --git a/reactos/drivers/filesystems/npfs_new/flushbuf.c b/reactos/drivers/filesystems/npfs_new/flushbuf.c index 68ab880c558..34bcf41f51f 100644 --- a/reactos/drivers/filesystems/npfs_new/flushbuf.c +++ b/reactos/drivers/filesystems/npfs_new/flushbuf.c @@ -59,11 +59,11 @@ NpFsdFlushBuffers(IN PDEVICE_OBJECT DeviceObject, PAGED_CODE(); FsRtlEnterFileSystem(); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireSharedVcb(); Status = NpCommonFlushBuffers(DeviceObject, Irp); - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); FsRtlExitFileSystem(); return Status; diff --git a/reactos/drivers/filesystems/npfs_new/fsctrl.c b/reactos/drivers/filesystems/npfs_new/fsctrl.c index 09d97d36f35..dfd3a5ab0de 100644 --- a/reactos/drivers/filesystems/npfs_new/fsctrl.c +++ b/reactos/drivers/filesystems/npfs_new/fsctrl.c @@ -569,35 +569,33 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject, { ULONG Fsctl; BOOLEAN Overflow = FALSE; - LIST_ENTRY List; - PLIST_ENTRY NextEntry, ThisEntry; + LIST_ENTRY DeferredList; NTSTATUS Status; - PIRP LocalIrp; PAGED_CODE(); - InitializeListHead(&List); + InitializeListHead(&DeferredList); Fsctl = IoGetCurrentIrpStackLocation(Irp)->Parameters.FileSystemControl.FsControlCode; switch (Fsctl) { case FSCTL_PIPE_PEEK: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); - Status = NpPeek(DeviceObject, Irp, &List); + NpAcquireExclusiveVcb(); + Status = NpPeek(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_INTERNAL_WRITE: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); - Status = NpInternalWrite(DeviceObject, Irp, &List); + NpAcquireSharedVcb(); + Status = NpInternalWrite(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_TRANSCEIVE: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); - Status = NpTransceive(DeviceObject, Irp, &List); + NpAcquireSharedVcb(); + Status = NpTransceive(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_INTERNAL_TRANSCEIVE: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); - Status = NpInternalTransceive(DeviceObject, Irp, &List); + NpAcquireSharedVcb(); + Status = NpInternalTransceive(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_INTERNAL_READ_OVFLOW: @@ -605,54 +603,54 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject, // on purpose case FSCTL_PIPE_INTERNAL_READ: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); - Status = NpInternalRead(DeviceObject, Irp, Overflow, &List); + NpAcquireSharedVcb(); + Status = NpInternalRead(DeviceObject, Irp, Overflow, &DeferredList); break; case FSCTL_PIPE_QUERY_CLIENT_PROCESS: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireSharedVcb(); Status = NpQueryClientProcess(DeviceObject, Irp); break; case FSCTL_PIPE_ASSIGN_EVENT: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpAssignEvent(DeviceObject, Irp); break; case FSCTL_PIPE_DISCONNECT: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); - Status = NpDisconnect(DeviceObject, Irp, &List); + NpAcquireExclusiveVcb(); + Status = NpDisconnect(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_LISTEN: - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); - Status = NpListen(DeviceObject, Irp, &List); + NpAcquireSharedVcb(); + Status = NpListen(DeviceObject, Irp, &DeferredList); break; case FSCTL_PIPE_QUERY_EVENT: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpQueryEvent(DeviceObject, Irp); break; case FSCTL_PIPE_WAIT: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpWaitForNamedPipe(DeviceObject, Irp); break; case FSCTL_PIPE_IMPERSONATE: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpImpersonate(DeviceObject, Irp); break; case FSCTL_PIPE_SET_CLIENT_PROCESS: - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpSetClientProcess(DeviceObject, Irp); break; @@ -660,17 +658,8 @@ NpCommonFileSystemControl(IN PDEVICE_OBJECT DeviceObject, return STATUS_NOT_SUPPORTED; } - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); return Status; } diff --git a/reactos/drivers/filesystems/npfs_new/main.c b/reactos/drivers/filesystems/npfs_new/main.c index a5c8748aec3..81f40aff935 100644 --- a/reactos/drivers/filesystems/npfs_new/main.c +++ b/reactos/drivers/filesystems/npfs_new/main.c @@ -40,8 +40,8 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = NpFsdFlushBuffers; DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] = NpFsdDirectoryControl; DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NpFsdFileSystemControl; - DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurity; - DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurity; + DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = NpFsdQuerySecurityInfo; + DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = NpFsdSetSecurityInfo; DriverObject->DriverUnload = NULL; diff --git a/reactos/drivers/filesystems/npfs_new/npfs.h b/reactos/drivers/filesystems/npfs_new/npfs.h index 87018022ef4..cd3bd9f8a92 100644 --- a/reactos/drivers/filesystems/npfs_new/npfs.h +++ b/reactos/drivers/filesystems/npfs_new/npfs.h @@ -263,6 +263,60 @@ typedef struct _NP_VCB extern PNP_VCB NpVcb; +// +// Functions to lock/unlock the global VCB lock +// +FORCEINLINE +VOID +NpAcquireSharedVcb(VOID) +{ + /* Acquire the lock in shared mode */ + ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); +} + +FORCEINLINE +VOID +NpAcquireExclusiveVcb(VOID) +{ + /* Acquire the lock in exclusive mode */ + ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); +} + +FORCEINLINE +VOID +NpReleaseVcb(VOID) +{ + /* Release the lock */ + ExReleaseResourceLite(&NpVcb->Lock); +} + +// +// Function to process deferred IRPs outside the VCB lock but still within the +// critical region +// +VOID +FORCEINLINE +NpCompleteDeferredIrps(IN PLIST_ENTRY DeferredList) +{ + PLIST_ENTRY ThisEntry, NextEntry; + PIRP Irp; + + /* Loop the list */ + ThisEntry = DeferredList->Flink; + while (ThisEntry != DeferredList) + { + /* Remember the next entry, but don't switch to it yet */ + NextEntry = ThisEntry->Flink; + + /* Complete the IRP for this entry */ + Irp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); + IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); + + /* And now switch to the next one */ + ThisEntry = NextEntry; + } +} + BOOLEAN NTAPI NpDeleteEventTableEntry(IN PRTL_GENERIC_TABLE Table, @@ -533,13 +587,13 @@ NpFsdQueryInformation(IN PDEVICE_OBJECT DeviceObject, NTSTATUS NTAPI -NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); +NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); NTSTATUS NTAPI -NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); +NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); NTSTATUS NTAPI diff --git a/reactos/drivers/filesystems/npfs_new/read.c b/reactos/drivers/filesystems/npfs_new/read.c index e67fba507ac..566f2b94927 100644 --- a/reactos/drivers/filesystems/npfs_new/read.c +++ b/reactos/drivers/filesystems/npfs_new/read.c @@ -142,37 +142,25 @@ NpFsdRead(IN PDEVICE_OBJECT DeviceObject, { PIO_STACK_LOCATION IoStack; IO_STATUS_BLOCK IoStatus; - LIST_ENTRY List; - PLIST_ENTRY NextEntry, ThisEntry; - PIRP LocalIrp; + LIST_ENTRY DeferredList; PAGED_CODE(); NpSlowReadCalls++; - InitializeListHead(&List); + InitializeListHead(&DeferredList); IoStack = IoGetCurrentIrpStackLocation(Irp); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireSharedVcb(); NpCommonRead(IoStack->FileObject, Irp->UserBuffer, IoStack->Parameters.Read.Length, &IoStatus, Irp, - &List); - - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - LocalIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(LocalIrp, IO_NAMED_PIPE_INCREMENT); - } + &DeferredList); + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); FsRtlExitFileSystem(); if (IoStatus.Status != STATUS_PENDING) diff --git a/reactos/drivers/filesystems/npfs_new/seinfo.c b/reactos/drivers/filesystems/npfs_new/seinfo.c index b2836716b85..2e7bd8894ac 100644 --- a/reactos/drivers/filesystems/npfs_new/seinfo.c +++ b/reactos/drivers/filesystems/npfs_new/seinfo.c @@ -78,18 +78,18 @@ NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject, NTSTATUS NTAPI -NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) +NpFsdQuerySecurityInfo(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { NTSTATUS Status; PAGED_CODE(); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpCommonQuerySecurityInfo(DeviceObject, Irp); - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); FsRtlExitFileSystem(); if (Status != STATUS_PENDING) @@ -103,18 +103,18 @@ NpFsdQuerySecurity(IN PDEVICE_OBJECT DeviceObject, NTSTATUS NTAPI -NpFsdSetSecurity(IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) +NpFsdSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { NTSTATUS Status; PAGED_CODE(); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); Status = NpCommonQuerySecurityInfo(DeviceObject, Irp); - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); FsRtlExitFileSystem(); if (Status != STATUS_PENDING) diff --git a/reactos/drivers/filesystems/npfs_new/statesup.c b/reactos/drivers/filesystems/npfs_new/statesup.c index 4544af8a993..9ed67f7cc24 100644 --- a/reactos/drivers/filesystems/npfs_new/statesup.c +++ b/reactos/drivers/filesystems/npfs_new/statesup.c @@ -6,12 +6,12 @@ NpCancelListeningQueueIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { FsRtlEnterFileSystem(); - ExAcquireResourceExclusiveLite(&NpVcb->Lock, TRUE); + NpAcquireExclusiveVcb(); RemoveEntryList(&Irp->Tail.Overlay.ListEntry); FsRtlExitFileSystem(); - ExReleaseResourceLite(&NpVcb->Lock); + NpReleaseVcb(); Irp->IoStatus.Status = STATUS_CANCELLED; IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); diff --git a/reactos/drivers/filesystems/npfs_new/write.c b/reactos/drivers/filesystems/npfs_new/write.c index b5a566a3fae..2776ab17c81 100644 --- a/reactos/drivers/filesystems/npfs_new/write.c +++ b/reactos/drivers/filesystems/npfs_new/write.c @@ -156,17 +156,15 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject, { PIO_STACK_LOCATION IoStack; IO_STATUS_BLOCK IoStatus; - LIST_ENTRY List; - PLIST_ENTRY NextEntry, ThisEntry; - PIRP ListIrp; + LIST_ENTRY DeferredList; PAGED_CODE(); NpSlowWriteCalls++; - InitializeListHead(&List); + InitializeListHead(&DeferredList); IoStack = IoGetCurrentIrpStackLocation(Irp); FsRtlEnterFileSystem(); - ExAcquireResourceSharedLite(&NpVcb->Lock, TRUE); + NpAcquireSharedVcb(); NpCommonWrite(IoStack->FileObject, Irp->UserBuffer, @@ -174,20 +172,10 @@ NpFsdWrite(IN PDEVICE_OBJECT DeviceObject, Irp->Tail.Overlay.Thread, &IoStatus, Irp, - &List); - - ExReleaseResourceLite(&NpVcb->Lock); - - NextEntry = List.Flink; - while (NextEntry != &List) - { - ThisEntry = NextEntry; - NextEntry = NextEntry->Flink; - - ListIrp = CONTAINING_RECORD(ThisEntry, IRP, Tail.Overlay.ListEntry); - IoCompleteRequest(ListIrp, IO_NAMED_PIPE_INCREMENT); - } + &DeferredList); + NpReleaseVcb(); + NpCompleteDeferredIrps(&DeferredList); FsRtlExitFileSystem(); if (IoStatus.Status != STATUS_PENDING)