mirror of
https://github.com/littlefs-project/littlefs.git
synced 2025-12-01 12:20:02 +00:00
Reworked how filesystem-level config is stored
Now, instead of storing a single contiguous block of config data, config
is stored as tagged metadata like any other attribute.
This allows more flexibility towards adding/removing config in the
future, without cluttering up the config with deprecated entries (see
ATA's "IDENTIFY DEVICE" response).
Most of the config entries are single leb128 limits on various integer
types, with the exception of the magic string and version (major/minor
pair).
---
Note this also includes some semantic changes to the config:
- Limits are stored as size-1. This avoid issues with integer overflow
at extreme ranges.
This was also adopted for block size (block limit) and block count
(disk limit). This deviation between on-disk config and user-facing
config risks confusion, but allows the potential for the full 2^31 range
for these values.
- The default cksum type, crc32c, has been changed to 0.
Originally this was 2 to allow the type to map to the crc width for
crc8, crc16, crc32c, crc64, etc. But dropping this idea and numbering
checksums as they are implemented simplifies things.
May come back to this.
- Storing these configs as attributes opens up of the option of on-disk
defaults when configs are missing.
I'm being a bit conservative with this one, as it's not clear to me if
we should prefer default configs (less code/storage, risk of untested
config parsing) or prefer explicit on-disk configs.
Currently the following have defaults since they seem the most obvious
to me:
- cksum type => defaults to crc32c
- redund type => defaults to parity (TODO, should this default to
no redund?)
- utag_limit => defaults to 0x7f (no special tag decoding)
- uattr_limit => defaults to block_limit (implicit)
This commit is contained in:
@ -9,8 +9,19 @@ import struct
|
||||
|
||||
|
||||
TAG_NULL = 0x0000
|
||||
TAG_SUPERMAGIC = 0x0003
|
||||
TAG_SUPERCONFIG = 0x0004
|
||||
TAG_CONFIG = 0x0000
|
||||
TAG_MAGIC = 0x0003
|
||||
TAG_VERSION = 0x0004
|
||||
TAG_FLAGS = 0x0005
|
||||
TAG_CKSUMTYPE = 0x0006
|
||||
TAG_REDUNDTYPE = 0x0007
|
||||
TAG_BLOCKLIMIT = 0x0008
|
||||
TAG_DISKLIMIT = 0x0009
|
||||
TAG_MLEAFLIMIT = 0x000a
|
||||
TAG_SIZELIMIT = 0x000b
|
||||
TAG_NAMELIMIT = 0x000c
|
||||
TAG_UTAGLIMIT = 0x000d
|
||||
TAG_UATTRLIMIT = 0x000e
|
||||
TAG_GSTATE = 0x0100
|
||||
TAG_GRM = 0x0100
|
||||
TAG_NAME = 0x0200
|
||||
@ -122,12 +133,21 @@ def tagrepr(tag, w, size, off=None):
|
||||
return 'null%s%s' % (
|
||||
' w%d' % w if w else '',
|
||||
' %d' % size if size else '')
|
||||
elif tag == TAG_SUPERMAGIC:
|
||||
return 'supermagic%s %d' % (
|
||||
' w%d' % w if w else '',
|
||||
size)
|
||||
elif tag == TAG_SUPERCONFIG:
|
||||
return 'superconfig%s %d' % (
|
||||
elif (tag & 0xff00) == TAG_CONFIG:
|
||||
return '%s%s %d' % (
|
||||
'magic' if tag == TAG_MAGIC
|
||||
else 'version' if tag == TAG_VERSION
|
||||
else 'flags' if tag == TAG_FLAGS
|
||||
else 'cksumtype' if tag == TAG_CKSUMTYPE
|
||||
else 'redundtype' if tag == TAG_REDUNDTYPE
|
||||
else 'blocklimit' if tag == TAG_BLOCKLIMIT
|
||||
else 'disklimit' if tag == TAG_DISKLIMIT
|
||||
else 'mleaflimit' if tag == TAG_MLEAFLIMIT
|
||||
else 'sizelimit' if tag == TAG_SIZELIMIT
|
||||
else 'namelimit' if tag == TAG_NAMELIMIT
|
||||
else 'utaglimit' if tag == TAG_UTAGLIMIT
|
||||
else 'uattrlimit' if tag == TAG_UATTRLIMIT
|
||||
else 'config 0x%02x' % (tag & 0xff),
|
||||
' w%d' % w if w else '',
|
||||
size)
|
||||
elif (tag & 0xff00) == TAG_GSTATE:
|
||||
|
||||
Reference in New Issue
Block a user