From 7245b3c04b384bb2b907f48d83ee7e8cf89d084b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 27 Sep 2009 20:24:22 +0000 Subject: [PATCH] [fastfat_new] - Acquire global lock before touching FatGlobalData structure. - Initialize global VCB list, fixes a crash at volume mounting. - Loading goes up to volume mounting, an attempt to query information and open a file. svn path=/trunk/; revision=43194 --- .../drivers/filesystems/fastfat_new/fastfat.c | 3 +++ .../drivers/filesystems/fastfat_new/fastfat.h | 22 +++++++++++++++++++ reactos/drivers/filesystems/fastfat_new/fat.c | 8 +++++-- .../drivers/filesystems/fastfat_new/fsctl.c | 2 +- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.c b/reactos/drivers/filesystems/fastfat_new/fastfat.c index 4be706d9b46..c4cc26e3f96 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.c +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.c @@ -108,6 +108,9 @@ DriverEntry(PDRIVER_OBJECT DriverObject, /* Initialize synchronization resource for the global data */ ExInitializeResourceLite(&FatGlobalData.Resource); + /* Initialize global VCB list */ + InitializeListHead(&FatGlobalData.VcbListHead); + /* Register and reference our filesystem */ IoRegisterFileSystem(DeviceObject); ObReferenceObject(DeviceObject); diff --git a/reactos/drivers/filesystems/fastfat_new/fastfat.h b/reactos/drivers/filesystems/fastfat_new/fastfat.h index becad682f39..e8b0edf3c62 100644 --- a/reactos/drivers/filesystems/fastfat_new/fastfat.h +++ b/reactos/drivers/filesystems/fastfat_new/fastfat.h @@ -13,6 +13,27 @@ #define TAG_FCB 'BCFV' #define TAG_IRP 'PRIV' #define TAG_VFAT 'TAFV' + + +/* Global resource acquire/release */ +#define FatAcquireExclusiveGlobal(IrpContext) \ +( \ + ExAcquireResourceExclusiveLite(&FatGlobalData.Resource, \ + (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \ +) + +#define FatAcquireSharedGlobal(IrpContext) \ +( \ + ExAcquireResourceSharedLite(&FatGlobalData.Resource, \ + (IrpContext)->Flags & IRPCONTEXT_CANWAIT) \ +) + +#define FatReleaseGlobal(IrpContext) \ +{ \ + ExReleaseResourceLite(&(FatGlobalData.Resource)); \ +} + + /* ------------------------------------------------------ shutdown.c */ DRIVER_DISPATCH FatShutdown; @@ -145,6 +166,7 @@ FatPinNextPage( NTSTATUS FatInitializeVcb( + IN PFAT_IRP_CONTEXT IrpContext, IN PVCB Vcb, IN PDEVICE_OBJECT TargetDeviceObject, IN PVPB Vpb); diff --git a/reactos/drivers/filesystems/fastfat_new/fat.c b/reactos/drivers/filesystems/fastfat_new/fat.c index 29b6f7558fc..6722ea0bd7d 100644 --- a/reactos/drivers/filesystems/fastfat_new/fat.c +++ b/reactos/drivers/filesystems/fastfat_new/fat.c @@ -445,7 +445,8 @@ FatiInitializeVcb(PVCB Vcb) } NTSTATUS -FatInitializeVcb(IN PVCB Vcb, +FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext, + IN PVCB Vcb, IN PDEVICE_OBJECT TargetDeviceObject, IN PVPB Vpb) { @@ -533,8 +534,11 @@ FatInitializeVcb(IN PVCB Vcb, /* Call helper function */ FatiInitializeVcb(Vcb); - /* Add this Vcb to grobal Vcb list. */ + /* Add this Vcb to global Vcb list */ + (VOID)FatAcquireExclusiveGlobal(IrpContext); InsertTailList(&FatGlobalData.VcbListHead, &Vcb->VcbLinks); + FatReleaseGlobal(IrpContext); + return STATUS_SUCCESS; FatInitializeVcbCleanup: diff --git a/reactos/drivers/filesystems/fastfat_new/fsctl.c b/reactos/drivers/filesystems/fastfat_new/fsctl.c index 3dec2248922..be5edc6293b 100644 --- a/reactos/drivers/filesystems/fastfat_new/fsctl.c +++ b/reactos/drivers/filesystems/fastfat_new/fsctl.c @@ -121,7 +121,7 @@ FatMountVolume(PFAT_IRP_CONTEXT IrpContext, Vpb->DeviceObject = (PDEVICE_OBJECT)VolumeDevice; /* Initialize VCB for this volume */ - Status = FatInitializeVcb(&VolumeDevice->Vcb, TargetDeviceObject, Vpb); + Status = FatInitializeVcb(IrpContext, &VolumeDevice->Vcb, TargetDeviceObject, Vpb); if (!NT_SUCCESS(Status)) goto FatMountVolumeCleanup; /* Keep trace of media changes */ -- 2.17.1