https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6aa4beeefb2c2fbb025c5…
commit 6aa4beeefb2c2fbb025c5fb97cc74cd799c6622b
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Sat Jun 9 18:21:32 2018 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Sat Jun 9 18:23:07 2018 +0200
[FASTFAT] Use the FastFAT mechanism for counting clusters already implemented
This allows us having more accurate statistics regarding available clusters
count. Even though FastFAT and chkdsk still don't agree!
CORE-3877
---
drivers/filesystems/fastfat/dirwr.c | 12 +++++++-----
drivers/filesystems/fastfat/fat.c | 23 +++++++++++------------
drivers/filesystems/fastfat/finfo.c | 8 ++------
drivers/filesystems/fastfat/fsctl.c | 1 +
drivers/filesystems/fastfat/rw.c | 5 -----
drivers/filesystems/fastfat/vfat.h | 4 +---
6 files changed, 22 insertions(+), 31 deletions(-)
diff --git a/drivers/filesystems/fastfat/dirwr.c b/drivers/filesystems/fastfat/dirwr.c
index ac1b7a5549..b4a2a94b59 100644
--- a/drivers/filesystems/fastfat/dirwr.c
+++ b/drivers/filesystems/fastfat/dirwr.c
@@ -670,6 +670,11 @@ FATAddEntry(
}
return STATUS_DISK_FULL;
}
+
+ if (DeviceExt->FatInfo.FatType == FAT32)
+ {
+ FAT32UpdateFreeClustersCount(DeviceExt);
+ }
}
else
{
@@ -1021,20 +1026,17 @@ FATDelEntry(
/* In case of moving, don't delete data */
if (MoveContext == NULL)
{
- ULONG ClusterCount = 0;
-
while (CurrentCluster && CurrentCluster != 0xffffffff)
{
GetNextCluster(DeviceExt, CurrentCluster, &NextCluster);
/* FIXME: check status */
WriteCluster(DeviceExt, CurrentCluster, 0);
CurrentCluster = NextCluster;
- ClusterCount++;
}
- if (ClusterCount != 0 && DeviceExt->FatInfo.FatType == FAT32)
+ if (DeviceExt->FatInfo.FatType == FAT32)
{
- FAT32UpdateFreeClustersCount(DeviceExt, ClusterCount, TRUE);
+ FAT32UpdateFreeClustersCount(DeviceExt);
}
}
diff --git a/drivers/filesystems/fastfat/fat.c b/drivers/filesystems/fastfat/fat.c
index b291ff2843..5842091a30 100644
--- a/drivers/filesystems/fastfat/fat.c
+++ b/drivers/filesystems/fastfat/fat.c
@@ -557,7 +557,10 @@ CountAvailableClusters(
else
Status = FAT32CountAvailableClusters(DeviceExt);
}
- Clusters->QuadPart = DeviceExt->AvailableClusters;
+ if (Clusters != NULL)
+ {
+ Clusters->QuadPart = DeviceExt->AvailableClusters;
+ }
ExReleaseResourceLite (&DeviceExt->FatResource);
return Status;
@@ -1214,9 +1217,7 @@ FAT32SetDirtyStatus(
NTSTATUS
FAT32UpdateFreeClustersCount(
- PDEVICE_EXTENSION DeviceExt,
- ULONG Count,
- BOOLEAN Freed)
+ PDEVICE_EXTENSION DeviceExt)
{
LARGE_INTEGER Offset;
ULONG Length;
@@ -1227,6 +1228,11 @@ FAT32UpdateFreeClustersCount(
#endif
struct _FsInfoSector * Sector;
+ if (!DeviceExt->AvailableClustersValid)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
/* We'll read (and then write) the fsinfo sector */
Offset.QuadPart = DeviceExt->FatInfo.FSInfoSector *
DeviceExt->FatInfo.BytesPerSector;
Length = DeviceExt->FatInfo.BytesPerSector;
@@ -1275,14 +1281,7 @@ FAT32UpdateFreeClustersCount(
}
/* Update the free clusters count */
- if (Freed)
- {
- Sector->FreeCluster += Count;
- }
- else
- {
- Sector->FreeCluster -= Count;
- }
+ Sector->FreeCluster =
InterlockedCompareExchange((PLONG)&DeviceExt->AvailableClusters, 0, 0);
#ifndef VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
/* Mark FSINFO sector dirty so that it gets written to the disk */
diff --git a/drivers/filesystems/fastfat/finfo.c b/drivers/filesystems/fastfat/finfo.c
index 2840b1369b..517d7381d6 100644
--- a/drivers/filesystems/fastfat/finfo.c
+++ b/drivers/filesystems/fastfat/finfo.c
@@ -1344,8 +1344,6 @@ VfatSetAllocationSizeInformation(
}
else if (NewSize + ClusterSize <= Fcb->RFCB.AllocationSize.u.LowPart)
{
- ULONG ClusterCount;
-
DPRINT("Check for the ability to set file size\n");
if (!MmCanFileBeTruncated(FileObject->SectionObjectPointer,
(PLARGE_INTEGER)AllocationSize))
@@ -1393,18 +1391,16 @@ VfatSetAllocationSizeInformation(
Status = STATUS_SUCCESS;
}
- ClusterCount = 0;
while (NT_SUCCESS(Status) && 0xffffffff != Cluster && Cluster
> 1)
{
Status = NextCluster(DeviceExt, FirstCluster, &NCluster, FALSE);
WriteCluster(DeviceExt, Cluster, 0);
Cluster = NCluster;
- ClusterCount++;
}
- if (ClusterCount != 0 && DeviceExt->FatInfo.FatType == FAT32)
+ if (DeviceExt->FatInfo.FatType == FAT32)
{
- FAT32UpdateFreeClustersCount(DeviceExt, ClusterCount, TRUE);
+ FAT32UpdateFreeClustersCount(DeviceExt);
}
}
else
diff --git a/drivers/filesystems/fastfat/fsctl.c b/drivers/filesystems/fastfat/fsctl.c
index 486535d129..b849bf4119 100644
--- a/drivers/filesystems/fastfat/fsctl.c
+++ b/drivers/filesystems/fastfat/fsctl.c
@@ -737,6 +737,7 @@ VfatMount(
_SEH2_END;
DeviceExt->LastAvailableCluster = 2;
+ CountAvailableClusters(DeviceExt, NULL);
ExInitializeResourceLite(&DeviceExt->FatResource);
InitializeListHead(&DeviceExt->FcbListHead);
diff --git a/drivers/filesystems/fastfat/rw.c b/drivers/filesystems/fastfat/rw.c
index d78054eced..60713e104c 100644
--- a/drivers/filesystems/fastfat/rw.c
+++ b/drivers/filesystems/fastfat/rw.c
@@ -540,11 +540,6 @@ VfatWriteFileData(
}
}
- if (NT_SUCCESS(Status) && ClusterCount != 0 &&
DeviceExt->FatInfo.FatType == FAT32)
- {
- FAT32UpdateFreeClustersCount(DeviceExt, ClusterCount, FALSE);
- }
-
return Status;
}
diff --git a/drivers/filesystems/fastfat/vfat.h b/drivers/filesystems/fastfat/vfat.h
index 64a96796a0..bec3dc8394 100644
--- a/drivers/filesystems/fastfat/vfat.h
+++ b/drivers/filesystems/fastfat/vfat.h
@@ -931,9 +931,7 @@ FAT32SetDirtyStatus(
NTSTATUS
FAT32UpdateFreeClustersCount(
- PDEVICE_EXTENSION DeviceExt,
- ULONG Count,
- BOOLEAN Freed);
+ PDEVICE_EXTENSION DeviceExt);
/* fcb.c */