]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIo.c
Fix 3 bugs in DiskIoDxe and PartitionDxe drivers introduced in DiskIo2 implementation.
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / DiskIoDxe / DiskIo.c
index ba61300911fdaed12ca10d2ae9e1f31f6605940e..f53c3d91d030b64bed1e0437f1786d90e7a0aaf5 100644 (file)
@@ -403,8 +403,6 @@ DiskIo2OnReadWriteComplete (
   EFI_STATUS            TransactionStatus;\r
   DISK_IO_PRIVATE_DATA  *Instance;\r
 \r
-  gBS->CloseEvent (Event);\r
-\r
   Subtask           = (DISK_IO_SUBTASK *) Context;\r
   TransactionStatus = Subtask->BlockIo2Token.TransactionStatus;\r
   Task              = Subtask->Task;\r
@@ -414,26 +412,13 @@ DiskIo2OnReadWriteComplete (
   ASSERT (Instance->Signature == DISK_IO_PRIVATE_DATA_SIGNATURE);\r
   ASSERT (Task->Signature     == DISK_IO2_TASK_SIGNATURE);\r
 \r
-  if (Subtask->WorkingBuffer != NULL) {\r
-    if (!EFI_ERROR (TransactionStatus) && (Task->Token != NULL) && !Subtask->Write) {\r
-      CopyMem (Subtask->Buffer, Subtask->WorkingBuffer + Subtask->Offset, Subtask->Length);\r
-    }\r
-\r
-    //\r
-    // The WorkingBuffer of blocking subtask either points to SharedWorkingBuffer\r
-    // or will be used by non-blocking subtask which will be freed below.\r
-    //\r
-    if (!Subtask->Blocking) {\r
-      FreeAlignedPages (\r
-        Subtask->WorkingBuffer, \r
-        Subtask->Length < Instance->BlockIo->Media->BlockSize\r
-        ? EFI_SIZE_TO_PAGES (Instance->BlockIo->Media->BlockSize)\r
-        : EFI_SIZE_TO_PAGES (Subtask->Length)\r
-        );\r
-    }\r
+  if ((Subtask->WorkingBuffer != NULL) && !EFI_ERROR (TransactionStatus) && \r
+      (Task->Token != NULL) && !Subtask->Write\r
+     ) {\r
+    CopyMem (Subtask->Buffer, Subtask->WorkingBuffer + Subtask->Offset, Subtask->Length);\r
   }\r
-  RemoveEntryList (&Subtask->Link);\r
-  FreePool (Subtask);\r
+\r
+  DiskIoDestroySubtask (Instance, Subtask);\r
 \r
   if (EFI_ERROR (TransactionStatus) || IsListEmpty (&Task->Subtasks)) {\r
     if (Task->Token != NULL) {\r
@@ -961,7 +946,7 @@ DiskIo2ReadWriteDisk (
     RemoveEntryList (&Task->Link);\r
     EfiReleaseLock (&Instance->TaskQueueLock);\r
 \r
-    if (Task->Token != NULL) {\r
+    if (!EFI_ERROR (Status) && (Task->Token != NULL)) {\r
       //\r
       // Task->Token should be set to NULL by the DiskIo2OnReadWriteComplete\r
       // It it's not, that means the non-blocking request was downgraded to blocking request.\r