
On 06/26/2013 01:25:26 PM, Phil Sutter wrote:
Without this patch, when the currently chosen environment to be written has bad blocks, saveenv fails completely. Instead, when there is redundant environment fall back to the other copy. Environment reading needs no adjustment, as the fallback logic for incomplete writes applies to this case as well.
Signed-off-by: Phil Sutter phil.sutter@viprinet.com
common/env_nand.c | 105 ++++++++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 59 deletions(-)
Missing description of changes since v2
-#else /* ! CONFIG_ENV_OFFSET_REDUND */
+static unsigned char env_flags;
env_nand.c:193:22: warning: 'env_flags' defined but not used [-Wunused-variable]
(when CONFIG_ENV_OFFSET_REDUND is not defined)
int saveenv(void) { int ret = 0; ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); ssize_t len; char *res;
- int env_idx; nand_erase_options_t nand_erase_options;
- static const struct env_location location[] = {
{
.name = "NAND",
.erase_opts = &nand_erase_options,
.offset = CONFIG_ENV_OFFSET,
},
+#ifdef CONFIG_ENV_OFFSET_REDUND
{
.name = "redundant NAND",
.erase_opts = &nand_erase_options,
.offset = CONFIG_ENV_OFFSET_REDUND,
},
+#endif
- };
env_nand.c:206:4: error: initializer element is not constant env_nand.c:206:4: error: (near initialization for 'location[0].erase_opts')
You could make nand_erase_options static, or you could use code to assign that field.
Is this code untested, or did you accidentally send an old version?
- puts("Writing to Nand... ");
- if (writeenv(CONFIG_ENV_OFFSET, (u_char *)env_new)) {
puts("FAILED!\n");
return 1;
- ret = erase_and_write_env(&location[env_idx], (u_char
*)env_new);
env_nand.c:237:2: warning: passing argument 1 of 'erase_and_write_env' discards 'const' qualifier from pointer target type [enabled by default] env_nand.c:177:12: note: expected 'struct env_location *' but argument is of type 'const struct env_location *'
+#ifdef CONFIG_ENV_OFFSET_REDUND
- if (ret) {
env_idx = (env_idx + 1) & 1;
ret = erase_and_write_env(&location[env_idx],
(u_char *)env_new);
Can you print a message here specifically saying that redundancy has been lost? I realize that the previous erase_and_write_env will have printed "FAILED", but it'd be nice to be explicit about the consequences.
-Scott