[UDFS]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 4 Jun 2017 08:02:01 +0000 (08:02 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 4 Jun 2017 08:02:01 +0000 (08:02 +0000)
lolfix some deadlocks in UDFS:
- deadlock when enumerating files
- deadlock on shutdown after volume change

I could track it to the fact that for whatever reason, GCC wrongly optimize the
BOOLEAN used to store whether the VCB resource was acquired. The optimization being
to assume it's always FALSE. Thus, the resource is never released and the driver
ends in a deadlock.
To avoid this: marked the BOOLEAN variables as volatile.

I guess there are same kind deadlocks I couldn't see in my limited tests...

CORE-4375

svn path=/trunk/; revision=74897

reactos/drivers/filesystems/udfs/close.cpp
reactos/drivers/filesystems/udfs/create.cpp

index fe4dfc9..c355280 100644 (file)
@@ -1109,7 +1109,7 @@ UDFQueueDelayedClose(
 {
     PtrUDFIrpContextLite    IrpContextLite;
     BOOLEAN                 StartWorker = FALSE;
 {
     PtrUDFIrpContextLite    IrpContextLite;
     BOOLEAN                 StartWorker = FALSE;
-    BOOLEAN                 AcquiredVcb = FALSE;
+    volatile BOOLEAN        AcquiredVcb = FALSE;
     NTSTATUS                RC;
 
     AdPrint(("  UDFQueueDelayedClose\n"));
     NTSTATUS                RC;
 
     AdPrint(("  UDFQueueDelayedClose\n"));
index 0928ff1..4f2f848 100644 (file)
@@ -205,7 +205,7 @@ UDFCommonCreate(
     PACCESS_STATE               AccessState;
 
     PVCB                        Vcb = NULL;
     PACCESS_STATE               AccessState;
 
     PVCB                        Vcb = NULL;
-    BOOLEAN                     AcquiredVcb = FALSE;
+    volatile BOOLEAN            AcquiredVcb = FALSE;
     BOOLEAN                     OpenExisting = FALSE;
     PERESOURCE                  Res1 = NULL;
     PERESOURCE                  Res2 = NULL;
     BOOLEAN                     OpenExisting = FALSE;
     PERESOURCE                  Res1 = NULL;
     PERESOURCE                  Res2 = NULL;