Synchronize up to trunk's revision r57689.
[reactos.git] / drivers / storage / classpnp / clntirp.c
1 /*++
2
3 Copyright (C) Microsoft Corporation, 1991 - 1999
4
5 Module Name:
6
7 clntirp.c
8
9 Abstract:
10
11 Client IRP queuing routines for CLASSPNP
12
13 Environment:
14
15 kernel mode only
16
17 Notes:
18
19
20 Revision History:
21
22 --*/
23
24 #include "classp.h"
25 #include "debug.h"
26
27 /*
28 * EnqueueDeferredClientIrp
29 *
30 * Note: we currently do not support Cancel for storage irps.
31 */
32 VOID NTAPI EnqueueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData, PIRP Irp)
33 {
34 KIRQL oldIrql;
35
36 KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql);
37 InsertTailList(&FdoData->DeferredClientIrpList, &Irp->Tail.Overlay.ListEntry);
38 KeReleaseSpinLock(&FdoData->SpinLock, oldIrql);
39 }
40
41
42 /*
43 * DequeueDeferredClientIrp
44 *
45 */
46 PIRP NTAPI DequeueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData)
47 {
48 KIRQL oldIrql;
49 PLIST_ENTRY listEntry;
50 PIRP irp;
51
52 KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql);
53 if (IsListEmpty(&FdoData->DeferredClientIrpList)){
54 listEntry = NULL;
55 }
56 else {
57 listEntry = RemoveHeadList(&FdoData->DeferredClientIrpList);
58 }
59 KeReleaseSpinLock(&FdoData->SpinLock, oldIrql);
60
61 if (listEntry == NULL) {
62 irp = NULL;
63 } else {
64 irp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry);
65 ASSERT(irp->Type == IO_TYPE_IRP);
66 InitializeListHead(&irp->Tail.Overlay.ListEntry);
67 }
68
69 return irp;
70 }