[ros-diffs] [arty] 35859: Enable and fix up lazy write thread, reattach completion routine for simple read and write functions. Fat write works, and produces a correct volume.

arty at svn.reactos.org arty at svn.reactos.org
Mon Sep 1 17:19:13 CEST 2008


Author: arty
Date: Mon Sep  1 10:19:13 2008
New Revision: 35859

URL: http://svn.reactos.org/svn/reactos?rev=35859&view=rev
Log:
Enable and fix up lazy write thread, reattach completion routine for
simple read and write functions.  Fat write works, and produces a correct
volume.

Modified:
    branches/arty-newcc/ntoskrnl/cache/cachesub.c
    branches/arty-newcc/ntoskrnl/cache/fssup.c
    branches/arty-newcc/ntoskrnl/cache/lazyrite.c
    branches/arty-newcc/ntoskrnl/cache/pinsup.c
    branches/arty-newcc/ntoskrnl/mm/section.c

Modified: branches/arty-newcc/ntoskrnl/cache/cachesub.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/cachesub.c?rev=35859&r1=35858&r2=35859&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/cache/cachesub.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/cache/cachesub.c [iso-8859-1] Mon Sep  1 10:19:13 2008
@@ -23,6 +23,32 @@
 
 NTSTATUS
 NTAPI
+CcpSimpleWriteComplete
+(PDEVICE_OBJECT DeviceObject,
+ PIRP Irp,
+ PVOID Context)
+{
+    /* Unlock MDL Pages, page 167. */
+    PMDL Mdl = Irp->MdlAddress;
+    while (Mdl)
+    {
+		MmUnlockPages(Mdl);
+        Mdl = Mdl->Next;
+    }
+	
+    /* Check if there's an MDL */
+    while ((Mdl = Irp->MdlAddress))
+    {
+        /* Clear all of them */
+        Irp->MdlAddress = Mdl->Next;
+        IoFreeMdl(Mdl);
+    }
+
+	return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
 CcpSimpleWrite
 (PFILE_OBJECT FileObject,
  PLARGE_INTEGER FileOffset,
@@ -71,12 +97,13 @@
 	Irp->Flags |= IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO | IRP_NOCACHE;
 	
 	ObReferenceObject(FileObject);
-	
+
 	Irp->UserEvent = &ReadWait;
 	Irp->Tail.Overlay.OriginalFileObject = FileObject;
 	Irp->Tail.Overlay.Thread = PsGetCurrentThread();
 	IrpSp = IoGetNextIrpStackLocation(Irp);
 	IrpSp->FileObject = FileObject;
+	IrpSp->CompletionRoutine = CcpSimpleWriteComplete;
 	
 	Status = IoCallDriver(DeviceObject, Irp);
 	if (Status == STATUS_PENDING)
@@ -182,6 +209,7 @@
 	PNOCC_BCB Bcb;
 	LARGE_INTEGER ToWrite = *FileOffset;
 	IO_STATUS_BLOCK IOSB;
+	PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)SectionObjectPointer->SharedCacheMap;
 
 	if (!SectionObjectPointer->SharedCacheMap)
 	{
@@ -194,15 +222,17 @@
 	}
 
 	BOOLEAN Result = CcpMapData
-		((PNOCC_CACHE_MAP)SectionObjectPointer->SharedCacheMap,
+		(Map,
 		 FileOffset,
 		 Length,
 		 PIN_WAIT,
 		 (PVOID *)&Bcb,
 		 &Buffer);
 
-	if (!Result) return;
-
+	/* Don't flush a pinned bcb, because we'll disturb the locked-ness
+	 * of the pages.  Figured out how to do this right. */
+	if (!Result || Bcb->Pinned || !Bcb->Dirty) return;
+	
 	BufStart = (PCHAR)PAGE_ROUND_DOWN(((ULONG_PTR)Buffer));
 	ToWrite.LowPart = PAGE_ROUND_DOWN(FileOffset->LowPart);
 
@@ -220,20 +250,19 @@
 	    ToWrite.QuadPart += PAGE_SIZE;
 	}
 
-	DPRINT
-	    ("Page Write: %08x\n", IOSB.Status);
-
-	CcUnpinData(Bcb);
+	Bcb->Dirty = FALSE;
+
+	DPRINT("Page Write: %08x\n", IOSB.Status);
 
 	if (IoStatus && NT_SUCCESS(IOSB.Status))
 	{
-		IoStatus->Status = STATUS_SUCCESS;
-		IoStatus->Information = Length;
+	    IoStatus->Status = STATUS_SUCCESS;
+	    IoStatus->Information = Length;
 	}
 	else if (IoStatus)
 	{
-		IoStatus->Status = IOSB.Status;
-		IoStatus->Information = 0;
+	    IoStatus->Status = IOSB.Status;
+	    IoStatus->Information = 0;
 	}
 }
 

Modified: branches/arty-newcc/ntoskrnl/cache/fssup.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/fssup.c?rev=35859&r1=35858&r2=35859&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/cache/fssup.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/cache/fssup.c [iso-8859-1] Mon Sep  1 10:19:13 2008
@@ -59,7 +59,6 @@
 		KEBUGCHECK(0);
 	}
 
-#if 0
 	Status = PsCreateSystemThread
 	    (&CcLazyWriteThreadHandle,
 	     THREAD_ALL_ACCESS,
@@ -68,7 +67,6 @@
 	     &CcLazyWriteThreadId,
 	     (PKSTART_ROUTINE) CcpLazyWriteThread,
 	     NULL);
-#endif
 
 	if (!NT_SUCCESS(Status))
 	{

Modified: branches/arty-newcc/ntoskrnl/cache/lazyrite.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/lazyrite.c?rev=35859&r1=35858&r2=35859&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/cache/lazyrite.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/cache/lazyrite.c [iso-8859-1] Mon Sep  1 10:19:13 2008
@@ -22,7 +22,7 @@
 CcpLazyWriteThread(PVOID Unused)
 {
     ULONG i;
-    BOOLEAN GotLock;
+    BOOLEAN GotLock, WasAlloc;
     PNOCC_BCB RealBcb;
     LARGE_INTEGER Interval;
     IO_STATUS_BLOCK IoStatus;
@@ -34,7 +34,12 @@
 	    RealBcb = &CcCacheSections[i];
 	    CcpLock(&CcMutex);
 	    GotLock = RealBcb->RefCount == 1;
-	    if (GotLock) RealBcb->RefCount++;
+	    WasAlloc = RtlTestBit(CcCacheBitmap, i);
+	    if (GotLock) 
+	    {
+		RtlSetBit(CcCacheBitmap, i);
+		RealBcb->RefCount++;
+	    }
 	    CcpUnlock(&CcMutex);
 	    // Pinned (temporarily)
 	    if (GotLock)
@@ -51,12 +56,15 @@
 		     IoStatus.Status,
 		     IoStatus.Information);
 
-		CcUnpinData(RealBcb);
+		CcpLock(&CcMutex);
+		RealBcb->RefCount--;
+		if (!WasAlloc) RtlClearBit(CcCacheBitmap, i);
+		CcpUnlock(&CcMutex);
 		DPRINT("CcpLazyWrite: done #%x\n", i);
 	    }
 	}
 	KeSetEvent(&CcpLazyWriteEvent, IO_DISK_INCREMENT, TRUE);
-	Interval.QuadPart = -1000000L;
+	Interval.QuadPart = -100000000L;
 	KeDelayExecutionThread(KernelMode, FALSE, &Interval);
     }
 }

Modified: branches/arty-newcc/ntoskrnl/cache/pinsup.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/cache/pinsup.c?rev=35859&r1=35858&r2=35859&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/cache/pinsup.c [iso-8859-1] Mon Sep  1 10:19:13 2008
@@ -691,6 +691,7 @@
 	    {
 		IoFreeMdl(TheBcb->Pinned);
 		TheBcb->Pinned = NULL;
+		TheBcb->Dirty = TRUE;
 		Result = FALSE;
 	    }
 	    _SEH_END;

Modified: branches/arty-newcc/ntoskrnl/mm/section.c
URL: http://svn.reactos.org/svn/reactos/branches/arty-newcc/ntoskrnl/mm/section.c?rev=35859&r1=35858&r2=35859&view=diff
==============================================================================
--- branches/arty-newcc/ntoskrnl/mm/section.c [iso-8859-1] (original)
+++ branches/arty-newcc/ntoskrnl/mm/section.c [iso-8859-1] Mon Sep  1 10:19:13 2008
@@ -183,6 +183,7 @@
     Irp->Tail.Overlay.Thread = PsGetCurrentThread();
     IrpSp = IoGetNextIrpStackLocation(Irp);
     IrpSp->FileObject = FileObject;
+    IrpSp->CompletionRoutine = MiSimpleReadComplete;
     
     Status = IoCallDriver(DeviceObject, Irp);
     if (Status == STATUS_PENDING)
@@ -267,6 +268,7 @@
     Irp->Tail.Overlay.Thread = PsGetCurrentThread();
     IrpSp = IoGetNextIrpStackLocation(Irp);
     IrpSp->FileObject = FileObject;
+    IrpSp->CompletionRoutine = MiSimpleReadComplete;
     
     Status = IoCallDriver(DeviceObject, Irp);
     if (Status == STATUS_PENDING)



More information about the Ros-diffs mailing list