https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7a6e9bcdf62e24411780c…
commit 7a6e9bcdf62e24411780c03d565097c5051fc06b
Author: Trevor Thompson <tmt256(a)email.vccs.edu>
AuthorDate: Fri Jul 8 11:59:25 2016 +0000
[NTFS]
Simplify GetLastClusterInDataRun() and clean up NtfsAllocateClusters(). No functional
changes.
svn path=/branches/GSoC_2016/NTFS/; revision=71857
---
drivers/filesystems/ntfs/attrib.c | 18 +++-----------
drivers/filesystems/ntfs/volinfo.c | 49 ++++++++++++++++++--------------------
2 files changed, 26 insertions(+), 41 deletions(-)
diff --git a/drivers/filesystems/ntfs/attrib.c b/drivers/filesystems/ntfs/attrib.c
index e8625903bc..80022f5957 100644
--- a/drivers/filesystems/ntfs/attrib.c
+++ b/drivers/filesystems/ntfs/attrib.c
@@ -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;
diff --git a/drivers/filesystems/ntfs/volinfo.c b/drivers/filesystems/ntfs/volinfo.c
index 0a54cf73b8..68a1050620 100644
--- a/drivers/filesystems/ntfs/volinfo.c
+++ b/drivers/filesystems/ntfs/volinfo.c
@@ -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);