CcZeroData(): Fix ext2fsd.sys-v0.10a call on non-SharedCacheMapped object.
authorshort <>
Sat, 13 Sep 2003 05:59:11 +0000 (05:59 +0000)
committershort <>
Sat, 13 Sep 2003 05:59:11 +0000 (05:59 +0000)
src/libcaptive/cc/copy.c

index 97612ca..1020a6a 100644 (file)
@@ -129,7 +129,7 @@ BOOLEAN r;
 
 BOOLEAN CcZeroData(IN PFILE_OBJECT FileObject,IN PLARGE_INTEGER StartOffset,IN PLARGE_INTEGER EndOffset,IN BOOLEAN Wait)
 {
-CaptiveSharedCacheMapObject *SharedCacheMap;
+CaptiveSharedCacheMapObject *SharedCacheMap,*SharedCacheMap_orig;
 BOOLEAN r;
 
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"enter: CcZeroData: FileObject=0x%lX,StartOffset=0x%lX,EndOffset=0x%lX,Wait=%d",
@@ -144,18 +144,47 @@ BOOLEAN r;
        g_return_val_if_fail(StartOffset->QuadPart<=EndOffset->QuadPart,FALSE);
        g_return_val_if_fail((EndOffset->QuadPart-StartOffset->QuadPart)
                    ==(size_t)(EndOffset->QuadPart-StartOffset->QuadPart),FALSE);
-       g_return_val_if_fail(Wait==TRUE,FALSE);
-
-       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(StartOffset->QuadPart,PAGE_SIZE));   /* NOT YET IMPLEMENTED */
-       g_assert(0==CAPTIVE_ROUND_DOWN_EXCEEDING64(EndOffset->QuadPart,PAGE_SIZE));     /* NOT YET IMPLEMENTED */
-
-       SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+       /* 'Wait' may be FALSE; used by ext2fsd.sys-v0.10a. */
+
+       /* 'StartOffset' may not be PAGE_SIZE aligned */
+       /* 'EndOffset' may not be PAGE_SIZE aligned */
+
+       g_assert(FileObject->SectionObjectPointers);
+       if ((SharedCacheMap_orig=FileObject->SectionObjectPointers->SharedCacheMap))
+               SharedCacheMap=captive_FileObject_to_SharedCacheMap(FileObject);
+       else {
+CC_FILE_SIZES FileSizes;
+static const CACHE_MANAGER_CALLBACKS CallBacks;
+
+               /* ext2fsd.sys-v0.10a calls us on non-SharedCacheMapped object: */
+               FileSizes.AllocationSize=*EndOffset;
+               FileSizes.FileSize=*EndOffset;
+               FileSizes.ValidDataLength=*EndOffset;
+               SharedCacheMap=captive_shared_cache_map_get_ref(
+                               FileObject,     /* FileObject */
+                               &FileSizes,     /* FileSizes */
+                               FALSE,  /* PinAccess */
+                               &CallBacks,     /* CallBacks */
+                               NULL);  /* LazyWriterContext */
+               }
 
        captive_shared_cache_map_set_data_valid(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+       if (Wait)
+               captive_shared_cache_map_data_validate_read(SharedCacheMap,FileObject,StartOffset->QuadPart,EndOffset->QuadPart);
+       else {
+               captive_shared_cache_map_data_validate_noread(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+               }
        memset(captive_shared_cache_map_get_buffer(SharedCacheMap)+StartOffset->QuadPart,0,EndOffset->QuadPart-StartOffset->QuadPart);
        captive_shared_cache_map_set_dirty(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
        r=TRUE;
 
+       if (!SharedCacheMap_orig) {
+               captive_shared_cache_map_flush(SharedCacheMap,StartOffset->QuadPart,EndOffset->QuadPart);
+               g_object_unref(SharedCacheMap);
+               /* FIXME: Undo captive_shared_cache_map_get_ref:'Currently we never close it.' */
+               g_object_unref(SharedCacheMap);
+               }
+
        g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"leave: CcZeroData: r=%d",r);
 
        return r;