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
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
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
ControllerHandle\r
);\r
//\r
- // Close Parent BlockIO2 if has.\r
+ // Close Parent DiskIo2 if has.\r
// \r
gBS->CloseProtocol (\r
ControllerHandle,\r
- &gEfiBlockIo2ProtocolGuid,\r
+ &gEfiDiskIo2ProtocolGuid,\r
This->DriverBindingHandle,\r
ControllerHandle\r
);\r
\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL,\r
- TPL_CALLBACK,\r
+ TPL_NOTIFY,\r
PartitionOnAccessComplete,\r
Task,\r
&Task->DiskIo2Token.Event\r