]> 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 fc04363eba41d2d92d13855adfb16933cc9b8679..f53c3d91d030b64bed1e0437f1786d90e7a0aaf5 100644 (file)
@@ -354,6 +354,7 @@ DiskIoDriverBindingStop (
 /**\r
   Destroy the sub task.\r
 \r
+  @param Instance     Pointer to the DISK_IO_PRIVATE_DATA.\r
   @param Subtask      Subtask.\r
 \r
   @return LIST_ENTRY *  Pointer to the next link of subtask.\r
@@ -402,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
@@ -413,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
@@ -641,7 +627,7 @@ DiskIoCreateSubtaskList (
       InsertTailList (Subtasks, &Subtask->Link);\r
     }\r
 \r
-    Subtask = DiskIoCreateSubtask (Write, OverRunLba, 0, OverRun, WorkingBuffer, BufferPtr, Blocking);\r
+    Subtask = DiskIoCreateSubtask (Write, OverRunLba, 0, OverRun, WorkingBuffer, BufferPtr + BufferSize, Blocking);\r
     if (Subtask == NULL) {\r
       goto Done;\r
     }\r
@@ -808,7 +794,7 @@ DiskIo2ReadWriteDisk (
   BlockIo2  = Instance->BlockIo2;\r
   Media     = BlockIo->Media;\r
   Status    = EFI_SUCCESS;\r
-  Blocking  = ((Token == NULL) || (Token->Event == NULL));\r
+  Blocking  = (BOOLEAN) ((Token == NULL) || (Token->Event == NULL));\r
 \r
   if (Media->MediaId != MediaId) {\r
     return EFI_MEDIA_CHANGED;\r
@@ -960,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