[U-Boot] [PATCH] fw_setenv: avoid writing environment when nothing has changed
Alex Kiernan
alex.kiernan at gmail.com
Mon Sep 24 07:42:26 UTC 2018
On Wed, Sep 5, 2018 at 8:23 PM Rasmus Villemoes
<rasmus.villemoes at prevas.dk> wrote:
>
> In the case where one deletes an already-non-existing variable, or sets
> a variable to the value it already has, there is no point in writing the
> environment back, thus reducing wear on the underlying storage
> device.
>
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
If you were running with a redundant env, and you were trying to sync
both copies, wouldn't you want a non-changing write to happen?
> ---
> tools/env/fw_env.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
> index a5d75958e1..87aaa15198 100644
> --- a/tools/env/fw_env.c
> +++ b/tools/env/fw_env.c
> @@ -110,6 +110,7 @@ struct environment {
> unsigned char *flags;
> char *data;
> enum flag_scheme flag_scheme;
> + int dirty;
> };
>
> static struct environment environment = {
> @@ -508,6 +509,9 @@ int fw_env_flush(struct env_opts *opts)
> if (!opts)
> opts = &default_opts;
>
> + if (!environment.dirty)
> + return 0;
> +
> /*
> * Update CRC
> */
> @@ -553,7 +557,8 @@ int fw_env_write(char *name, char *value)
>
> deleting = (oldval && !(value && strlen(value)));
> creating = (!oldval && (value && strlen(value)));
> - overwriting = (oldval && (value && strlen(value)));
> + overwriting = (oldval && (value && strlen(value) &&
> + strcmp(oldval, value)));
>
> /* check for permission */
> if (deleting) {
> @@ -593,6 +598,7 @@ int fw_env_write(char *name, char *value)
> /* Nothing to do */
> return 0;
>
> + environment.dirty = 1;
> if (deleting || overwriting) {
> if (*++nxt == '\0') {
> *env = '\0';
> @@ -1441,6 +1447,7 @@ int fw_env_open(struct env_opts *opts)
> "Warning: Bad CRC, using default environment\n");
> memcpy(environment.data, default_environment,
> sizeof(default_environment));
> + environment.dirty = 1;
> }
> } else {
> flag0 = *environment.flags;
> @@ -1503,6 +1510,7 @@ int fw_env_open(struct env_opts *opts)
> "Warning: Bad CRC, using default environment\n");
> memcpy(environment.data, default_environment,
> sizeof(default_environment));
> + environment.dirty = 1;
> dev_current = 0;
> } else {
> switch (environment.flag_scheme) {
> --
> 2.16.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
--
Alex Kiernan
More information about the U-Boot
mailing list