Simplified how we check on-disk versions a bit
We don't really need to do full leb128 decoding since our version
numbers are unlikely to ever actually exceed v127.127.
Worst case, if they do, the version that exceeds v127.127 can switch to
using leb128 decoding without breaking backwards compatibility.
Version attr encoding:
.---+---+---+---+---+---. tag (0x0004): 1 be16 2 bytes
| x0004 | 0 | 2 |maj|min| weight (0): 1 leb128 1 byte
'---+---+---+---+---+---' size (2): 1 leb128 1 byte
major_version: 1 leb128 1 byte
minor_version: 1 leb128 1 byte
total: 6 bytes
Code changes:
code stack
before: 34124 2880
after: 34092 (-0.1%) 2880 (+0.0%)
This commit is contained in:
@@ -7924,30 +7924,18 @@ static int lfsr_mountmroot(lfs_t *lfs, const lfsr_mdir_t *mroot) {
|
||||
return err;
|
||||
}
|
||||
|
||||
uint32_t major_version;
|
||||
err = lfsr_data_readleb128(lfs, &data, &major_version);
|
||||
if (err && err != LFS_ERR_CORRUPT) {
|
||||
uint8_t version[2] = {0, 0};
|
||||
lfs_ssize_t d = lfsr_data_read(lfs, &data, version, 2);
|
||||
if (d < 0) {
|
||||
return err;
|
||||
}
|
||||
if (err == LFS_ERR_CORRUPT) {
|
||||
major_version = -1;
|
||||
}
|
||||
|
||||
uint32_t minor_version;
|
||||
err = lfsr_data_readleb128(lfs, &data, &minor_version);
|
||||
if (err && err != LFS_ERR_CORRUPT) {
|
||||
return err;
|
||||
}
|
||||
if (err == LFS_ERR_CORRUPT) {
|
||||
minor_version = -1;
|
||||
}
|
||||
|
||||
if (major_version != LFS_DISK_VERSION_MAJOR
|
||||
|| minor_version > LFS_DISK_VERSION_MINOR) {
|
||||
if (version[0] != LFS_DISK_VERSION_MAJOR
|
||||
|| version[1] > LFS_DISK_VERSION_MINOR) {
|
||||
LFS_ERROR("Incompatible version v%"PRId32".%"PRId32
|
||||
" (!= v%"PRId32".%"PRId32")",
|
||||
major_version,
|
||||
minor_version,
|
||||
version[0],
|
||||
version[1],
|
||||
LFS_DISK_VERSION_MAJOR,
|
||||
LFS_DISK_VERSION_MINOR);
|
||||
return LFS_ERR_INVAL;
|
||||
|
||||
Reference in New Issue
Block a user