1 /* 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) 7 */ 8 9 /* INCLUDES ******************************************************************/ 10 #include "msfs.h" 11 12 #define NDEBUG 13 #include <debug.h> 14 15 /* FUNCTIONS *****************************************************************/ 16 17 VOID NTAPI 18 MsfsInsertIrp(PIO_CSQ Csq, PIRP Irp) 19 { 20 PMSFS_FCB Fcb; 21 22 Fcb = CONTAINING_RECORD(Csq, MSFS_FCB, CancelSafeQueue); 23 InsertTailList(&Fcb->PendingIrpQueue, &Irp->Tail.Overlay.ListEntry); 24 } 25 26 VOID NTAPI 27 MsfsRemoveIrp(PIO_CSQ Csq, PIRP Irp) 28 { 29 UNREFERENCED_PARAMETER(Csq); 30 31 RemoveEntryList(&Irp->Tail.Overlay.ListEntry); 32 } 33 34 PIRP NTAPI 35 MsfsPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext) 36 { 37 PMSFS_FCB Fcb; 38 PIRP NextIrp = NULL; 39 PLIST_ENTRY NextEntry, ListHead; 40 PIO_STACK_LOCATION Stack; 41 42 Fcb = CONTAINING_RECORD(Csq, MSFS_FCB, CancelSafeQueue); 43 44 ListHead = &Fcb->PendingIrpQueue; 45 46 if (Irp == NULL) 47 { 48 NextEntry = ListHead->Flink; 49 } 50 else 51 { 52 NextEntry = Irp->Tail.Overlay.ListEntry.Flink; 53 } 54 55 for (; NextEntry != ListHead; NextEntry = NextEntry->Flink) 56 { 57 NextIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry); 58 59 Stack = IoGetCurrentIrpStackLocation(NextIrp); 60 61 if (PeekContext) 62 { 63 if (Stack->FileObject == (PFILE_OBJECT)PeekContext) 64 { 65 break; 66 } 67 } 68 else 69 { 70 break; 71 } 72 73 NextIrp = NULL; 74 } 75 76 return NextIrp; 77 } 78 79 VOID NTAPI 80 MsfsAcquireLock(PIO_CSQ Csq, PKIRQL Irql) 81 { 82 PMSFS_FCB Fcb; 83 84 Fcb = CONTAINING_RECORD(Csq, MSFS_FCB, CancelSafeQueue); 85 KeAcquireSpinLock(&Fcb->QueueLock, Irql); 86 } 87 88 89 VOID NTAPI 90 MsfsReleaseLock(PIO_CSQ Csq, KIRQL Irql) 91 { 92 PMSFS_FCB Fcb; 93 94 Fcb = CONTAINING_RECORD(Csq, MSFS_FCB, CancelSafeQueue); 95 KeReleaseSpinLock(&Fcb->QueueLock, Irql); 96 } 97 98 VOID NTAPI 99 MsfsCompleteCanceledIrp(PIO_CSQ Csq, PIRP Irp) 100 { 101 102 UNREFERENCED_PARAMETER(Csq); 103 104 Irp->IoStatus.Status = STATUS_CANCELLED; 105 Irp->IoStatus.Information = 0; 106 IoCompleteRequest(Irp, IO_NO_INCREMENT); 107 } 108 109 VOID NTAPI 110 MsfsTimeout(PKDPC Dpc, 111 PVOID DeferredContext, 112 PVOID SystemArgument1, 113 PVOID SystemArgument2) 114 { 115 PMSFS_DPC_CTX Context; 116 PIRP Irp; 117 118 Context = (PMSFS_DPC_CTX)DeferredContext; 119 120 /* Try to get the IRP */ 121 Irp = IoCsqRemoveIrp(Context->Csq, &Context->CsqContext); 122 if (Irp != NULL) 123 { 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'); 128 } 129 else 130 { 131 /* We were racing with writing and failed, signal we're done */ 132 KeSetEvent(&Context->Event, IO_NO_INCREMENT, FALSE); 133 } 134 } 135 136 /* EOF */ 137