mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 22:47:28 +00:00
[NTFS]
Simplify GetLastClusterInDataRun() and clean up NtfsAllocateClusters(). No functional changes. svn path=/branches/GSoC_2016/NTFS/; revision=71857
This commit is contained in:
parent
c08d37d182
commit
7a6e9bcdf6
|
@ -583,28 +583,16 @@ GetLastClusterInDataRun(PDEVICE_EXTENSION Vcb, PNTFS_ATTR_RECORD Attribute, PULO
|
||||||
{
|
{
|
||||||
DataRun = DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
|
DataRun = DecodeRun(DataRun, &DataRunOffset, &DataRunLength);
|
||||||
|
|
||||||
if (DataRunOffset == -1)
|
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
|
|
||||||
{
|
{
|
||||||
// Normal data run.
|
// Normal data run.
|
||||||
DataRunStartLCN = LastLCN + DataRunOffset;
|
DataRunStartLCN = LastLCN + DataRunOffset;
|
||||||
LastLCN = DataRunStartLCN;
|
LastLCN = DataRunStartLCN;
|
||||||
|
*LastCluster = LastLCN + DataRunLength - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*DataRun == 0)
|
if (*DataRun == 0)
|
||||||
{
|
|
||||||
*LastCluster = LastLCN + DataRunLength - 1;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
|
@ -162,38 +162,35 @@ NtfsAllocateClusters(PDEVICE_EXTENSION DeviceExt,
|
||||||
RtlInitializeBitMap(&Bitmap, (PULONG)BitmapData, DeviceExt->NtfsInfo.ClusterCount);
|
RtlInitializeBitMap(&Bitmap, (PULONG)BitmapData, DeviceExt->NtfsInfo.ClusterCount);
|
||||||
FreeClusters = RtlNumberOfClearBits(&Bitmap);
|
FreeClusters = RtlNumberOfClearBits(&Bitmap);
|
||||||
|
|
||||||
if (FreeClusters >= DesiredClusters)
|
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;
|
||||||
|
|
||||||
|
if (AssignedRun != 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
// TODO: Observe MFT reservation zone
|
*FirstAssignedCluster = AssignedRun;
|
||||||
|
*AssignedClusters = DesiredClusters;
|
||||||
// Can we get one contiguous run?
|
|
||||||
ULONG AssignedRun = RtlFindClearBitsAndSet(&Bitmap, DesiredClusters, FirstDesiredCluster);
|
|
||||||
ULONG LengthWritten;
|
|
||||||
|
|
||||||
if (AssignedRun != 0xFFFFFFFF)
|
|
||||||
{
|
|
||||||
*FirstAssignedCluster = AssignedRun;
|
|
||||||
*AssignedClusters = DesiredClusters;
|
|
||||||
}
|
|
||||||
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
|
else
|
||||||
Status = STATUS_DISK_FULL;
|
{
|
||||||
|
// 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);
|
||||||
|
|
||||||
ReleaseAttributeContext(DataContext);
|
ReleaseAttributeContext(DataContext);
|
||||||
|
|
||||||
ExFreePoolWithTag(BitmapData, TAG_NTFS);
|
ExFreePoolWithTag(BitmapData, TAG_NTFS);
|
||||||
|
|
Loading…
Reference in a new issue