| 134 | } |
| 135 | |
| 136 | EFI_STATUS |
| 137 | FatQueueTask ( |
| 138 | IN FAT_IFILE *IFile, |
| 139 | IN FAT_TASK *Task |
| 140 | ) |
| 141 | /*++ |
| 142 | |
| 143 | Routine Description: |
| 144 | |
| 145 | Execute the task |
| 146 | |
| 147 | Arguments: |
| 148 | |
| 149 | IFile - The instance of the open file. |
| 150 | Task - The task to be executed. |
| 151 | |
| 152 | Returns: |
| 153 | |
| 154 | EFI_SUCCESS - The task was executed sucessfully. |
| 155 | other - An error occurred when executing the task. |
| 156 | |
| 157 | --*/ |
| 158 | { |
| 159 | EFI_STATUS Status; |
| 160 | LIST_ENTRY *Link; |
| 161 | FAT_SUBTASK *Subtask; |
| 162 | |
| 163 | // |
| 164 | // Sometimes the Task doesn't contain any subtasks, signal the event directly. |
| 165 | // |
| 166 | if (IsListEmpty (&Task->Subtasks)) { |
| 167 | Task->FileIoToken->Status = EFI_SUCCESS; |
| 168 | gBS->SignalEvent (Task->FileIoToken->Event); |
| 169 | FreePool(Task); |
| 170 | return EFI_SUCCESS; |
| 171 | } |
| 172 | |
| 173 | EfiAcquireLock (&FatTaskLock); |
| 174 | InsertTailList (&IFile->Tasks, &Task->Link); |
| 175 | EfiReleaseLock (&FatTaskLock); |
| 176 | |
| 177 | Status = EFI_SUCCESS; |
| 178 | for ( Link = GetFirstNode (&Task->Subtasks) |
| 179 | ; !IsNull (&Task->Subtasks, Link) |
| 180 | ; Link = GetNextNode (&Task->Subtasks, Link) |
| 181 | ) { |
| 182 | Subtask = CR (Link, FAT_SUBTASK, Link, FAT_SUBTASK_SIGNATURE); |
| 183 | if (Subtask->Write) { |
| 184 | |
| 185 | Status = IFile->OFile->Volume->DiskIo2->WriteDiskEx ( |
| 186 | IFile->OFile->Volume->DiskIo2, |
| 187 | IFile->OFile->Volume->MediaId, |
| 188 | Subtask->Offset, |
| 189 | &Subtask->DiskIo2Token, |
| 190 | Subtask->BufferSize, |
| 191 | Subtask->Buffer |
| 192 | ); |
| 193 | } else { |
no test coverage detected