1 /* 2 * COPYRIGHT: See COPYRIGHT.TXT 3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP 4 * FILE: cmcb.c 5 * PROGRAMMER: Matt Wu <mattwu@163.com> 6 * HOMEPAGE: http://www.ext2fsd.com 7 * UPDATE HISTORY: 8 */ 9 10 /* INCLUDES *****************************************************************/ 11 12 #include "ext2fs.h" 13 14 /* GLOBALS ***************************************************************/ 15 16 extern PEXT2_GLOBAL Ext2Global; 17 18 /* DEFINITIONS *************************************************************/ 19 20 #define CMCB_DEBUG_LEVEL DL_NVR 21 22 #ifdef __REACTOS__ 23 BOOLEAN NTAPI 24 #else 25 BOOLEAN 26 #endif 27 Ext2AcquireForLazyWrite ( 28 IN PVOID Context, 29 IN BOOLEAN Wait) 30 { 31 // 32 // On a readonly filesystem this function still has to exist but it 33 // doesn't need to do anything. 34 35 PEXT2_FCB Fcb; 36 37 Fcb = (PEXT2_FCB) Context; 38 ASSERT(Fcb != NULL); 39 ASSERT((Fcb->Identifier.Type == EXT2FCB) && 40 (Fcb->Identifier.Size == sizeof(EXT2_FCB))); 41 #if EXT2_DEBUG 42 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForLazyWrite: %s %s Fcb=%p\n", 43 Ext2GetCurrentProcessName(), "ACQUIRE_FOR_LAZY_WRITE", Fcb)); 44 #endif 45 if (!ExAcquireResourceExclusiveLite(Fcb->Header.Resource, Wait)) { 46 return FALSE; 47 } 48 49 ASSERT(Fcb->LazyWriterThread == NULL); 50 Fcb->LazyWriterThread = PsGetCurrentThread(); 51 52 ASSERT(IoGetTopLevelIrp() == NULL); 53 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 54 55 return TRUE; 56 } 57 58 #ifdef __REACTOS__ 59 VOID NTAPI 60 #else 61 VOID 62 #endif 63 Ext2ReleaseFromLazyWrite (IN PVOID Context) 64 { 65 // 66 // On a readonly filesystem this function still has to exist but it 67 // doesn't need to do anything. 68 PEXT2_FCB Fcb = (PEXT2_FCB) Context; 69 70 ASSERT(Fcb != NULL); 71 72 ASSERT((Fcb->Identifier.Type == EXT2FCB) && 73 (Fcb->Identifier.Size == sizeof(EXT2_FCB))); 74 #if EXT2_DEBUG 75 DEBUG(CMCB_DEBUG_LEVEL, ( "Ext2ReleaseFromLazyWrite: %s %s Fcb=%p\n", 76 Ext2GetCurrentProcessName(), "RELEASE_FROM_LAZY_WRITE", Fcb)); 77 #endif 78 ASSERT(Fcb->LazyWriterThread == PsGetCurrentThread()); 79 Fcb->LazyWriterThread = NULL; 80 81 ExReleaseResourceLite(Fcb->Header.Resource); 82 83 ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 84 IoSetTopLevelIrp( NULL ); 85 } 86 87 #ifdef __REACTOS__ 88 BOOLEAN NTAPI 89 #else 90 BOOLEAN 91 #endif 92 Ext2AcquireForReadAhead (IN PVOID Context, 93 IN BOOLEAN Wait) 94 { 95 PEXT2_FCB Fcb = (PEXT2_FCB) Context; 96 97 ASSERT(Fcb != NULL); 98 ASSERT((Fcb->Identifier.Type == EXT2FCB) && 99 (Fcb->Identifier.Size == sizeof(EXT2_FCB))); 100 101 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2AcquireForReadAhead: i=%xh Fcb=%p\n", 102 Fcb->Mcb->Inode.i_ino, Fcb)); 103 104 if (!ExAcquireResourceSharedLite(Fcb->Header.Resource, Wait)) 105 return FALSE; 106 ASSERT(IoGetTopLevelIrp() == NULL); 107 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 108 109 return TRUE; 110 } 111 112 #ifdef __REACTOS__ 113 VOID NTAPI 114 #else 115 VOID 116 #endif 117 Ext2ReleaseFromReadAhead (IN PVOID Context) 118 { 119 PEXT2_FCB Fcb = (PEXT2_FCB) Context; 120 121 ASSERT(Fcb != NULL); 122 123 ASSERT((Fcb->Identifier.Type == EXT2FCB) && 124 (Fcb->Identifier.Size == sizeof(EXT2_FCB))); 125 126 DEBUG(CMCB_DEBUG_LEVEL, ("Ext2ReleaseFromReadAhead: i=%xh Fcb=%p\n", 127 Fcb->Mcb->Inode.i_ino, Fcb)); 128 129 IoSetTopLevelIrp(NULL); 130 ExReleaseResourceLite(Fcb->Header.Resource); 131 } 132 133 #ifdef __REACTOS__ 134 BOOLEAN NTAPI 135 #else 136 BOOLEAN 137 #endif 138 Ext2NoOpAcquire ( 139 IN PVOID Fcb, 140 IN BOOLEAN Wait 141 ) 142 { 143 ASSERT(IoGetTopLevelIrp() == NULL); 144 IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 145 return TRUE; 146 } 147 148 #ifdef __REACTOS__ 149 VOID NTAPI 150 #else 151 VOID 152 #endif 153 Ext2NoOpRelease ( 154 IN PVOID Fcb 155 ) 156 { 157 ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 158 IoSetTopLevelIrp( NULL ); 159 160 return; 161 } 162 163