From a44dac81be12a62ff52be954aab63bdfe6e643dd Mon Sep 17 00:00:00 2001 From: Adrien Ricciardi Date: Mon, 24 Jun 2024 18:08:23 +0200 Subject: [PATCH] fs: nvs: Improve nvs_calc_free_space() result precision The nvs_calc_free_space() function does not return 0 when the NVS is considered full, because some special ATEs are not taken into account. This commit takes into account the ATE that is reserved for deletion in each sector, in addition of the 'GC done' ATE when present. (cherry picked from commit 08496ff6b4497888e6beee0aebb354eb92bcf8d2) Original-Signed-off-by: Adrien Ricciardi GitOrigin-RevId: 08496ff6b4497888e6beee0aebb354eb92bcf8d2 Change-Id: I53ec160b59b5f9038d5ca363367cdc8e6cb7435d Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/zephyr/+/5663173 Tested-by: ChromeOS Prod (Robot) Tested-by: Ting Shen Reviewed-by: Ting Shen Commit-Queue: Ting Shen --- subsys/fs/nvs/nvs.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/subsys/fs/nvs/nvs.c b/subsys/fs/nvs/nvs.c index da35fae89e2..d709333de04 100644 --- a/subsys/fs/nvs/nvs.c +++ b/subsys/fs/nvs/nvs.c @@ -1309,7 +1309,11 @@ ssize_t nvs_calc_free_space(struct nvs_fs *fs) free_space = 0; for (uint16_t i = 1; i < fs->sector_count; i++) { - free_space += (fs->sector_size - ate_size); + /* + * There is always a closing ATE and a reserved ATE for + * deletion in each sector + */ + free_space += (fs->sector_size - (2 * ate_size)); } step_addr = fs->ate_wra; @@ -1333,11 +1337,17 @@ ssize_t nvs_calc_free_space(struct nvs_fs *fs) } } - if ((wlk_addr == step_addr) && step_ate.len && - (nvs_ate_valid(fs, &step_ate))) { - /* count needed */ - free_space -= nvs_al_size(fs, step_ate.len); - free_space -= ate_size; + if (nvs_ate_valid(fs, &step_ate)) { + /* Take into account the GC done ATE if it is present */ + if (step_ate.len == 0) { + if (step_ate.id == 0xFFFF) { + free_space -= ate_size; + } + } else if (wlk_addr == step_addr) { + /* count needed */ + free_space -= nvs_al_size(fs, step_ate.len); + free_space -= ate_size; + } } if (step_addr == fs->ate_wra) {