[FASTFAT] Use the FastFAT mechanism for counting clusters already implemented
authorPierre Schweitzer <pierre@reactos.org>
Sat, 9 Jun 2018 16:21:32 +0000 (18:21 +0200)
committerPierre Schweitzer <pierre@reactos.org>
Sat, 9 Jun 2018 16:23:07 +0000 (18:23 +0200)
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
drivers/filesystems/fastfat/fat.c
drivers/filesystems/fastfat/finfo.c
drivers/filesystems/fastfat/fsctl.c
drivers/filesystems/fastfat/rw.c
drivers/filesystems/fastfat/vfat.h

index ac1b7a5..b4a2a94 100644 (file)
@@ -670,6 +670,11 @@ FATAddEntry(
                 }
                 return STATUS_DISK_FULL;
             }
                 }
                 return STATUS_DISK_FULL;
             }
+
+            if (DeviceExt->FatInfo.FatType == FAT32)
+            {
+                FAT32UpdateFreeClustersCount(DeviceExt);
+            }
         }
         else
         {
         }
         else
         {
@@ -1021,20 +1026,17 @@ FATDelEntry(
     /* In case of moving, don't delete data */
     if (MoveContext == NULL)
     {
     /* 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;
         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);
         }
     }
 
         }
     }
 
index b291ff2..5842091 100644 (file)
@@ -557,7 +557,10 @@ CountAvailableClusters(
         else
             Status = FAT32CountAvailableClusters(DeviceExt);
     }
         else
             Status = FAT32CountAvailableClusters(DeviceExt);
     }
-    Clusters->QuadPart = DeviceExt->AvailableClusters;
+    if (Clusters != NULL)
+    {
+        Clusters->QuadPart = DeviceExt->AvailableClusters;
+    }
     ExReleaseResourceLite (&DeviceExt->FatResource);
 
     return Status;
     ExReleaseResourceLite (&DeviceExt->FatResource);
 
     return Status;
@@ -1214,9 +1217,7 @@ FAT32SetDirtyStatus(
 
 NTSTATUS
 FAT32UpdateFreeClustersCount(
 
 NTSTATUS
 FAT32UpdateFreeClustersCount(
-    PDEVICE_EXTENSION DeviceExt,
-    ULONG Count,
-    BOOLEAN Freed)
+    PDEVICE_EXTENSION DeviceExt)
 {
     LARGE_INTEGER Offset;
     ULONG Length;
 {
     LARGE_INTEGER Offset;
     ULONG Length;
@@ -1227,6 +1228,11 @@ FAT32UpdateFreeClustersCount(
 #endif
     struct _FsInfoSector * Sector;
 
 #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;
     /* 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 */
     }
 
     /* 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 */
 
 #ifndef VOLUME_IS_NOT_CACHED_WORK_AROUND_IT
     /* Mark FSINFO sector dirty so that it gets written to the disk */
index 2840b13..517d738 100644 (file)
@@ -1344,8 +1344,6 @@ VfatSetAllocationSizeInformation(
     }
     else if (NewSize + ClusterSize <= Fcb->RFCB.AllocationSize.u.LowPart)
     {
     }
     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))
         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;
         }
 
             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;
         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
         }
     }
     else
index 486535d..b849bf4 100644 (file)
@@ -737,6 +737,7 @@ VfatMount(
     _SEH2_END;
 
     DeviceExt->LastAvailableCluster = 2;
     _SEH2_END;
 
     DeviceExt->LastAvailableCluster = 2;
+    CountAvailableClusters(DeviceExt, NULL);
     ExInitializeResourceLite(&DeviceExt->FatResource);
 
     InitializeListHead(&DeviceExt->FcbListHead);
     ExInitializeResourceLite(&DeviceExt->FatResource);
 
     InitializeListHead(&DeviceExt->FcbListHead);
index d78054e..60713e1 100644 (file)
@@ -540,11 +540,6 @@ VfatWriteFileData(
         }
     }
 
         }
     }
 
-    if (NT_SUCCESS(Status) && ClusterCount != 0 && DeviceExt->FatInfo.FatType == FAT32)
-    {
-        FAT32UpdateFreeClustersCount(DeviceExt, ClusterCount, FALSE);
-    }
-
     return Status;
 }
 
     return Status;
 }
 
index 64a9679..bec3dc8 100644 (file)
@@ -931,9 +931,7 @@ FAT32SetDirtyStatus(
 
 NTSTATUS
 FAT32UpdateFreeClustersCount(
 
 NTSTATUS
 FAT32UpdateFreeClustersCount(
-    PDEVICE_EXTENSION DeviceExt,
-    ULONG Count,
-    BOOLEAN Freed);
+    PDEVICE_EXTENSION DeviceExt);
 
 /* fcb.c */
 
 
 /* fcb.c */