From 7a6e9bcdf62e24411780c03d565097c5051fc06b Mon Sep 17 00:00:00 2001 From: Trevor Thompson Date: Fri, 8 Jul 2016 11:59:25 +0000 Subject: [PATCH 1/1] [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 e8625903bc4..80022f59573 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 0a54cf73b83..68a10506207 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); -- 2.17.1