IoShutdownRegisteredFileSystems(): Cope with uncalled IoUnregisterFileSystem().
[reactos.git] / ntoskrnl / io / fs.c
index b96750b..a241167 100644 (file)
@@ -180,7 +180,7 @@ IoShutdownRegisteredFileSystems(VOID)
 {
    KIRQL oldlvl;
    PLIST_ENTRY current_entry;
-   FILE_SYSTEM_OBJECT* current;
+   FILE_SYSTEM_OBJECT* current,*current_last=NULL;
    PIRP Irp;
    KEVENT Event;
    IO_STATUS_BLOCK IoStatusBlock;
@@ -195,10 +195,20 @@ IoShutdownRegisteredFileSystems(VOID)
    KeInitializeEvent(&Event,NotificationEvent,FALSE);
 
    /* 'current' will get IoDeleteDevice()ed by IRP_MJ_SHUTDOWN! */
-   /* FIXME: deadlock loop detection */
    while ((current_entry = FileSystemListHead.Flink)!=(&FileSystemListHead))
      {
        current = CONTAINING_RECORD(current_entry,FILE_SYSTEM_OBJECT,Entry);
+       if (current==current_last)
+         {
+           /* At least ntfs.sys-NT5.1sp1 appears to not to unregister itself.
+            * It does not import symbol IoUnregisterFileSystem() at all!
+            * BTW also ext2fsd.sys<=v0.10A also forgets to call IoUnregisterFileSystem().
+            */
+           DPRINT("IoShutdownRegisteredFileSystems(): WARNING: filesystem forgot to call IoUnregisterFileSystem() !!!\n");
+           IoUnregisterFileSystem(current->DeviceObject);
+           continue;
+         }
+       current_last=current;
 
        /* send IRP_MJ_SHUTDOWN */
        Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN,