X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Fcache%2Fpinsup.c;h=c2a463983060e061f07dcd76ee68204a2f4d3810;hp=5531bbb9720cdd20c7c69226a3630437e35faf51;hb=d758597cd4f5c758d8ba418e5ea7453d93e8d7a2;hpb=ad1b414a31641bdc1264bc18508af93c86602b2a diff --git a/reactos/ntoskrnl/cache/pinsup.c b/reactos/ntoskrnl/cache/pinsup.c index 5531bbb9720..c2a46398306 100644 --- a/reactos/ntoskrnl/cache/pinsup.c +++ b/reactos/ntoskrnl/cache/pinsup.c @@ -707,9 +707,9 @@ CcPreparePinWrite(IN PFILE_OBJECT FileObject, return Result; } -VOID +BOOLEAN NTAPI -CcpUnpinData(IN PNOCC_BCB RealBcb) +CcpUnpinData(IN PNOCC_BCB RealBcb, BOOLEAN ReleaseBit) { if (RealBcb->RefCount <= 2) { @@ -718,9 +718,11 @@ CcpUnpinData(IN PNOCC_BCB RealBcb) { DPRINT("Triggering exclusive waiter\n"); KeSetEvent(&RealBcb->ExclusiveWait, IO_NO_INCREMENT, FALSE); - return; + return TRUE; } } + if (RealBcb->RefCount == 2 && !ReleaseBit) + return FALSE; if (RealBcb->RefCount > 1) { DPRINT("Removing one reference #%x\n", RealBcb - CcCacheSections); @@ -730,6 +732,7 @@ CcpUnpinData(IN PNOCC_BCB RealBcb) if (RealBcb->RefCount == 1) { DPRINT("Clearing allocation bit #%x\n", RealBcb - CcCacheSections); + RtlClearBit(CcCacheBitmap, RealBcb - CcCacheSections); #ifdef PIN_WRITE_ONLY @@ -745,6 +748,8 @@ CcpUnpinData(IN PNOCC_BCB RealBcb) &OldProtect); #endif } + + return TRUE; } VOID @@ -753,13 +758,21 @@ CcUnpinData(IN PVOID Bcb) { PNOCC_BCB RealBcb = (PNOCC_BCB)Bcb; ULONG Selected = RealBcb - CcCacheSections; + BOOLEAN Released; ASSERT(RealBcb >= CcCacheSections && RealBcb - CcCacheSections < CACHE_NUM_SECTIONS); DPRINT("CcUnpinData Bcb #%x (RefCount %d)\n", Selected, RealBcb->RefCount); CcpLock(); - CcpUnpinData(RealBcb); + Released = CcpUnpinData(RealBcb, FALSE); CcpUnlock(); + + if (!Released) { + MiFlushMappedSection(RealBcb->BaseAddress, &RealBcb->FileOffset, &RealBcb->Map->FileSizes.FileSize, RealBcb->Dirty); + CcpLock(); + CcpUnpinData(RealBcb, TRUE); + CcpUnlock(); + } } VOID