update for HEAD-2003050101
[reactos.git] / ntoskrnl / io / fs.c
index 0365f62..f2e0346 100644 (file)
@@ -38,7 +38,7 @@ typedef struct _FS_CHANGE_NOTIFY_ENTRY
 
 /* GLOBALS ******************************************************************/
 
-static KSPIN_LOCK FileSystemListLock;
+static ERESOURCE FileSystemListLock;
 static LIST_ENTRY FileSystemListHead;
 
 static KSPIN_LOCK FsChangeNotifyListLock;
@@ -159,7 +159,7 @@ VOID
 IoInitFileSystemImplementation(VOID)
 {
   InitializeListHead(&FileSystemListHead);
-  KeInitializeSpinLock(&FileSystemListLock);
+  ExInitializeResourceLite(&FileSystemListLock);
 
   InitializeListHead(&FsChangeNotifyListHead);
   KeInitializeSpinLock(&FsChangeNotifyListLock);
@@ -169,43 +169,48 @@ IoInitFileSystemImplementation(VOID)
 VOID
 IoShutdownRegisteredFileSystems(VOID)
 {
-   KIRQL oldlvl;
-   PLIST_ENTRY current_entry;
-   FILE_SYSTEM_OBJECT* current;
-   PIRP Irp;
-   KEVENT Event;
-   IO_STATUS_BLOCK IoStatusBlock;
-   NTSTATUS Status;
+  PLIST_ENTRY current_entry;
+  FILE_SYSTEM_OBJECT* current;
+  PIRP Irp;
+  KEVENT Event;
+  IO_STATUS_BLOCK IoStatusBlock;
+  NTSTATUS Status;
 
-   DPRINT("IoShutdownRegisteredFileSystems()\n");
+  DPRINT("IoShutdownRegisteredFileSystems()\n");
 
-   KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
-   KeInitializeEvent(&Event,NotificationEvent,FALSE);
+  ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
+  KeInitializeEvent(&Event,
+                   NotificationEvent,
+                   FALSE);
 
-   current_entry = FileSystemListHead.Flink;
-   while (current_entry!=(&FileSystemListHead))
-     {
-       current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
-
-       /* send IRP_MJ_SHUTDOWN */
-       Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
-                                          current->DeviceObject,
-                                          NULL,
-                                          0,
-                                          0,
-                                          &Event,
-                                          &IoStatusBlock);
-
-       Status = IoCallDriver(current->DeviceObject,Irp);
-       if (Status==STATUS_PENDING)
-         {
-            KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
-         }
-
-       current_entry = current_entry->Flink;
-     }
+  current_entry = FileSystemListHead.Flink;
+  while (current_entry!=(&FileSystemListHead))
+    {
+      current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
+
+      /* send IRP_MJ_SHUTDOWN */
+      Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,
+                                        current->DeviceObject,
+                                        NULL,
+                                        0,
+                                        0,
+                                        &Event,
+                                        &IoStatusBlock);
+
+      Status = IoCallDriver(current->DeviceObject,Irp);
+      if (Status == STATUS_PENDING)
+       {
+         KeWaitForSingleObject(&Event,
+                               Executive,
+                               KernelMode,
+                               FALSE,
+                               NULL);
+       }
 
-   KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+      current_entry = current_entry->Flink;
+    }
+
+  ExReleaseResourceLite(&FileSystemListLock);
 }
 
 
@@ -215,7 +220,7 @@ IopMountFileSystem(PDEVICE_OBJECT DeviceObject,
 {
   IO_STATUS_BLOCK IoStatusBlock;
   PIO_STACK_LOCATION StackPtr;
-  PKEVENT Event;
+  KEVENT Event;
   PIRP Irp;
   NTSTATUS Status;
 
@@ -223,23 +228,17 @@ IopMountFileSystem(PDEVICE_OBJECT DeviceObject,
         DeviceObject,DeviceToMount);
 
   assert_irql(PASSIVE_LEVEL);
-  Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
-  if (Event == NULL)
-    {
-      return(STATUS_INSUFFICIENT_RESOURCES);
-    }
-  KeInitializeEvent(Event, NotificationEvent, FALSE);
 
+  KeInitializeEvent(&Event, NotificationEvent, FALSE);
   Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
   if (Irp==NULL)
     {
-      ExFreePool(Event);
       return(STATUS_INSUFFICIENT_RESOURCES);
     }
 
   Irp->UserIosb = &IoStatusBlock;
   DPRINT("Irp->UserIosb %x\n", Irp->UserIosb);
-  Irp->UserEvent = Event;
+  Irp->UserEvent = &Event;
   Irp->Tail.Overlay.Thread = PsGetCurrentThread();
 
   StackPtr = IoGetNextIrpStackLocation(Irp);
@@ -257,12 +256,10 @@ IopMountFileSystem(PDEVICE_OBJECT DeviceObject,
   Status = IoCallDriver(DeviceObject,Irp);
   if (Status==STATUS_PENDING)
     {
-      KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+      KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
       Status = IoStatusBlock.Status;
     }
 
-  ExFreePool(Event);
-
   return(Status);
 }
 
@@ -272,30 +269,24 @@ IopLoadFileSystem(IN PDEVICE_OBJECT DeviceObject)
 {
   IO_STATUS_BLOCK IoStatusBlock;
   PIO_STACK_LOCATION StackPtr;
-  PKEVENT Event;
+  KEVENT Event;
   PIRP Irp;
   NTSTATUS Status;
 
   DPRINT("IopLoadFileSystem(DeviceObject %x)\n", DeviceObject);
 
   assert_irql(PASSIVE_LEVEL);
-  Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
-  if (Event == NULL)
-    {
-      return(STATUS_INSUFFICIENT_RESOURCES);
-    }
-  KeInitializeEvent(Event, NotificationEvent, FALSE);
 
+  KeInitializeEvent(&Event, NotificationEvent, FALSE);
   Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
   if (Irp==NULL)
     {
-      ExFreePool(Event);
       return(STATUS_INSUFFICIENT_RESOURCES);
     }
 
   Irp->UserIosb = &IoStatusBlock;
   DPRINT("Irp->UserIosb %x\n", Irp->UserIosb);
-  Irp->UserEvent = Event;
+  Irp->UserEvent = &Event;
   Irp->Tail.Overlay.Thread = PsGetCurrentThread();
 
   StackPtr = IoGetNextIrpStackLocation(Irp);
@@ -310,12 +301,10 @@ IopLoadFileSystem(IN PDEVICE_OBJECT DeviceObject)
   Status = IoCallDriver(DeviceObject,Irp);
   if (Status==STATUS_PENDING)
     {
-      KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+      KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
       Status = IoStatusBlock.Status;
     }
 
-  ExFreePool(Event);
-
   return(Status);
 }
 
@@ -330,11 +319,11 @@ IoMountVolume(IN PDEVICE_OBJECT DeviceObject,
  * RETURNS: Status
  */
 {
-  KIRQL oldlvl;
   PLIST_ENTRY current_entry;
   FILE_SYSTEM_OBJECT* current;
   NTSTATUS Status;
   DEVICE_TYPE MatchingDeviceType;
+  PDEVICE_OBJECT DevObject;
 
   assert_irql(PASSIVE_LEVEL);
 
@@ -366,7 +355,7 @@ IoMountVolume(IN PDEVICE_OBJECT DeviceObject,
        return(STATUS_UNRECOGNIZED_VOLUME);
     }
 
-  KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+  ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
   current_entry = FileSystemListHead.Flink;
   while (current_entry!=(&FileSystemListHead))
     {
@@ -376,27 +365,26 @@ IoMountVolume(IN PDEVICE_OBJECT DeviceObject,
          current_entry = current_entry->Flink;
          continue;
        }
-      KeReleaseSpinLock(&FileSystemListLock,oldlvl);
       Status = IopMountFileSystem(current->DeviceObject,
                                  DeviceObject);
-      KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
       switch (Status)
        {
          case STATUS_FS_DRIVER_REQUIRED:
-           KeReleaseSpinLock(&FileSystemListLock,oldlvl);
-           Status = IopLoadFileSystem(current->DeviceObject);
+           DevObject = current->DeviceObject;
+           ExReleaseResourceLite(&FileSystemListLock);
+           Status = IopLoadFileSystem(DevObject);
            if (!NT_SUCCESS(Status))
              {
-               return(Status);
+               return(Status);
              }
-           KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+            ExAcquireResourceSharedLite(&FileSystemListLock,TRUE);
            current_entry = FileSystemListHead.Flink;
            continue;
 
          case STATUS_SUCCESS:
            DeviceObject->Vpb->Flags = DeviceObject->Vpb->Flags |
                                       VPB_MOUNTED;
-           KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+           ExReleaseResourceLite(&FileSystemListLock);
            return(STATUS_SUCCESS);
 
          case STATUS_UNRECOGNIZED_VOLUME:
@@ -404,7 +392,7 @@ IoMountVolume(IN PDEVICE_OBJECT DeviceObject,
            current_entry = current_entry->Flink;
        }
     }
-  KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+  ExReleaseResourceLite(&FileSystemListLock);
 
   return(STATUS_UNRECOGNIZED_VOLUME);
 }
@@ -434,7 +422,7 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject,
 {
   IO_STATUS_BLOCK IoStatusBlock;
   PIO_STACK_LOCATION StackPtr;
-  PKEVENT Event;
+  KEVENT Event;
   PIRP Irp;
   NTSTATUS Status;
 
@@ -454,24 +442,19 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject,
   if (DeviceObject->Vpb->Flags & VPB_MOUNTED)
     {
       /* Issue verify request to the FSD */
-      Event = ExAllocatePool(NonPagedPool,
-                            sizeof(KEVENT));
-      if (Event == NULL)
-       return(STATUS_INSUFFICIENT_RESOURCES);
 
-      KeInitializeEvent(Event,
+      KeInitializeEvent(&Event,
                        NotificationEvent,
                        FALSE);
 
       Irp = IoAllocateIrp(DeviceObject->StackSize, TRUE);
       if (Irp==NULL)
        {
-         ExFreePool(Event);
          return(STATUS_INSUFFICIENT_RESOURCES);
        }
 
       Irp->UserIosb = &IoStatusBlock;
-      Irp->UserEvent = Event;
+      Irp->UserEvent = &Event;
       Irp->Tail.Overlay.Thread = PsGetCurrentThread();
 
       StackPtr = IoGetNextIrpStackLocation(Irp);
@@ -490,10 +473,9 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject,
                            Irp);
       if (Status==STATUS_PENDING)
        {
-         KeWaitForSingleObject(Event,Executive,KernelMode,FALSE,NULL);
+         KeWaitForSingleObject(&Event,Executive,KernelMode,FALSE,NULL);
          Status = IoStatusBlock.Status;
        }
-      ExFreePool(Event);
 
       if (NT_SUCCESS(Status))
        {
@@ -565,9 +547,13 @@ IoRegisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
   assert(Fs!=NULL);
 
   Fs->DeviceObject = DeviceObject;
-  ExInterlockedInsertTailList(&FileSystemListHead,
-                             &Fs->Entry,
-                             &FileSystemListLock);
+  ExAcquireResourceExclusiveLite(&FileSystemListLock, TRUE);
+
+  InsertTailList(&FileSystemListHead,
+                &Fs->Entry);
+
+  ExReleaseResourceLite(&FileSystemListLock);
+
   IopNotifyFileSystemChange(DeviceObject,
                            TRUE);
 }
@@ -576,13 +562,12 @@ IoRegisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
 VOID STDCALL
 IoUnregisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
 {
-  KIRQL oldlvl;
   PLIST_ENTRY current_entry;
   PFILE_SYSTEM_OBJECT current;
 
   DPRINT("IoUnregisterFileSystem(DeviceObject %x)\n",DeviceObject);
 
-  KeAcquireSpinLock(&FileSystemListLock,&oldlvl);
+  ExAcquireResourceExclusiveLite(&FileSystemListLock, TRUE);
   current_entry = FileSystemListHead.Flink;
   while (current_entry!=(&FileSystemListHead))
     {
@@ -591,13 +576,13 @@ IoUnregisterFileSystem(IN PDEVICE_OBJECT DeviceObject)
        {
          RemoveEntryList(current_entry);
          ExFreePool(current);
-         KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+         ExReleaseResourceLite(&FileSystemListLock);
          IopNotifyFileSystemChange(DeviceObject, FALSE);
          return;
        }
       current_entry = current_entry->Flink;
     }
-  KeReleaseSpinLock(&FileSystemListLock,oldlvl);
+  ExReleaseResourceLite(&FileSystemListLock);
 }