From: Pierre Schweitzer Date: Sun, 8 Apr 2018 16:45:38 +0000 (+0200) Subject: [NTOSKRNL] Map the VACB in kernel space before inserting it in lists. X-Git-Tag: 0.4.9-RC~179 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1b672981e2d2c5bd3d679b9f4adbb6e829075339 [NTOSKRNL] Map the VACB in kernel space before inserting it in lists. The avoids race conditions where attempts to read from disk to not fully initialized VACB were performed. Also, added more debug prints in such situations. CORE-14349 --- diff --git a/ntoskrnl/cc/copy.c b/ntoskrnl/cc/copy.c index c39b2148ec8..a70e0ab7664 100644 --- a/ntoskrnl/cc/copy.c +++ b/ntoskrnl/cc/copy.c @@ -110,6 +110,7 @@ CcReadVirtualAddress ( _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); + DPRINT1("MmProbeAndLockPages failed with: %lx for %p (%p, %p)\n", Status, Mdl, Vacb, Vacb->BaseAddress); KeBugCheck(CACHE_MANAGER); } _SEH2_END; @@ -186,6 +187,7 @@ CcWriteVirtualAddress ( _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { Status = _SEH2_GetExceptionCode(); + DPRINT1("MmProbeAndLockPages failed with: %lx for %p (%p, %p)\n", Status, Mdl, Vacb, Vacb->BaseAddress); KeBugCheck(CACHE_MANAGER); } _SEH2_END; diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index c835a03a8ec..1ec4c35b1fa 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -752,6 +752,17 @@ CcRosCreateVacb ( InitializeListHead(¤t->CacheMapVacbListEntry); InitializeListHead(¤t->DirtyVacbListEntry); InitializeListHead(¤t->VacbLruListEntry); + + CcRosVacbIncRefCount(current); + + Status = CcRosMapVacbInKernelSpace(current); + if (!NT_SUCCESS(Status)) + { + CcRosVacbDecRefCount(current); + ExFreeToNPagedLookasideList(&VacbLookasideList, current); + return Status; + } + CcRosAcquireVacbLock(current, NULL); KeAcquireGuardedMutex(&ViewLock); @@ -784,9 +795,10 @@ CcRosCreateVacb ( current); } #endif + CcRosVacbDecRefCount(*Vacb); CcRosReleaseVacbLock(*Vacb); KeReleaseGuardedMutex(&ViewLock); - ExFreeToNPagedLookasideList(&VacbLookasideList, *Vacb); + CcRosInternalFreeVacb(*Vacb); *Vacb = current; CcRosAcquireVacbLock(current, NULL); return STATUS_SUCCESS; @@ -813,7 +825,6 @@ CcRosCreateVacb ( } KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql); InsertTailList(&VacbLruListHead, ¤t->VacbLruListEntry); - CcRosVacbIncRefCount(current); KeReleaseGuardedMutex(&ViewLock); MI_SET_USAGE(MI_USAGE_CACHE); @@ -838,17 +849,6 @@ CcRosCreateVacb ( /* Reference it to allow release */ CcRosVacbIncRefCount(current); - Status = CcRosMapVacbInKernelSpace(current); - if (!NT_SUCCESS(Status)) - { - RemoveEntryList(¤t->CacheMapVacbListEntry); - RemoveEntryList(¤t->VacbLruListEntry); - CcRosReleaseVacb(SharedCacheMap, current, FALSE, - FALSE, FALSE); - CcRosVacbDecRefCount(current); - ExFreeToNPagedLookasideList(&VacbLookasideList, current); - } - return Status; }