[NTFS]
authorTrevor Thompson <tmt256@email.vccs.edu>
Fri, 8 Jul 2016 11:59:25 +0000 (11:59 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 10 Dec 2017 10:13:54 +0000 (11:13 +0100)
Simplify GetLastClusterInDataRun() and clean up NtfsAllocateClusters(). No functional changes.

svn path=/branches/GSoC_2016/NTFS/; revision=71857

drivers/filesystems/ntfs/attrib.c
drivers/filesystems/ntfs/volinfo.c

index e862590..80022f5 100644 (file)
@@ -583,28 +583,16 @@ GetLastClusterInDataRun(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_RECORD Attribute, PULO
     {
         DataRun = DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
        
-        if (DataRunOffset == -1)
-        {
-            // sparse run
-            if (*DataRun == 0)
-            {
-                // if it's the last run, return the last cluster of the last run
-                *LastCluster = LastLCN + DataRunLength - 1;
-                break;
-            }
-        }
-        else
+        if (DataRunOffset != -1)
         {
             // Normal data run.
             DataRunStartLCN = LastLCN + DataRunOffset;
             LastLCN = DataRunStartLCN;
+            *LastCluster = LastLCN + DataRunLength - 1;
         }             
 
-        if (*DataRun == 0)
-        {
-            *LastCluster = LastLCN + DataRunLength - 1;
+        if (*DataRun == 0)            
             break;
-        }
     }
 
     return STATUS_SUCCESS;
index 0a54cf7..68a1050 100644 (file)
@@ -162,38 +162,35 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
     RtlInitializeBitMap(&Bitmap, (PULONG)BitmapData, DeviceExt->NtfsInfo.ClusterCount);
     FreeClusters = RtlNumberOfClearBits(&Bitmap);
 
-    if (FreeClusters >= DesiredClusters)
-    {
-        // TODO: Observe MFT reservation zone
+    if( FreeClusters < DesiredClusters )
+        Status = 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?
+    ULONG AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
+    ULONG LengthWritten;
 
-        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);