On 21/02/2021 09:47, Masahiro Yamada wrote: > On Tue, Feb 16, 2021 at 3:14 AM Mickaël Salaün <mic@xxxxxxxxxxx> wrote: >> >> From: Mickaël Salaün <mic@xxxxxxxxxxxxxxxxxxx> >> >> Content of string configuration may depend on related kernel >> configurations. Modify oldconfig and syncconfig to inform users about >> possible required configuration update and give them the opportunity to >> update it: >> * if dependencies of this string has changed (e.g. enabled or disabled), >> * and if the current value of this string is different than the (new) >> default one. >> >> This is particularly relevant for CONFIG_LSM which contains a list of >> LSMs enabled at boot, but users will not have a chance to update this >> list with a make oldconfig. > > If CONFIG_LSM already exists in the .config, > oldconfig does not show a prompt. > This is the expected behavior. It is not the behavior wished for LSM stacking. > > You are trying to fix your problem in a wrong way. > NACK. What do you suggest to ensure that users will be asked to update the CONFIG_LSM string if they add or remove an LSM? > > > >> >> Cc: Casey Schaufler <casey@xxxxxxxxxxxxxxxx> >> Cc: James Morris <jmorris@xxxxxxxxx> >> Cc: Masahiro Yamada <masahiroy@xxxxxxxxxx> >> Cc: Serge E. Hallyn <serge@xxxxxxxxxx> >> Signed-off-by: Mickaël Salaün <mic@xxxxxxxxxxxxxxxxxxx> >> Link: https://lore.kernel.org/r/20210215181511.2840674-3-mic@xxxxxxxxxxx >> --- >> scripts/kconfig/conf.c | 37 ++++++++++++++++++++++++++++++++++--- >> 1 file changed, 34 insertions(+), 3 deletions(-) >> >> diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c >> index 18a233d27a8d..8633dacd39a9 100644 >> --- a/scripts/kconfig/conf.c >> +++ b/scripts/kconfig/conf.c >> @@ -82,6 +82,26 @@ static void xfgets(char *str, int size, FILE *in) >> printf("%s", str); >> } >> >> +static bool may_need_string_update(struct symbol *sym, const char *def) >> +{ >> + const struct symbol *dep_sym; >> + const struct expr *e; >> + >> + if (sym->type != S_STRING) >> + return false; >> + if (strcmp(def, sym_get_string_default(sym)) == 0) >> + return false; >> + /* >> + * The user may want to synchronize the content of a string related to >> + * changed dependencies (e.g. CONFIG_LSM). >> + */ >> + expr_list_for_each_sym(sym->dir_dep.expr, e, dep_sym) { >> + if (dep_sym->flags & SYMBOL_CHANGED) >> + return true; >> + } >> + return false; >> +} >> + >> static int conf_askvalue(struct symbol *sym, const char *def) >> { >> enum symbol_type type = sym_get_type(sym); >> @@ -102,7 +122,7 @@ static int conf_askvalue(struct symbol *sym, const char *def) >> switch (input_mode) { >> case oldconfig: >> case syncconfig: >> - if (sym_has_value(sym)) { >> + if (sym_has_value(sym) && !may_need_string_update(sym, def)) { >> printf("%s\n", def); >> return 0; >> } >> @@ -137,8 +157,19 @@ static int conf_string(struct menu *menu) >> printf("%*s%s ", indent - 1, "", menu->prompt->text); >> printf("(%s) ", sym->name); >> def = sym_get_string_value(sym); >> - if (def) >> - printf("[%s] ", def); >> + if (def) { >> + if (may_need_string_update(sym, def)) { >> + indent += 2; >> + printf("\n%*sDefault value is [%s]\n", >> + indent - 1, "", >> + sym_get_string_default(sym)); >> + printf("%*sCurrent value is [%s] ", >> + indent - 1, "", def); >> + indent -= 2; >> + } else { >> + printf("[%s] ", def); >> + } >> + } >> if (!conf_askvalue(sym, def)) >> return 0; >> switch (line[0]) { >> -- >> 2.30.0 >> > >