mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
fix(nvs_flash): Fixed order of page state change to allow recovery
This commit is contained in:
@@ -159,22 +159,25 @@ esp_err_t PageManager::requestNewPage()
|
||||
return ESP_ERR_NVS_NOT_ENOUGH_SPACE;
|
||||
}
|
||||
|
||||
esp_err_t err = activatePage();
|
||||
Page* erasedPage = maxUnusedItemsPageIt;
|
||||
|
||||
#ifndef NDEBUG
|
||||
size_t usedEntries = erasedPage->getUsedEntryCount();
|
||||
#endif
|
||||
esp_err_t err = erasedPage->markFreeing();
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
// Activating a new page first when markFreeing is done. The data recovery from power loss will be
|
||||
// driven by the existence of the (transitional) FREEING state of a page.
|
||||
err = activatePage();
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
Page* newPage = &mPageList.back();
|
||||
|
||||
Page* erasedPage = maxUnusedItemsPageIt;
|
||||
|
||||
#ifndef NDEBUG
|
||||
size_t usedEntries = erasedPage->getUsedEntryCount();
|
||||
#endif
|
||||
err = erasedPage->markFreeing();
|
||||
if (err != ESP_OK) {
|
||||
return err;
|
||||
}
|
||||
err = erasedPage->copyItems(*newPage);
|
||||
if (err != ESP_OK && err != ESP_ERR_NVS_NOT_FOUND) {
|
||||
return err;
|
||||
|
||||
Reference in New Issue
Block a user