[fastfat_new]
authorAleksey Bragin <aleksey@reactos.org>
Sun, 27 Sep 2009 20:24:22 +0000 (20:24 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Sun, 27 Sep 2009 20:24:22 +0000 (20:24 +0000)
- 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

reactos/drivers/filesystems/fastfat_new/fastfat.c
reactos/drivers/filesystems/fastfat_new/fastfat.h
reactos/drivers/filesystems/fastfat_new/fat.c
reactos/drivers/filesystems/fastfat_new/fsctl.c

index 4be706d..c4cc26e 100644 (file)
@@ -108,6 +108,9 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
     /* Initialize synchronization resource for the global data */
     ExInitializeResourceLite(&FatGlobalData.Resource);
 
     /* 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);
     /* Register and reference our filesystem */
     IoRegisterFileSystem(DeviceObject);
     ObReferenceObject(DeviceObject);
index becad68..e8b0edf 100644 (file)
 #define TAG_FCB  'BCFV'
 #define TAG_IRP  'PRIV'
 #define TAG_VFAT 'TAFV'
 #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;
 /*  ------------------------------------------------------  shutdown.c  */
 
 DRIVER_DISPATCH FatShutdown;
@@ -145,6 +166,7 @@ FatPinNextPage(
 
 NTSTATUS
 FatInitializeVcb(
 
 NTSTATUS
 FatInitializeVcb(
+    IN PFAT_IRP_CONTEXT IrpContext,
     IN PVCB Vcb,
     IN PDEVICE_OBJECT TargetDeviceObject,
     IN PVPB Vpb);
     IN PVCB Vcb,
     IN PDEVICE_OBJECT TargetDeviceObject,
     IN PVPB Vpb);
index 29b6f75..6722ea0 100644 (file)
@@ -445,7 +445,8 @@ FatiInitializeVcb(PVCB Vcb)
 }
 
 NTSTATUS
 }
 
 NTSTATUS
-FatInitializeVcb(IN PVCB Vcb,
+FatInitializeVcb(IN PFAT_IRP_CONTEXT IrpContext,
+                 IN PVCB Vcb,
                  IN PDEVICE_OBJECT TargetDeviceObject,
                  IN PVPB Vpb)
 {
                  IN PDEVICE_OBJECT TargetDeviceObject,
                  IN PVPB Vpb)
 {
@@ -533,8 +534,11 @@ FatInitializeVcb(IN PVCB Vcb,
     /* Call helper function */
     FatiInitializeVcb(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);
     InsertTailList(&FatGlobalData.VcbListHead, &Vcb->VcbLinks);
+    FatReleaseGlobal(IrpContext);
+
     return STATUS_SUCCESS;
 
 FatInitializeVcbCleanup:
     return STATUS_SUCCESS;
 
 FatInitializeVcbCleanup:
index 3dec224..be5edc6 100644 (file)
@@ -121,7 +121,7 @@ FatMountVolume(PFAT_IRP_CONTEXT IrpContext,
     Vpb->DeviceObject = (PDEVICE_OBJECT)VolumeDevice;
 
     /* Initialize VCB for this volume */
     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 */
     if (!NT_SUCCESS(Status)) goto FatMountVolumeCleanup;
 
     /* Keep trace of media changes */