Reactos
at master 162 lines 3.9 kB view raw
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 16extern PEXT2_GLOBAL Ext2Global; 17 18/* DEFINITIONS *************************************************************/ 19 20#define CMCB_DEBUG_LEVEL DL_NVR 21 22#ifdef __REACTOS__ 23BOOLEAN NTAPI 24#else 25BOOLEAN 26#endif 27Ext2AcquireForLazyWrite ( 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__ 59VOID NTAPI 60#else 61VOID 62#endif 63Ext2ReleaseFromLazyWrite (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__ 88BOOLEAN NTAPI 89#else 90BOOLEAN 91#endif 92Ext2AcquireForReadAhead (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__ 113VOID NTAPI 114#else 115VOID 116#endif 117Ext2ReleaseFromReadAhead (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__ 134BOOLEAN NTAPI 135#else 136BOOLEAN 137#endif 138Ext2NoOpAcquire ( 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__ 149VOID NTAPI 150#else 151VOID 152#endif 153Ext2NoOpRelease ( 154 IN PVOID Fcb 155) 156{ 157 ASSERT(IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); 158 IoSetTopLevelIrp( NULL ); 159 160 return; 161} 162