mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[NTOSKRNL] Use better locking for private cache map in CcRosReleaseFileCache().
Suggested by Thomas
This commit is contained in:
parent
c5139563db
commit
fc4744da5f
1 changed files with 15 additions and 15 deletions
|
@ -1171,6 +1171,8 @@ CcRosReleaseFileCache (
|
|||
* has been closed.
|
||||
*/
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PPRIVATE_CACHE_MAP PrivateMap;
|
||||
PROS_SHARED_CACHE_MAP SharedCacheMap;
|
||||
|
||||
KeAcquireGuardedMutex(&ViewLock);
|
||||
|
@ -1178,27 +1180,25 @@ CcRosReleaseFileCache (
|
|||
if (FileObject->SectionObjectPointer->SharedCacheMap != NULL)
|
||||
{
|
||||
SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||
if (FileObject->PrivateCacheMap != NULL)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PPRIVATE_CACHE_MAP PrivateMap;
|
||||
|
||||
/* Closing the handle, so kill the private cache map */
|
||||
PrivateMap = FileObject->PrivateCacheMap;
|
||||
|
||||
/* Remove it from the file */
|
||||
KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
|
||||
RemoveEntryList(&PrivateMap->PrivateLinks);
|
||||
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
|
||||
|
||||
/* And free it.
|
||||
/* Closing the handle, so kill the private cache map
|
||||
* Before you event try to remove it from FO, always
|
||||
* lock the master lock, to be sure not to race
|
||||
* with a potential read ahead ongoing!
|
||||
*/
|
||||
OldIrql = KeAcquireQueuedSpinLock(LockQueueMasterLock);
|
||||
PrivateMap = FileObject->PrivateCacheMap;
|
||||
FileObject->PrivateCacheMap = NULL;
|
||||
KeReleaseQueuedSpinLock(LockQueueMasterLock, OldIrql);
|
||||
|
||||
if (PrivateMap != NULL)
|
||||
{
|
||||
/* Remove it from the file */
|
||||
KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql);
|
||||
RemoveEntryList(&PrivateMap->PrivateLinks);
|
||||
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
|
||||
|
||||
/* And free it. */
|
||||
ExFreePoolWithTag(PrivateMap, TAG_PRIVATE_CACHE_MAP);
|
||||
|
||||
if (SharedCacheMap->OpenCount > 0)
|
||||
|
|
Loading…
Reference in a new issue