Merge branch 'bugfix/nvs_flash_space_reclaim_v5.3' into 'release/v5.3'

fix(nvs_flash): Fixed sequence of page state changes to allow correct recovery when power is interrupted (v5.3)

See merge request espressif/esp-idf!44938
This commit is contained in:
Martin Vychodil
2026-01-13 04:25:40 +08:00

View File

@@ -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;