diff --git a/configure.ac b/configure.ac index 777f495..04c2226 100644 --- a/configure.ac +++ b/configure.ac @@ -32,6 +32,15 @@ AC_DEFINE(DEBUG, [1], [Debug messages.]) ]) +AC_ARG_ENABLE([state-backward-compatibility], + AS_HELP_STRING([--enable-state-backward-compatibility], [keep the 'direct' storage backend backward compatible @<:@default=disabled@:>@]), + [], [enable_state_backward_compatibility=no]) +AS_IF([test "x${enable_state_backward_compatibility}" = "xyes"], [ + AC_DEFINE(CONFIG_STATE_BACKWARD_COMPATIBLE, [1], ['direct' storage backend backward compatibility.]) +], [ + AC_DEFINE(CONFIG_STATE_BACKWARD_COMPATIBLE, [0]) +]) + AC_CHECK_FUNCS([__secure_getenv secure_getenv]) my_CFLAGS="-Wall \ @@ -53,15 +62,16 @@ $PACKAGE $VERSION ===== - prefix: ${prefix} - sysconfdir: ${sysconfdir} - libdir: ${libdir} - includedir: ${includedir} + prefix: ${prefix} + sysconfdir: ${sysconfdir} + libdir: ${libdir} + includedir: ${includedir} - compiler: ${CC} - cflags: ${CFLAGS} - ldflags: ${LDFLAGS} + compiler: ${CC} + cflags: ${CFLAGS} + ldflags: ${LDFLAGS} - logging: ${enable_logging} - debug: ${enable_debug} + logging: ${enable_logging} + debug: ${enable_debug} + state-backward-compatibility: ${enable_state_backward_compatibility} ]) diff --git a/src/barebox-state.c b/src/barebox-state.c index 946a8db..6b166bf 100644 --- a/src/barebox-state.c +++ b/src/barebox-state.c @@ -439,6 +439,8 @@ exit(0); case OPT_VERSION: printf(PACKAGE_STRING "\n"); + printf("Configured with build-time option '--%s-state-backward-compatibility'.\n", + (CONFIG_STATE_BACKWARD_COMPATIBLE) ? "enable" : "disable"); exit(0); case 'g': sg = xzalloc(sizeof(*sg)); diff --git a/src/barebox-state/backend_bucket_direct.c b/src/barebox-state/backend_bucket_direct.c index 5b5506b..4522f01 100644 --- a/src/barebox-state/backend_bucket_direct.c +++ b/src/barebox-state/backend_bucket_direct.c @@ -75,6 +75,11 @@ } else { if (meta.magic != ~0 && !!meta.magic) bucket->wrong_magic = 1; + if (!IS_ENABLED(CONFIG_STATE_BACKWARD_COMPATIBLE)) { + dev_err(direct->dev, "No meta data header found\n"); + dev_dbg(direct->dev, "Enable backward compatibility or increase stride size\n"); + return -EINVAL; + } read_len = direct->max_size; if (lseek(direct->fd, direct->offset, SEEK_SET) != direct->offset) { @@ -110,20 +115,25 @@ int ret; struct state_backend_storage_bucket_direct_meta meta; - if (len > direct->max_size - sizeof(meta)) - return -E2BIG; - if (lseek(direct->fd, direct->offset, SEEK_SET) != direct->offset) { dev_err(direct->dev, "Failed to seek file, %d\n", -errno); return -errno; } - meta.magic = direct_magic; - meta.written_length = len; - ret = write_full(direct->fd, &meta, sizeof(meta)); - if (ret < 0) { - dev_err(direct->dev, "Failed to write metadata to file, %d\n", ret); - return ret; + /* write the meta data only if there is head room */ + if (len <= direct->max_size - sizeof(meta)) { + meta.magic = direct_magic; + meta.written_length = len; + ret = write_full(direct->fd, &meta, sizeof(meta)); + if (ret < 0) { + dev_err(direct->dev, "Failed to write metadata to file, %d\n", ret); + return ret; + } + } else { + if (!IS_ENABLED(CONFIG_STATE_BACKWARD_COMPATIBLE)) { + dev_dbg(direct->dev, "Too small stride size: must skip metadata! Increase stride size\n"); + return -EINVAL; + } } ret = write_full(direct->fd, buf, len);