From 1d4f77e284093e75ba9631fb4503c585dd36c530 Mon Sep 17 00:00:00 2001 From: Riadh Ghaddab Date: Sat, 22 Feb 2025 02:11:54 +0100 Subject: [PATCH] settings: zms: fix a bug related to the name's ID To avoid collisions between IDs used by settings and IDs used directly by subsystems using ZMS API, the MSB is always set to 1 for Setting's name ID written to ZMS backend Signed-off-by: Riadh Ghaddab (cherry picked from commit c9a33bbefabb262411985ee7237d040bb3cf2fa4) --- subsys/settings/include/settings/settings_zms.h | 3 +-- subsys/settings/src/settings_zms.c | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/subsys/settings/include/settings/settings_zms.h b/subsys/settings/include/settings/settings_zms.h index 5c8db6c8673..271291dba13 100644 --- a/subsys/settings/include/settings/settings_zms.h +++ b/subsys/settings/include/settings/settings_zms.h @@ -60,10 +60,9 @@ extern "C" { #define ZMS_COLLISIONS_MASK GENMASK(CONFIG_SETTINGS_ZMS_MAX_COLLISIONS_BITS, 1) #define ZMS_HASH_TOTAL_MASK GENMASK(29, 1) #define ZMS_MAX_COLLISIONS (BIT(CONFIG_SETTINGS_ZMS_MAX_COLLISIONS_BITS) - 1) -#define ZMS_HEADER_HASH 0x80000000 /* some useful macros */ -#define ZMS_NAME_HASH_ID(x) (x & ZMS_HASH_TOTAL_MASK) +#define ZMS_NAME_HASH_ID(x) ((x & ZMS_HASH_TOTAL_MASK) | BIT(31)) #define ZMS_UPDATE_COLLISION_NUM(x, y) \ ((x & ~ZMS_COLLISIONS_MASK) | ((y << 1) & ZMS_COLLISIONS_MASK)) #define ZMS_COLLISION_NUM(x) ((x & ZMS_COLLISIONS_MASK) >> 1) diff --git a/subsys/settings/src/settings_zms.c b/subsys/settings/src/settings_zms.c index abb8989c203..74b2ac2554f 100644 --- a/subsys/settings/src/settings_zms.c +++ b/subsys/settings/src/settings_zms.c @@ -232,6 +232,8 @@ static int settings_zms_save(struct settings_store *cs, const char *name, const delete = ((value == NULL) || (val_len == 0)); name_hash = sys_hash32(name, strlen(name)) & ZMS_HASH_MASK; + /* MSB is always 1 */ + name_hash |= BIT(31); /* Let's find out if there is no hash collisions in the storage */ write_name = true;