X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fcc%2Fpin.c;h=8b99b8c21088acfd0962fd9cbb8f7f6604889e32;hp=2d48a27a0aa56de7df7bb92ddb96fa3519d397e2;hb=469e15c7ae5d2b7dc266fdde7beb173d8263d563;hpb=a9f267778270a9c8585a1a77ca1c2a892e08deb9 diff --git a/ntoskrnl/cc/pin.c b/ntoskrnl/cc/pin.c index 2d48a27a0aa..8b99b8c2108 100644 --- a/ntoskrnl/cc/pin.c +++ b/ntoskrnl/cc/pin.c @@ -161,6 +161,7 @@ CcPinMappedData ( IN ULONG Flags, OUT PVOID * Bcb) { + PINTERNAL_BCB iBcb; PROS_SHARED_CACHE_MAP SharedCacheMap; CCTRACE(CC_API_DEBUG, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n", @@ -174,7 +175,21 @@ CcPinMappedData ( ASSERT(SharedCacheMap); ASSERT(SharedCacheMap->PinAccess); - /* no-op for current implementation. */ + iBcb = *Bcb; + ASSERT(iBcb->Pinned == FALSE); + + iBcb->Pinned = TRUE; + iBcb->Vacb->PinCount++; + + if (Flags & PIN_EXCLUSIVE) + { + ExAcquireResourceExclusiveLite(&iBcb->Lock, TRUE); + } + else + { + ExAcquireResourceSharedLite(&iBcb->Lock, TRUE); + } + return TRUE; } @@ -191,8 +206,6 @@ CcPinRead ( OUT PVOID * Bcb, OUT PVOID * Buffer) { - PINTERNAL_BCB iBcb; - CCTRACE(CC_API_DEBUG, "FileOffset=%p FileOffset=%p Length=%lu Flags=0x%lx\n", FileObject, FileOffset, Length, Flags); @@ -205,32 +218,20 @@ CcPinRead ( ++CcPinReadNoWait; } - if (CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer)) + /* Map first */ + if (!CcMapData(FileObject, FileOffset, Length, Flags, Bcb, Buffer)) { - if (CcPinMappedData(FileObject, FileOffset, Length, Flags, Bcb)) - { - iBcb = *Bcb; - - ASSERT(iBcb->Pinned == FALSE); - - iBcb->Pinned = TRUE; - iBcb->Vacb->PinCount++; - - if (Flags & PIN_EXCLUSIVE) - { - ExAcquireResourceExclusiveLite(&iBcb->Lock, TRUE); - } - else - { - ExAcquireResourceSharedLite(&iBcb->Lock, TRUE); - } + return FALSE; + } - return TRUE; - } - else - CcUnpinData(*Bcb); + /* Pin then */ + if (!CcPinMappedData(FileObject, FileOffset, Length, Flags, Bcb)) + { + CcUnpinData(*Bcb); + return FALSE; } - return FALSE; + + return TRUE; } /*