[NTFS]
[reactos.git] / drivers / filesystems / ntfs / volinfo.c
index 0a54cf7..338ea84 100644 (file)
@@ -114,9 +114,11 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     PFILE_RECORD_HEADER BitmapRecord;
     PNTFS_ATTR_CONTEXT DataContext;
     ULONGLONG BitmapDataSize;
-    PCHAR BitmapData;
+    PUCHAR BitmapData;
     ULONGLONG FreeClusters = 0;
     RTL_BITMAP Bitmap;
+    ULONG AssignedRun;
+    ULONG LengthWritten;
 
     DPRINT1("NtfsAllocateClusters(%p, %lu, %lu, %p, %p)\n", DeviceExt, FirstDesiredCluster, DesiredClusters, FirstAssignedCluster, AssignedClusters);
 
@@ -162,38 +164,40 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     RtlInitializeBitMap(&Bitmap, (PULONG)BitmapData, DeviceExt->NtfsInfo.ClusterCount);
     FreeClusters = RtlNumberOfClearBits(&Bitmap);
 
-    if (FreeClusters >= DesiredClusters)
+    if (FreeClusters < DesiredClusters)
     {
-        // TODO: Observe MFT reservation zone
+        ReleaseAttributeContext(DataContext);
+
+        ExFreePoolWithTag(BitmapData, TAG_NTFS);
+        ExFreePoolWithTag(BitmapRecord, TAG_NTFS);
+        return STATUS_DISK_FULL;
+    }
+    
+    // TODO: Observe MFT reservation zone
 
-        // Can we get one contiguous run?
-        ULONG AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
-        ULONG LengthWritten;
+    // Can we get one contiguous run?
+    AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
 
-        if (AssignedRun != 0xFFFFFFFF)
+    if (AssignedRun != 0xFFFFFFFF)
+    {
+        *FirstAssignedCluster = AssignedRun;
+        *AssignedClusters = DesiredClusters;
+    }
+    else
+    {
+        // we can't get one contiguous run
+        *AssignedClusters = RtlFindNextForwardRunClear(&Bitmap, FirstDesiredCluster, FirstAssignedCluster);
+        
+        if (*AssignedClusters == 0)
         {
-            *FirstAssignedCluster = AssignedRun;
-            *AssignedClusters = DesiredClusters;
+            // we couldn't find any runs starting at DesiredFirstCluster
+            *AssignedClusters = RtlFindLongestRunClear(&Bitmap, FirstAssignedCluster);
         }
-        else
-        {
-            // we can't get one contiguous run
-            *AssignedClusters = RtlFindNextForwardRunClear(&Bitmap, FirstDesiredCluster, FirstAssignedCluster);
-        
-            if (*AssignedClusters == 0)
-            {
-                // we couldn't find any runs starting at DesiredFirstCluster
-                *AssignedClusters = RtlFindLongestRunClear(&Bitmap, FirstAssignedCluster);
-            }
             
-        }
-                
-        Status = WriteAttribute(DeviceExt, DataContext, 0, BitmapData, (ULONG)BitmapDataSize, &LengthWritten);
     }
-    else
-        Status = STATUS_DISK_FULL;
-
-
+                
+    Status = WriteAttribute(DeviceExt, DataContext, 0, BitmapData, (ULONG)BitmapDataSize, &LengthWritten);
+    
     ReleaseAttributeContext(DataContext);
 
     ExFreePoolWithTag(BitmapData, TAG_NTFS);