Author: fireball
Date: Tue Oct 20 19:45:59 2009
New Revision: 43654
URL:
http://svn.reactos.org/svn/reactos?rev=43654&view=rev
Log:
[fastfat_new]
- Increase FCB's OpenCount when opening existing FCB too.
- Properly compare prefixes in FatInsertName.
- Fix a copypaste bug which resulted in an infinite loop while traversing a splay tree of
FCB names.
- Implement FatiQueryFsSizeInfo.
Modified:
trunk/reactos/drivers/filesystems/fastfat_new/fcb.c
trunk/reactos/drivers/filesystems/fastfat_new/volume.c
Modified: trunk/reactos/drivers/filesystems/fastfat_new/fcb.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/fcb.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/fcb.c [iso-8859-1] Tue Oct 20 19:45:59
2009
@@ -423,7 +423,8 @@
/* Clear the delay close */
ClearFlag(Fcb->State, FCB_STATE_DELAY_CLOSE);
- /* Increase global volume counter */
+ /* Increase counters */
+ Fcb->OpenCount++;
Vcb->OpenFileCount++;
// TODO: Handle DeleteOnClose and OpenedAsDos by storing those flags in CCB
@@ -895,8 +896,19 @@
NameLink = CONTAINING_RECORD(*RootNode, FCB_NAME_LINK, Links);
while (TRUE)
{
- /* Compare prefixes */
- Comparison = FatiCompareNames(&NameLink->Name.Ansi,
&Name->Name.Ansi);
+ /* Compare the prefix */
+ if (*(PUCHAR)NameLink->Name.Ansi.Buffer !=
*(PUCHAR)&Name->Name.Ansi.Buffer)
+ {
+ if (*(PUCHAR)NameLink->Name.Ansi.Buffer <
*(PUCHAR)&Name->Name.Ansi.Buffer)
+ Comparison = LessThan;
+ else
+ Comparison = GreaterThan;
+ }
+ else
+ {
+ /* Perform real comparison */
+ Comparison = FatiCompareNames(&NameLink->Name.Ansi,
&Name->Name.Ansi);
+ }
/* Check the bad case first */
if (Comparison == EqualTo)
@@ -912,7 +924,7 @@
if (!RtlLeftChild(&NameLink->Links))
{
/* It's absent, insert here and break */
- RtlInsertAsLeftChild(&NameLink->Links, &NameLink->Links);
+ RtlInsertAsLeftChild(&NameLink->Links, &Name->Links);
break;
}
else
Modified: trunk/reactos/drivers/filesystems/fastfat_new/volume.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/fastfa…
==============================================================================
--- trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/fastfat_new/volume.c [iso-8859-1] Tue Oct 20
19:45:59 2009
@@ -49,6 +49,36 @@
Buffer->VolumeLabelLength = Vcb->Vpb->VolumeLabelLength;
RtlCopyMemory(Buffer->VolumeLabel, Vcb->Vpb->VolumeLabel, ByteSize);
*Length -= ByteSize;
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+FatiQueryFsSizeInfo(PVCB Vcb,
+ PFILE_FS_SIZE_INFORMATION Buffer,
+ PLONG Length)
+{
+ FF_PARTITION *Partition;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ /* Deduct the minimum written length */
+ *Length -= sizeof(FILE_FS_SIZE_INFORMATION);
+
+ /* Zero it */
+ RtlZeroMemory(Buffer, sizeof(FILE_FS_SIZE_INFORMATION));
+
+ /* Reference FullFAT's partition */
+ Partition = Vcb->Ioman->pPartition;
+
+ /* Set values */
+ Buffer->AvailableAllocationUnits.LowPart = Partition->FreeClusterCount;
+ Buffer->TotalAllocationUnits.LowPart = Partition->NumClusters;
+ Buffer->SectorsPerAllocationUnit = Vcb->Bpb.SectorsPerCluster;
+ Buffer->BytesPerSector = Vcb->Bpb.BytesPerSector;
+
+ DPRINT1("Total %d, free %d, SPC %d, BPS %d\n",
Partition->FreeClusterCount,
+ Partition->NumClusters, Vcb->Bpb.SectorsPerCluster,
Vcb->Bpb.BytesPerSector);
return Status;
}
@@ -105,6 +135,10 @@
/* Call FsVolumeInfo handler */
Status = FatiQueryFsVolumeInfo(Vcb, Buffer, &Length);
break;
+ case FileFsSizeInformation:
+ /* Call FsVolumeInfo handler */
+ Status = FatiQueryFsSizeInfo(Vcb, Buffer, &Length);
+ break;
default:
DPRINT1("Volume information class %d is not supported!\n", InfoClass);
UNIMPLEMENTED;