]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fixed bug in partition driver:
authoryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 23 Jan 2007 10:28:32 +0000 (10:28 +0000)
committeryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 23 Jan 2007 10:28:32 +0000 (10:28 +0000)
When Block I/O detects the media changed, block driver will reinstall block I/O protocol. If it happened during start() of partition driver, the reinstall protocol would results in the reentrant of the start(). In the patch, we check status of child detection to see whether need clean up the opened block I/O protocol in Start().

Besides, some checking of return status added in usbbus driver to improve robusticiy of the driver.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2288 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Bus/Usb/UsbBus/Dxe/usbbus.c
EdkModulePkg/Universal/Disk/Partition/Dxe/ElTorito.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Gpt.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Mbr.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Partition.h

index 837a6001dd44262c670e95f0720374a0a4835412..029d9cb4255bf06bb44b1210d1f27929e333d1e4 100644 (file)
@@ -1276,6 +1276,7 @@ UsbDeviceDeConfiguration (
   USB_IO_DEVICE             *ChildDevice;\r
   UINT8                     Index;\r
   EFI_USB_IO_PROTOCOL       *UsbIo;\r
+  EFI_STATUS                Status;\r
 \r
   //\r
   // Double check UsbIoDevice exists\r
@@ -1365,14 +1366,17 @@ UsbDeviceDeConfiguration (
     // Uninstall EFI_USB_IO_PROTOCOL & DEVICE_PATH_PROTOCOL\r
     // installed on this handle\r
     //\r
-    gBS->UninstallMultipleProtocolInterfaces (\r
-          UsbController->Handle,\r
-          &gEfiDevicePathProtocolGuid,\r
-          UsbController->DevicePath,\r
-          &gEfiUsbIoProtocolGuid,\r
-          &UsbController->UsbIo,\r
-          NULL\r
-          );\r
+    Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                    UsbController->Handle,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    UsbController->DevicePath,\r
+                    &gEfiUsbIoProtocolGuid,\r
+                    &UsbController->UsbIo,\r
+                    NULL\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
 \r
     if (UsbController->DevicePath != NULL) {\r
       gBS->FreePool (UsbController->DevicePath);\r
index b5f292697b6f2eada355bad06867ff270921365f..d740d240870d2ff65aa526c2b1a8ce6ca2589f5b 100644 (file)
@@ -23,7 +23,7 @@ Revision History
 \r
 #include "Partition.h"\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallElToritoChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -44,8 +44,9 @@ Arguments:
   DevicePath - Parent Device Path\r
 \r
 Returns:\r
-  TRUE       - some child handle(s) was added\r
-  FALSE      - no child handle was added\r
+  EFI_SUCCESS       - some child handle(s) was added\r
+  EFI_MEDIA_CHANGED - Media changed Detected\r
+  !EFI_SUCCESS      - no child handle was added\r
 \r
 --*/\r
 {\r
@@ -63,10 +64,10 @@ Returns:
   CDROM_DEVICE_PATH       CdDev;\r
   UINT32                  SubBlockSize;\r
   UINT32                  SectorCount;\r
-  BOOLEAN                 Found;\r
+  EFI_STATUS              Found;\r
   UINT32                  VolSpaceSize;\r
 \r
-  Found         = FALSE;\r
+  Found         = EFI_NOT_FOUND;\r
   Media         = BlockIo->Media;\r
   VolSpaceSize  = 0;\r
 \r
@@ -74,13 +75,13 @@ Returns:
   // CD_ROM has the fixed block size as 2048 bytes\r
   //\r
   if (Media->BlockSize != 2048) {\r
-    return FALSE;\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   VolDescriptor = AllocatePool ((UINTN) Media->BlockSize);\r
 \r
   if (VolDescriptor == NULL) {\r
-    return FALSE;\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   Catalog = (ELTORITO_CATALOG *) VolDescriptor;\r
@@ -114,6 +115,7 @@ Returns:
                         VolDescriptor\r
                         );\r
     if (EFI_ERROR (Status)) {\r
+      Found = Status;\r
       break;\r
     }\r
     //\r
@@ -272,7 +274,7 @@ Returns:
                 FALSE\r
                 );\r
       if (!EFI_ERROR (Status)) {\r
-        Found = TRUE;\r
+        Found = EFI_SUCCESS;\r
       }\r
     }\r
   }\r
index 12ec97612dd30eb5ea6f75080304ce23c5e9601d..42411806f648985811876c4a149d62c82b40b0e7 100644 (file)
@@ -75,7 +75,7 @@ PartitionSetCrc (
   IN OUT EFI_TABLE_HEADER *Hdr\r
   );\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallGptChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -96,8 +96,9 @@ Arguments:
   DevicePath - Parent Device Path\r
 \r
 Returns:\r
-  TRUE       - Valid GPT disk\r
-  FALSE      - Not a valid GPT disk\r
+  EFI_SUCCESS  - Valid GPT disk\r
+  EFI_MEDIA_CHANGED - Media changed Detected\r
+  !EFI_SUCCESS - Not a valid GPT disk\r
 \r
 --*/\r
 {\r
@@ -110,7 +111,7 @@ Returns:
   EFI_PARTITION_ENTRY         *PartEntry;\r
   EFI_PARTITION_ENTRY_STATUS  *PEntryStatus;\r
   UINTN                       Index;\r
-  BOOLEAN                     GptValid;\r
+  EFI_STATUS                  GptValid;\r
   HARDDRIVE_DEVICE_PATH       HdDev;\r
 \r
   ProtectiveMbr = NULL;\r
@@ -125,14 +126,14 @@ Returns:
   DEBUG ((EFI_D_INFO, " BlockSize : %d \n", BlockSize));\r
   DEBUG ((EFI_D_INFO, " LastBlock : %x \n", LastBlock));\r
 \r
-  GptValid = FALSE;\r
+  GptValid = EFI_NOT_FOUND;\r
 \r
   //\r
   // Allocate a buffer for the Protective MBR\r
   //\r
   ProtectiveMbr = AllocatePool (BlockSize);\r
   if (ProtectiveMbr == NULL) {\r
-    return FALSE;\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   //\r
@@ -146,6 +147,7 @@ Returns:
                       ProtectiveMbr\r
                       );\r
   if (EFI_ERROR (Status)) {\r
+    GptValid = Status;\r
     goto Done;\r
   }\r
   //\r
@@ -224,6 +226,7 @@ Returns:
                     PartEntry\r
                     );\r
   if (EFI_ERROR (Status)) {\r
+    GptValid = Status;\r
     DEBUG ((EFI_D_INFO, " Partition Entry ReadBlocks error\n"));\r
     goto Done;\r
   }\r
@@ -246,7 +249,7 @@ Returns:
   //\r
   // If we got this far the GPT layout of the disk is valid and we should return true\r
   //\r
-  GptValid = TRUE;\r
+  GptValid = EFI_SUCCESS;\r
 \r
   //\r
   // Create child device handles\r
index c0cd23c5bb7ece58f11515e0bb32598e51a47d65..ce6b0d535388adda8f6cfebf6c6e0c37dd99e43f 100644 (file)
@@ -108,7 +108,7 @@ Returns:
   return MbrValid;\r
 }\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallMbrChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -129,8 +129,9 @@ Arguments:
   DevicePath - Parent Device Path\r
 \r
 Returns:\r
-  EFI_SUCCESS - If a child handle was added\r
-  other       - A child handle was not added\r
+  EFI_SUCCESS       - If a child handle was added\r
+  EFI_MEDIA_CHANGED - Media changed Detected\r
+       !EFI_SUCCESS      - Not found MBR partition.\r
 \r
 --*/\r
 {\r
@@ -140,13 +141,13 @@ Returns:
   UINTN                     Index;\r
   HARDDRIVE_DEVICE_PATH     HdDev;\r
   HARDDRIVE_DEVICE_PATH     ParentHdDev;\r
-  BOOLEAN                   Found;\r
+  EFI_STATUS                Found;\r
   UINT32                    PartitionNumber;\r
   EFI_DEVICE_PATH_PROTOCOL  *DevicePathNode;\r
   EFI_DEVICE_PATH_PROTOCOL  *LastDevicePathNode;\r
 \r
   Mbr             = NULL;\r
-  Found           = FALSE;\r
+  Found           = EFI_NOT_FOUND;\r
 \r
   Mbr             = AllocatePool (BlockIo->Media->BlockSize);\r
   if (Mbr == NULL) {\r
@@ -161,6 +162,7 @@ Returns:
                       Mbr\r
                       );\r
   if (EFI_ERROR (Status) || !PartitionValidMbr (Mbr, BlockIo->Media->LastBlock)) {\r
+    Found = Status;\r
     goto Done;\r
   }\r
   //\r
@@ -237,7 +239,7 @@ Returns:
                 );\r
 \r
       if (!EFI_ERROR (Status)) {\r
-        Found = TRUE;\r
+        Found = EFI_SUCCESS;\r
       }\r
     }\r
   } else {\r
@@ -257,6 +259,7 @@ Returns:
                           Mbr\r
                           );\r
       if (EFI_ERROR (Status)) {\r
+        Found = Status;\r
         goto Done;\r
       }\r
 \r
@@ -295,7 +298,7 @@ Returns:
                 (BOOLEAN) (Mbr->Partition[0].OSIndicator == EFI_PARTITION)\r
                 );\r
       if (!EFI_ERROR (Status)) {\r
-        Found = TRUE;\r
+        Found = EFI_SUCCESS;\r
       }\r
 \r
       if ((Mbr->Partition[1].OSIndicator != EXTENDED_DOS_PARTITION) &&\r
index 504d98357fabee76023071c33b0112613ebdcee5..77cee2442b4ed64da73dfc7c7cbee6cd77db9ef5 100644 (file)
@@ -71,6 +71,15 @@ EFI_DRIVER_BINDING_PROTOCOL gPartitionDriverBinding = {
   NULL\r
 };\r
 \r
+STATIC \r
+PARTITION_DETECT_ROUTINE mPartitionDetectRoutineTable[] = {\r
+  PartitionInstallGptChildHandles,\r
+  PartitionInstallElToritoChildHandles,\r
+  PartitionInstallMbrChildHandles,\r
+  NULL\r
+};\r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 PartitionDriverBindingSupported (\r
@@ -212,6 +221,7 @@ PartitionDriverBindingStart (
   EFI_BLOCK_IO_PROTOCOL     *BlockIo;\r
   EFI_DISK_IO_PROTOCOL      *DiskIo;\r
   EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  PARTITION_DETECT_ROUTINE  *Routine;\r
 \r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
@@ -269,32 +279,19 @@ PartitionDriverBindingStart (
     // media supports a given partition type install child handles to represent\r
     // the partitions described by the media.\r
     //\r
-    if (PartitionInstallGptChildHandles (\r
-          This,\r
-          ControllerHandle,\r
-          DiskIo,\r
-          BlockIo,\r
-          ParentDevicePath\r
-          ) ||\r
-\r
-    PartitionInstallElToritoChildHandles (\r
-          This,\r
-          ControllerHandle,\r
-          DiskIo,\r
-          BlockIo,\r
-          ParentDevicePath\r
-          ) ||\r
-\r
-    PartitionInstallMbrChildHandles (\r
-          This,\r
-          ControllerHandle,\r
-          DiskIo,\r
-          BlockIo,\r
-          ParentDevicePath\r
-          )) {\r
-      Status = EFI_SUCCESS;\r
-    } else {\r
-      Status = EFI_NOT_FOUND;\r
+    Routine = &mPartitionDetectRoutineTable[0];\r
+    while (*Routine != NULL) {\r
+      Status = (*Routine) (\r
+                   This,\r
+                   ControllerHandle,\r
+                   DiskIo,\r
+                   BlockIo,\r
+                   ParentDevicePath\r
+                   );\r
+      if (!EFI_ERROR (Status) || Status == EFI_MEDIA_CHANGED) {\r
+        break;\r
+      }\r
+      Routine++;\r
     }\r
   }\r
   //\r
@@ -303,7 +300,7 @@ PartitionDriverBindingStart (
   // driver. So don't try to close them. Otherwise, we will break the dependency\r
   // between the controller and the driver set up before.\r
   //\r
-  if (EFI_ERROR (Status) && !EFI_ERROR (OpenStatus)) {\r
+  if (EFI_ERROR (Status) && !EFI_ERROR (OpenStatus) && Status != EFI_MEDIA_CHANGED) {\r
     gBS->CloseProtocol (\r
           ControllerHandle,\r
           &gEfiDiskIoProtocolGuid,\r
index ceb838f0ea734a365dab1e42bbd154b91cf0b69a..ba105554e99ef46181f6591d2c7e017128696cc4 100644 (file)
@@ -92,7 +92,7 @@ PartitionInstallChildHandle (
   )\r
 ;\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallGptChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -102,7 +102,7 @@ PartitionInstallGptChildHandles (
   )\r
 ;\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallElToritoChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -112,7 +112,7 @@ PartitionInstallElToritoChildHandles (
   )\r
 ;\r
 \r
-BOOLEAN\r
+EFI_STATUS\r
 PartitionInstallMbrChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
@@ -122,4 +122,14 @@ PartitionInstallMbrChildHandles (
   )\r
 ;\r
 \r
+typedef \r
+EFI_STATUS\r
+(*PARTITION_DETECT_ROUTINE) (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN  EFI_HANDLE                   Handle,\r
+  IN  EFI_DISK_IO_PROTOCOL         *DiskIo,\r
+  IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
+  );\r
+\r
 #endif\r