Fragmented directories and crosslinking related fixes.

svn path=/trunk/; revision=1658
This commit is contained in:
Carl Nettelblad 2001-03-02 15:59:16 +00:00
parent d3e61a64dd
commit afe0e9f601
4 changed files with 65 additions and 10 deletions

View file

@ -1,4 +1,4 @@
/* $Id: create.c,v 1.16 2001/02/14 02:53:54 dwelch Exp $ /* $Id: create.c,v 1.17 2001/03/02 15:59:16 cnettel Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -93,7 +93,8 @@ GetEntryName (PVOID Block, PULONG _Offset, PWSTR Name, PULONG _jloop,
if (Offset == ENTRIES_PER_SECTOR) if (Offset == ENTRIES_PER_SECTOR)
{ {
Offset = 0; Offset = 0;
StartingSector++; //FIXME : nor always the next sector /* FIXME: Check status */
GetNextSector (DeviceExt, StartingSector, &StartingSector, FALSE);
jloop++; jloop++;
/* FIXME: Check status */ /* FIXME: Check status */
VfatReadSectors (DeviceExt->StorageDevice, VfatReadSectors (DeviceExt->StorageDevice,
@ -186,8 +187,9 @@ ReadVolumeLabel (PDEVICE_EXTENSION DeviceExt, PVPB Vpb)
/* not found in this sector, try next : */ /* not found in this sector, try next : */
/* directory can be fragmented although it is best to keep them /* directory can be fragmented although it is best to keep them
unfragmented */ unfragmented.*/
StartingSector++; StartingSector++;
if (DeviceExt->FatType == FAT32) if (DeviceExt->FatType == FAT32)
{ {
if (StartingSector == ClusterToSector (DeviceExt, NextCluster + 1)) if (StartingSector == ClusterToSector (DeviceExt, NextCluster + 1))
@ -313,9 +315,9 @@ FindFile (PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
i++; i++;
if (i == (ENTRIES_PER_SECTOR)) if (i == (ENTRIES_PER_SECTOR))
{ {
/* entry is in next sector */ /* FIXME: Check status */
StartingSector++; GetNextSector (DeviceExt, StartingSector, &StartingSector, FALSE);
/* FIXME : treat case of next sector fragmented */
/* FIXME: Check status */ /* FIXME: Check status */
VfatReadSectors (DeviceExt->StorageDevice, VfatReadSectors (DeviceExt->StorageDevice,
StartingSector, 1, block); StartingSector, 1, block);
@ -336,7 +338,8 @@ FindFile (PDEVICE_EXTENSION DeviceExt, PVFATFCB Fcb,
/* not found in this sector, try next : */ /* not found in this sector, try next : */
/* directory can be fragmented although it is best to keep them /* directory can be fragmented although it is best to keep them
unfragmented */ unfragmented. Should we change this to also use GetNextSector?
GetNextSector was originally implemented to handle the case above */
if (Entry) if (Entry)
*Entry = 0; *Entry = 0;
StartingSector++; StartingSector++;

View file

@ -1,5 +1,5 @@
/* /*
* $Id: fat.c,v 1.19 2001/03/01 07:48:17 dwelch Exp $ * $Id: fat.c,v 1.20 2001/03/02 15:59:16 cnettel Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -786,6 +786,7 @@ GetNextCluster (PDEVICE_EXTENSION DeviceExt,
{ {
NTSTATUS Status; NTSTATUS Status;
// DPRINT ("GetNextCluster(DeviceExt %x, CurrentCluster %x)\n", // DPRINT ("GetNextCluster(DeviceExt %x, CurrentCluster %x)\n",
// DeviceExt, CurrentCluster); // DeviceExt, CurrentCluster);
@ -897,3 +898,39 @@ GetNextCluster (PDEVICE_EXTENSION DeviceExt,
return (Status); return (Status);
} }
NTSTATUS
GetNextSector (PDEVICE_EXTENSION DeviceExt,
ULONG CurrentSector,
PULONG NextSector,
BOOLEAN Extend)
/* Some functions don't have access to the cluster they're really reading from.
Maybe this is a dirty solution, but it will allow them to handle fragmentation. */
{
NTSTATUS Status;
DPRINT ("GetNextSector(DeviceExt %x, CurrentSector %x)\n",DeviceExt, CurrentSector);
if (CurrentSector<DeviceExt->dataStart || ((CurrentSector - DeviceExt->dataStart + 1) % DeviceExt -> Boot -> SectorsPerCluster))
/* Basically, if the next sequential sector would be on a cluster border, then we'll need to check in the FAT */
{
(*NextSector)=CurrentSector+1;
return (STATUS_SUCCESS);
}
else
{
CurrentSector = (CurrentSector - DeviceExt->dataStart) / DeviceExt -> Boot -> SectorsPerCluster + 2;
Status = GetNextCluster(DeviceExt, CurrentSector, NextSector, Extend);
if (!NT_SUCCESS(Status))
{
return(Status);
}
if ((*NextSector) == 0 || (*NextSector) == 0xffffffff)
{
/* The caller wants to know a sector. These FAT codes don't correspond to any sector. */
return (STATUS_UNSUCCESSFUL);
}
(*NextSector)=ClusterToSector(DeviceExt,(*NextSector));
return (STATUS_SUCCESS);
}
}

View file

@ -1,5 +1,5 @@
/* $Id: rw.c,v 1.20 2001/01/16 15:43:42 dwelch Exp $ /* $Id: rw.c,v 1.21 2001/03/02 15:59:16 cnettel Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -42,6 +42,16 @@ NextCluster(PDEVICE_EXTENSION DeviceExt,
(*CurrentCluster) += DeviceExt->Boot->SectorsPerCluster; (*CurrentCluster) += DeviceExt->Boot->SectorsPerCluster;
return(STATUS_SUCCESS); return(STATUS_SUCCESS);
} }
else
/* CN: FIXME: Real bug here or in dirwr, where CurrentCluster isn't initialized when 0*/
if (FirstCluster == 0)
{
NTSTATUS Status;
Status = GetNextCluster(DeviceExt, 0, CurrentCluster,
Extend);
return(Status);
}
else else
{ {
NTSTATUS Status; NTSTATUS Status;

View file

@ -1,4 +1,4 @@
/* $Id: vfat.h,v 1.25 2001/02/10 22:51:11 dwelch Exp $ */ /* $Id: vfat.h,v 1.26 2001/03/02 15:59:16 cnettel Exp $ */
#include <ddk/ntifs.h> #include <ddk/ntifs.h>
@ -251,6 +251,11 @@ GetNextCluster(PDEVICE_EXTENSION DeviceExt,
PULONG NextCluster, PULONG NextCluster,
BOOLEAN Extend); BOOLEAN Extend);
NTSTATUS NTSTATUS
GetNextSector (PDEVICE_EXTENSION DeviceExt,
ULONG CurrentSector,
PULONG NextSector,
BOOLEAN Extend);
NTSTATUS
VfatRawReadCluster (PDEVICE_EXTENSION DeviceExt, VfatRawReadCluster (PDEVICE_EXTENSION DeviceExt,
ULONG FirstCluster, ULONG FirstCluster,
PVOID Buffer, PVOID Buffer,