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/fastfat... ============================================================================== --- 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/fastfat... ============================================================================== --- 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;