// Check if there is enough free space for allocate a record\r
//\r
if ((MyOffset + WRITE_TOTAL_SIZE) > FtwLiteDevice->FtwWorkSpaceSize) {\r
- Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+ Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "FtwLite: Reclaim work space - %r", Status));\r
return EFI_ABORTED;\r
);\r
InitWorkSpaceHeader (FtwLiteDevice->FtwWorkSpaceHeader);\r
//\r
- // Write to work space on the working block\r
+ // Initialize the work space\r
//\r
- Length = FtwLiteDevice->FtwWorkSpaceSize;\r
- Status = FtwLiteDevice->FtwFvBlock->Write (\r
- FtwLiteDevice->FtwFvBlock,\r
- FtwLiteDevice->FtwWorkSpaceLba,\r
- FtwLiteDevice->FtwWorkSpaceBase,\r
- &Length,\r
- FtwLiteDevice->FtwWorkSpace\r
- );\r
+ Status = FtwReclaimWorkSpace (FtwLiteDevice, FALSE);\r
+\r
if (EFI_ERROR (Status)) {\r
return EFI_ABORTED;\r
}\r
FtwLiteDevice->FtwWorkSpaceSize - Offset\r
)) {\r
DEBUG ((EFI_D_FTW_LITE, "FtwLite: Workspace is dirty, call reclaim...\n"));\r
- Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+ Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_FTW_LITE, "FtwLite: Workspace reclaim - %r\n", Status));\r
return EFI_ABORTED;\r
)\r
;\r
\r
-/**\r
- Reclaim the work space. Get rid of all the completed write records\r
- and write records in the Fault Tolerant work space.\r
-\r
-\r
- @param FtwLiteDevice Point to private data of FTW driver\r
- FtwSpaceBuffer - Buffer to contain the reclaimed clean data\r
- @param BlockBuffer The data buffer for the block.\r
- @param BufferSize Size of the FtwSpaceBuffer\r
-\r
- @retval EFI_SUCCESS The function completed successfully\r
- @retval EFI_BUFFER_TOO_SMALL The FtwSpaceBuffer is too small\r
- @retval EFI_ABORTED The function could not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-CleanupWorkSpace (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- IN OUT UINT8 *BlockBuffer,\r
- IN UINTN BufferSize\r
- )\r
-;\r
-\r
/**\r
Reclaim the work space on the working block.\r
\r
\r
@param FtwLiteDevice Point to private data of FTW driver\r
+ @param PreserveRecord Whether to preserve the working record is needed\r
\r
@retval EFI_SUCCESS The function completed successfully\r
@retval EFI_OUT_OF_RESOURCES Allocate memory error\r
**/\r
EFI_STATUS\r
FtwReclaimWorkSpace (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice\r
+ IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
+ IN BOOLEAN PreserveRecord\r
)\r
;\r
\r
{\r
EFI_FTW_LITE_RECORD *Record;\r
\r
+ *FtwLastRecord = NULL;\r
Record = (EFI_FTW_LITE_RECORD *) (FtwLiteDevice->FtwWorkSpaceHeader + 1);\r
while (Record->WriteCompleted == FTW_VALID_STATE) {\r
//\r
//\r
// reclaim work space in working block.\r
//\r
- Status = FtwReclaimWorkSpace (FtwLiteDevice);\r
+ Status = FtwReclaimWorkSpace (FtwLiteDevice, TRUE);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_FTW_LITE, "FtwLite: Reclaim workspace - %r\n", Status));\r
return EFI_ABORTED;\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Reclaim the work space. Get rid of all the completed write records\r
- and write records in the Fault Tolerant work space.\r
-\r
-\r
- @param FtwLiteDevice Point to private data of FTW driver\r
- @param FtwSpaceBuffer Buffer to contain the reclaimed clean data\r
- @param BufferSize Size of the FtwSpaceBuffer\r
-\r
- @retval EFI_SUCCESS The function completed successfully\r
- @retval EFI_BUFFER_TOO_SMALL The FtwSpaceBuffer is too small\r
- @retval EFI_ABORTED The function could not complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-CleanupWorkSpace (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
- IN OUT UINT8 *FtwSpaceBuffer,\r
- IN UINTN BufferSize\r
- )\r
-{\r
- UINTN Length;\r
- EFI_FTW_LITE_RECORD *Record;\r
-\r
- //\r
- // To check if the buffer is large enough\r
- //\r
- Length = FtwLiteDevice->FtwWorkSpaceSize;\r
- if (BufferSize < Length) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
- //\r
- // Clear the content of buffer that will save the new work space data\r
- //\r
- SetMem (FtwSpaceBuffer, Length, FTW_ERASED_BYTE);\r
-\r
- //\r
- // Copy EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER to buffer\r
- //\r
- CopyMem (\r
- FtwSpaceBuffer,\r
- FtwLiteDevice->FtwWorkSpaceHeader,\r
- sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
- );\r
-\r
- //\r
- // Get the last record\r
- //\r
- Record = FtwLiteDevice->FtwLastRecord;\r
- if ((Record != NULL) && (Record->WriteAllocated == FTW_VALID_STATE) && (Record->WriteCompleted != FTW_VALID_STATE)) {\r
- CopyMem (\r
- (UINT8 *) FtwSpaceBuffer + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
- Record,\r
- WRITE_TOTAL_SIZE\r
- );\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
Reclaim the work space on the working block.\r
\r
**/\r
EFI_STATUS\r
FtwReclaimWorkSpace (\r
- IN EFI_FTW_LITE_DEVICE *FtwLiteDevice\r
+ IN EFI_FTW_LITE_DEVICE *FtwLiteDevice,\r
+ IN BOOLEAN PreserveRecord\r
)\r
{\r
EFI_STATUS Status;\r
UINTN SpareBufferSize;\r
UINT8 *SpareBuffer;\r
EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER *WorkingBlockHeader;\r
+ EFI_FTW_LITE_RECORD *Record;\r
\r
DEBUG ((EFI_D_FTW_LITE, "FtwLite: start to reclaim work space\n"));\r
\r
//\r
TempBufferSize = FtwLiteDevice->SpareAreaLength;\r
TempBuffer = AllocateZeroPool (TempBufferSize);\r
- if (TempBuffer != NULL) {\r
+ if (TempBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
((UINTN) (FtwLiteDevice->FtwWorkSpaceLba - FtwLiteDevice->FtwWorkBlockLba)) *\r
FtwLiteDevice->SizeOfSpareBlock + FtwLiteDevice->FtwWorkSpaceBase;\r
\r
- Status = CleanupWorkSpace (\r
- FtwLiteDevice,\r
- Ptr,\r
- FtwLiteDevice->FtwWorkSpaceSize\r
- );\r
+ //\r
+ // Clear the content of buffer that will save the new work space data\r
+ //\r
+ SetMem (Ptr, FtwLiteDevice->FtwWorkSpaceSize, FTW_ERASED_BYTE);\r
+\r
+ //\r
+ // Copy EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER to buffer\r
+ //\r
+ CopyMem (\r
+ Ptr,\r
+ FtwLiteDevice->FtwWorkSpaceHeader,\r
+ sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)\r
+ );\r
+ if (PreserveRecord) {\r
+ //\r
+ // Get the last record\r
+ //\r
+ Status = FtwGetLastRecord (FtwLiteDevice, &FtwLiteDevice->FtwLastRecord);\r
+ Record = FtwLiteDevice->FtwLastRecord;\r
+ if (!EFI_ERROR (Status) &&\r
+ Record != NULL &&\r
+ Record->WriteAllocated == FTW_VALID_STATE &&\r
+ Record->WriteCompleted != FTW_VALID_STATE) {\r
+ CopyMem (\r
+ (UINT8 *) Ptr + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER),\r
+ Record,\r
+ WRITE_TOTAL_SIZE\r
+ );\r
+ }\r
+ }\r
\r
CopyMem (\r
FtwLiteDevice->FtwWorkSpace,\r