Skip to content

Commit 44521ba

Browse files
committed
settings: zms: recover linked list if broken
When the linked list is broken, recover it instead of reinitializing it. Signed-off-by: Riadh Ghaddab <[email protected]>
1 parent d5b8797 commit 44521ba

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

subsys/settings/src/settings_zms.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -604,21 +604,36 @@ static int settings_zms_get_last_hash_ids(struct settings_zms *cf)
604604
rc = zms_read(&cf->cf_zms, ll_last_hash_id, &settings_element,
605605
sizeof(settings_element));
606606
if (rc == -ENOENT) {
607-
/* header doesn't exist or linked list broken, reinitialize the header */
608-
const struct settings_hash_linked_list settings_element = {
609-
.previous_hash = 0, .next_hash = 0};
610-
rc = zms_write(&cf->cf_zms, ZMS_LL_HEAD_HASH_ID, &settings_element,
611-
sizeof(struct settings_hash_linked_list));
612-
if (rc < 0) {
613-
return rc;
614-
}
615-
cf->last_hash_id = ZMS_LL_HEAD_HASH_ID;
616-
cf->second_to_last_hash_id = 0;
607+
/* header doesn't exist or linked list broken, reinitialize the header
608+
* if it doesn't exist and recover it if it is broken
609+
*/
610+
if (ll_last_hash_id == ZMS_LL_HEAD_HASH_ID) {
611+
/* header doesn't exist */
612+
const struct settings_hash_linked_list settings_element = {
613+
.previous_hash = 0, .next_hash = 0};
614+
rc = zms_write(&cf->cf_zms, ZMS_LL_HEAD_HASH_ID, &settings_element,
615+
sizeof(struct settings_hash_linked_list));
616+
if (rc < 0) {
617+
return rc;
618+
}
619+
cf->last_hash_id = ZMS_LL_HEAD_HASH_ID;
620+
cf->second_to_last_hash_id = 0;
617621
#ifdef CONFIG_SETTINGS_ZMS_LL_CACHE
618-
/* store the LL header in cache */
619-
cf->ll_cache_next = 0;
620-
cf->ll_cache[cf->ll_cache_next++] = settings_element;
622+
/* store the LL header in cache */
623+
cf->ll_cache_next = 0;
624+
cf->ll_cache[cf->ll_cache_next++] = settings_element;
621625
#endif
626+
} else {
627+
/* let's recover it by keeping all nodes until the last one */
628+
const struct settings_hash_linked_list settings_element = {
629+
.previous_hash = cf->second_to_last_hash_id,
630+
.next_hash = 0};
631+
rc = zms_write(&cf->cf_zms, cf->last_hash_id, &settings_element,
632+
sizeof(struct settings_hash_linked_list));
633+
if (rc < 0) {
634+
return rc;
635+
}
636+
}
622637
return 0;
623638
} else if (rc < 0) {
624639
return rc;

0 commit comments

Comments
 (0)