2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/filesystems/msfs/msfssup.c
5 * PURPOSE: Mailslot filesystem
6 * PROGRAMMER: Nikita Pechenkin (n.pechenkin@mail.ru)
9 /* INCLUDES ******************************************************************/
15 /* FUNCTIONS *****************************************************************/
18 MsfsInsertIrp(PIO_CSQ Csq
, PIRP Irp
)
22 Fcb
= CONTAINING_RECORD(Csq
, MSFS_FCB
, CancelSafeQueue
);
23 InsertTailList(&Fcb
->PendingIrpQueue
, &Irp
->Tail
.Overlay
.ListEntry
);
27 MsfsRemoveIrp(PIO_CSQ Csq
, PIRP Irp
)
29 UNREFERENCED_PARAMETER(Csq
);
31 RemoveEntryList(&Irp
->Tail
.Overlay
.ListEntry
);
35 MsfsPeekNextIrp(PIO_CSQ Csq
, PIRP Irp
, PVOID PeekContext
)
39 PLIST_ENTRY NextEntry
, ListHead
;
40 PIO_STACK_LOCATION Stack
;
42 Fcb
= CONTAINING_RECORD(Csq
, MSFS_FCB
, CancelSafeQueue
);
44 ListHead
= &Fcb
->PendingIrpQueue
;
48 NextEntry
= ListHead
->Flink
;
52 NextEntry
= Irp
->Tail
.Overlay
.ListEntry
.Flink
;
55 for (; NextEntry
!= ListHead
; NextEntry
= NextEntry
->Flink
)
57 NextIrp
= CONTAINING_RECORD(NextEntry
, IRP
, Tail
.Overlay
.ListEntry
);
59 Stack
= IoGetCurrentIrpStackLocation(NextIrp
);
63 if (Stack
->FileObject
== (PFILE_OBJECT
)PeekContext
)
80 MsfsAcquireLock(PIO_CSQ Csq
, PKIRQL Irql
)
84 Fcb
= CONTAINING_RECORD(Csq
, MSFS_FCB
, CancelSafeQueue
);
85 KeAcquireSpinLock(&Fcb
->QueueLock
, Irql
);
90 MsfsReleaseLock(PIO_CSQ Csq
, KIRQL Irql
)
94 Fcb
= CONTAINING_RECORD(Csq
, MSFS_FCB
, CancelSafeQueue
);
95 KeReleaseSpinLock(&Fcb
->QueueLock
, Irql
);
99 MsfsCompleteCanceledIrp(PIO_CSQ Csq
, PIRP Irp
)
102 UNREFERENCED_PARAMETER(Csq
);
104 Irp
->IoStatus
.Status
= STATUS_CANCELLED
;
105 Irp
->IoStatus
.Information
= 0;
106 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
110 MsfsTimeout(PKDPC Dpc
,
111 PVOID DeferredContext
,
112 PVOID SystemArgument1
,
113 PVOID SystemArgument2
)
115 PMSFS_DPC_CTX Context
;
118 Context
= (PMSFS_DPC_CTX
)DeferredContext
;
120 /* Try to get the IRP */
121 Irp
= IoCsqRemoveIrp(Context
->Csq
, &Context
->CsqContext
);
124 /* It timed out, complete it (it's ours) and free context */
125 Irp
->IoStatus
.Status
= STATUS_IO_TIMEOUT
;
126 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
127 ExFreePoolWithTag(Context
, 'NFsM');
131 /* We were racing with writing and failed, signal we're done */
132 KeSetEvent(&Context
->Event
, IO_NO_INCREMENT
, FALSE
);