]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: SataControllerDxe: add cascading error handling to Start()
authorLaszlo Ersek <lersek@redhat.com>
Tue, 22 Sep 2015 11:18:22 +0000 (11:18 +0000)
committerlersek <lersek@Edk2>
Tue, 22 Sep 2015 11:18:22 +0000 (11:18 +0000)
In the next patch we'll add another PCI operation to
SataControllerStart(), which, on error, has to be rolled back similarly to
other actions already being done in SataControllerStart(). Since that PCI
operation won't provide a non-NULL pointer on success, its rollback isn't
really suitable for the current error handling in SataControllerStart().

Employ the traditional cascading labels instead.

Cc: Alexander Graf <agraf@suse.de>
Cc: Reza Jelveh <reza.jelveh@tuhh.de>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Gabriel L. Somlo <somlo@cmu.edu>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Gabriel Somlo <somlo@cmu.edu>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18527 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/SataControllerDxe/SataController.c

index e5d10e234e88c3135892b9b400c5db409e4f4504..5e7e23b26164ea0ccf7e7a9f3ccd41a8a2676223 100644 (file)
@@ -411,8 +411,7 @@ SataControllerStart (
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r
-    return Status;\r
+    goto Bail;\r
   }\r
 \r
   //\r
@@ -421,7 +420,7 @@ SataControllerStart (
   SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));\r
   if (SataPrivateData == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto ClosePciIo;\r
   }\r
 \r
   //\r
@@ -444,7 +443,9 @@ SataControllerStart (
                         sizeof (PciData.Hdr.ClassCode),\r
                         PciData.Hdr.ClassCode\r
                         );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    goto FreeSataPrivateData;\r
+  }\r
 \r
   if (IS_PCI_IDE (&PciData)) {\r
     SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;\r
@@ -467,19 +468,19 @@ SataControllerStart (
   SataPrivateData->DisqualifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);\r
   if (SataPrivateData->DisqualifiedModes == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeSataPrivateData;\r
   }\r
 \r
   SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof (EFI_IDENTIFY_DATA)) * ChannelDeviceCount);\r
   if (SataPrivateData->IdentifyData == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeDisqualifiedModes;\r
   }\r
 \r
   SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount);\r
   if (SataPrivateData->IdentifyValid == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
+    goto FreeIdentifyData;\r
   }\r
 \r
   //\r
@@ -492,31 +493,35 @@ SataControllerStart (
                   NULL\r
                   );\r
 \r
-Done:\r
   if (EFI_ERROR (Status)) {\r
-\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiPciIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-    if (SataPrivateData != NULL) {\r
-      if (SataPrivateData->DisqualifiedModes != NULL) {\r
-        FreePool (SataPrivateData->DisqualifiedModes);\r
-      }\r
-      if (SataPrivateData->IdentifyData != NULL) {\r
-        FreePool (SataPrivateData->IdentifyData);\r
-      }\r
-      if (SataPrivateData->IdentifyValid != NULL) {\r
-        FreePool (SataPrivateData->IdentifyValid);\r
-      }\r
-      FreePool (SataPrivateData);\r
-    }\r
+    goto FreeIdentifyValid;\r
   }\r
 \r
   DEBUG ((EFI_D_INFO, "SataControllerStart END status = %r\n", Status));\r
+  return Status;\r
+\r
+FreeIdentifyValid:\r
+  FreePool (SataPrivateData->IdentifyValid);\r
+\r
+FreeIdentifyData:\r
+  FreePool (SataPrivateData->IdentifyData);\r
+\r
+FreeDisqualifiedModes:\r
+  FreePool (SataPrivateData->DisqualifiedModes);\r
+\r
+FreeSataPrivateData:\r
+  FreePool (SataPrivateData);\r
+\r
+ClosePciIo:\r
+  gBS->CloseProtocol (\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
+Bail:\r
+  DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));\r
   return Status;\r
 }\r
 \r