Fixed several cache-related bugs.

Silenced debug messages.

svn path=/trunk/; revision=2951
This commit is contained in:
Eric Kohl 2002-05-14 23:16:23 +00:00
parent fb21de32de
commit 58cf63221a
5 changed files with 78 additions and 36 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: cdfs.c,v 1.2 2002/04/15 20:39:49 ekohl Exp $
/* $Id: cdfs.c,v 1.3 2002/05/14 23:16:23 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -30,7 +30,7 @@
#include <ddk/ntddk.h>
//#define NDEBUG
#define NDEBUG
#include <debug.h>
#include "cdfs.h"
@ -58,12 +58,12 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
NTSTATUS Status;
UNICODE_STRING DeviceName;
DbgPrint("CDFS 0.0.1\n");
DbgPrint("CDFS 0.0.2\n");
RtlInitUnicodeString(&DeviceName,
L"\\Device\\cdfs");
Status = IoCreateDevice(DriverObject,
sizeof(CDFS_GLOBAL_DATA),
sizeof(CDFS_GLOBAL_DATA),
&DeviceName,
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
0,

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: dirctl.c,v 1.4 2002/05/09 15:53:02 ekohl Exp $
/* $Id: dirctl.c,v 1.5 2002/05/14 23:16:23 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -41,8 +41,10 @@
static NTSTATUS
CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
PVOID Block,
ULONG BlockLength,
PVOID *Context,
PVOID *Block,
PLARGE_INTEGER StreamOffset,
ULONG DirLength,
PVOID *Ptr,
PWSTR Name,
PULONG pIndex,
@ -55,20 +57,35 @@ CdfsGetEntryName(PDEVICE_EXTENSION DeviceExt,
NTSTATUS Status;
ULONG Index = 0;
ULONG Offset = 0;
ULONG BlockOffset = 0;
Record = (PDIR_RECORD)Block;
Record = (PDIR_RECORD)*Block;
while(Index < *pIndex)
{
Offset = Offset + Record->RecordLength;
BlockOffset += Record->RecordLength;
Offset += Record->RecordLength;
Record = (PDIR_RECORD)(Block + Offset);
if (Record->RecordLength == 0)
Record = (PDIR_RECORD)(*Block + BlockOffset);
if (BlockOffset >= BLOCKSIZE || Record->RecordLength == 0)
{
Offset = ROUND_UP(Offset, 2048);
Record = (PDIR_RECORD)(Block + Offset);
DPRINT("Map next sector\n");
CcUnpinData(*Context);
StreamOffset->QuadPart += BLOCKSIZE;
Offset = ROUND_UP(Offset, BLOCKSIZE);
BlockOffset = 0;
if (!CcMapData(DeviceExt->StreamFileObject,
StreamOffset,
BLOCKSIZE, TRUE,
Context, Block))
{
DPRINT("CcMapData() failed\n");
return(STATUS_UNSUCCESSFUL);
}
Record = (PDIR_RECORD)(*Block + BlockOffset);
}
if (Offset >= BlockLength)
if (Offset >= DirLength)
return(STATUS_NO_MORE_ENTRIES);
Index++;
@ -202,8 +219,9 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
DirIndex = *pDirIndex;
if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
DirSize, TRUE, &Context, &Block))
BLOCKSIZE, TRUE, &Context, &Block))
{
DPRINT("CcMapData() failed\n");
return(STATUS_UNSUCCESSFUL);
}
@ -220,11 +238,17 @@ CdfsFindFile(PDEVICE_EXTENSION DeviceExt,
DPRINT("RecordLength %u ExtAttrRecordLength %u NameLength %u\n",
Record->RecordLength, Record->ExtAttrRecordLength, Record->FileIdLength);
Status = CdfsGetEntryName(DeviceExt, Block, DirSize, (PVOID*)&Ptr, name, &DirIndex, pDirIndex2);
Status = CdfsGetEntryName(DeviceExt, &Context, &Block, &StreamOffset,
DirSize, (PVOID*)&Ptr, name, &DirIndex, pDirIndex2);
if (Status == STATUS_NO_MORE_ENTRIES)
{
break;
}
else if (Status == STATUS_UNSUCCESSFUL)
{
/* Note: the directory cache has already been unpinned */
return(Status);
}
DPRINT("Name '%S'\n", name);
@ -314,7 +338,7 @@ CdfsGetDirectoryInformation(PFCB Fcb,
{
ULONG Length;
DPRINT1("CdfsGetDirectoryInformation() called\n");
DPRINT("CdfsGetDirectoryInformation() called\n");
Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength)
@ -358,7 +382,7 @@ CdfsGetFullDirectoryInformation(PFCB Fcb,
{
ULONG Length;
DPRINT1("CdfsGetFullDirectoryInformation() called\n");
DPRINT("CdfsGetFullDirectoryInformation() called\n");
Length = wcslen(Fcb->ObjectName) * sizeof(WCHAR);
if ((sizeof (FILE_BOTH_DIRECTORY_INFORMATION) + Length) > BufferLength)

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: fcb.c,v 1.5 2002/05/09 15:53:02 ekohl Exp $
/* $Id: fcb.c,v 1.6 2002/05/14 23:16:23 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -246,8 +246,8 @@ CdfsFCBInitializeCache(PVCB Vcb,
Fcb->DevExt = Vcb;
Status = CcRosInitializeFileCache(FileObject,
&Fcb->RFCB.Bcb,
PAGESIZE);
&Fcb->RFCB.Bcb,
PAGESIZE);
if (!NT_SUCCESS(Status))
{
DbgPrint("CcRosInitializeFileCache failed\n");
@ -380,7 +380,7 @@ CdfsMakeFCBFromDirEntry(PVCB Vcb,
rcFCB->RFCB.FileSize.QuadPart = Size;
rcFCB->RFCB.ValidDataLength.QuadPart = Size;
rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, 2096);
rcFCB->RFCB.AllocationSize.QuadPart = ROUND_UP(Size, BLOCKSIZE);
// DPRINT1("%S %d %d\n", longName, Size, (ULONG)rcFCB->RFCB.AllocationSize.QuadPart);
CdfsFCBInitializeCache(Vcb, rcFCB);
rcFCB->RefCount++;
@ -447,6 +447,7 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
ULONG DirSize;
PDIR_RECORD Record;
ULONG Offset;
ULONG BlockOffset;
NTSTATUS Status;
LARGE_INTEGER StreamOffset;
@ -474,18 +475,20 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
StreamOffset.QuadPart = (LONGLONG)DirectoryFcb->Entry.ExtentLocationL * (LONGLONG)BLOCKSIZE;
if(!CcMapData(DeviceExt->StreamFileObject, &StreamOffset,
DirSize, TRUE, &Context, &Block))
BLOCKSIZE, TRUE, &Context, &Block))
{
DPRINT("CcMapData() failed\n");
return(STATUS_UNSUCCESSFUL);
}
Offset = 0;
BlockOffset = 0;
Record = (PDIR_RECORD)Block;
while(TRUE)
{
if (Record->RecordLength == 0)
{
DPRINT1("RecordLength == 0 Stopped!\n");
DPRINT("RecordLength == 0 Stopped!\n");
break;
}
@ -509,12 +512,26 @@ CdfsDirFindFile(PDEVICE_EXTENSION DeviceExt,
return(Status);
}
Offset = Offset + Record->RecordLength;
Record = (PDIR_RECORD)(Block + Offset);
if (Record->RecordLength == 0)
Offset += Record->RecordLength;
BlockOffset += Record->RecordLength;
Record = (PDIR_RECORD)(Block + BlockOffset);
if (BlockOffset >= BLOCKSIZE || Record->RecordLength == 0)
{
Offset = ROUND_UP(Offset, 2048);
Record = (PDIR_RECORD)(Block + Offset);
DPRINT("Map next sector\n");
CcUnpinData(Context);
StreamOffset.QuadPart += BLOCKSIZE;
Offset = ROUND_UP(Offset, BLOCKSIZE);
BlockOffset = 0;
if (!CcMapData(DeviceExt->StreamFileObject,
&StreamOffset,
BLOCKSIZE, TRUE,
&Context, &Block))
{
DPRINT("CcMapData() failed\n");
return(STATUS_UNSUCCESSFUL);
}
Record = (PDIR_RECORD)(Block + BlockOffset);
}
if (Offset >= DirSize)

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: fsctl.c,v 1.4 2002/05/09 15:53:02 ekohl Exp $
/* $Id: fsctl.c,v 1.5 2002/05/14 23:16:23 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -100,7 +100,7 @@ CdfsGetSVDData(PUCHAR Buffer,
Svd = (PSVD)Buffer;
DPRINT1("EscapeSequences: '%.32s'\n", Svd->EscapeSequences);
DPRINT("EscapeSequences: '%.32s'\n", Svd->EscapeSequences);
if (strncmp(Svd->EscapeSequences, "%/@", 3) == 0)
{
@ -143,6 +143,7 @@ CdfsGetVolumeData(PDEVICE_OBJECT DeviceObject,
ULONG Sector;
PVD_HEADER VdHeader;
Vcb->CdInfo.JolietLevel = 0;
Sector = CDFS_PRIMARY_DESCRIPTOR_LOCATION;
Buffer = ExAllocatePool(NonPagedPool,
@ -346,12 +347,14 @@ CdfsMountVolume(PDEVICE_OBJECT DeviceObject,
Fcb->RFCB.FileSize.QuadPart = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Fcb->RFCB.ValidDataLength.QuadPart = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Fcb->RFCB.AllocationSize.QuadPart = ROUND_UP(DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE, PAGESIZE);
Fcb->RFCB.AllocationSize.QuadPart = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Fcb->Entry.ExtentLocationL = 0;
Fcb->Entry.DataLengthL = DeviceExt->CdInfo.VolumeSpaceSize * BLOCKSIZE;
Status = CcRosInitializeFileCache(DeviceExt->StreamFileObject, &Fcb->RFCB.Bcb, PAGESIZE);
Status = CcRosInitializeFileCache(DeviceExt->StreamFileObject,
&Fcb->RFCB.Bcb,
PAGESIZE);
if (!NT_SUCCESS (Status))
{
DbgPrint("CcRosInitializeFileCache failed\n");

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: rw.c,v 1.3 2002/05/09 15:53:02 ekohl Exp $
/* $Id: rw.c,v 1.4 2002/05/14 23:16:23 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -86,8 +86,6 @@ CdfsReadFile(PDEVICE_EXTENSION DeviceExt,
LARGE_INTEGER FileOffset;
IO_STATUS_BLOCK IoStatus;
DPRINT1("Try caching!\n");
FileOffset.QuadPart = (LONGLONG)ReadOffset;
CcCopyRead(FileObject,
&FileOffset,