forked from Imagelibrary/littlefs
Reworked config tags, adopted rflags/wflags/oflags
The biggest change here is the breaking up of the FLAGS config into RFLAGS/WFLAGS/OFLAGS. This is directly inspired by, and honestly not much more than a renaming, of the compat/ro_compat/incompat flags found in Linux/Unix/POSIX filesystems. I think these were first introduced in ext2? But I need to do a bit more research on that. RFLAGS/WFLAGS/OFLAGS provide a much more flexible, and extensible, feature flag mechanism than the previous minor version bumps. The (re)naming of these flags is intended to make their requirements more clear. In order to do the relevant operation, you must understand every flag set in the relevant flag: - RFLAGS / incompat flags - All flags must be understood to read the filesystem, if not understood the only possible behavior is to fail. - WFLAGS / ro-compat flags - All flags must be understood to write to the filesystem, if not understood the filesystem may be mounted read-only. - OFLAGS / compat flags - Optional flags, if not understood the relevant flag must be cleared before the filesystem can be written to, but other than that these flags can mostly be ignored. Some hypothetical littlefs examples: - RFLAGS / incompat flags - Transparent compression Is this the same as a major disk-version break? Yes kinda? An implementation that doesn't understand compression can't read the filesystem. On the other hand, it's useful to have a filesystem that can read both compressed and uncompressed variants. - WFLAGS / ro-compat flags - Closed block-map The idea behind a closed block-map (currently planned), is that littlefs maintains in global space a complete mapping of all blocks in use by the filesystem. For such a mapping to remain consistent means that if you write to the filesystem you must understand the closed block-map. Or in other words, if you don't understand the closed block-map you must not write to the filesystem. Reading, on the other hand, can ignore many such write-related auxiliary features, so the filesystem can still be read from. - OFLAGS / compat flags - Global checksums Global checksums (currently planned) are extra checksums attached to each mdir that when combined self-validate the filesystem. But if you don't understand global checksums, you can still read and write the filesystem without them. The only catch is that when you write to the filesystem, you may end up invalidating the global checksum. Clearing the global checksum bit in the OFLAGS is a cheap way to signal that the global checksum is no longer valid, allowing you to still write to the filesystem without this optional feature. Other tweaks to note: - Renamed BLOCKLIMIT/DISKLIMIT -> BLOCKSIZE/BLOCKCOUNT Note these are still the _actual_ block_size/block_count minus 1. The subtle difference here was the original reason for the name change, but after working with it for a bit, I just don't think new, otherwise unused, names are worth it. The minus 1 stays, however, since it avoids overflow issues at extreme boundaries of powers of 2. - Introduces STAGLIMIT/SATTRLIMIT, sys-attribute parallels to UTAGLIMIT/UATTRLIMIT. These may be useful if only uattrs are supported, or vice-versa. - Dropped UATTRLIMIT/SATTRLIMIT to 255 bytes. This feels extreme, but matches NAMELIMIT. These _should_ be small, and limiting the uattr/sattr size to a single-byte leads to really nice packing of the utag+uattrsize in a single integer. This can always be expanded in the future if this limit proves to be a problem. - Renamed MLEAFLIMIT -> MDIRLIMIT and (re?)introduced MTREELIMIT. These may be useful to limiting the mtree when needed, though it's not clear the exact use case quite yet.
This commit is contained in:
@@ -21,16 +21,19 @@ TAG_NULL = 0x0000
|
||||
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_RFLAGS = 0x0005
|
||||
TAG_WFLAGS = 0x0006
|
||||
TAG_OFLAGS = 0x0007
|
||||
TAG_BLOCKSIZE = 0x0008
|
||||
TAG_BLOCKCOUNT = 0x0009
|
||||
TAG_NAMELIMIT = 0x000a
|
||||
TAG_SIZELIMIT = 0x000b
|
||||
TAG_NAMELIMIT = 0x000c
|
||||
TAG_UTAGLIMIT = 0x000d
|
||||
TAG_UATTRLIMIT = 0x000e
|
||||
TAG_UTAGLIMIT = 0x000c
|
||||
TAG_UATTRLIMIT = 0x000d
|
||||
TAG_STAGLIMIT = 0x000e
|
||||
TAG_SATTRLIMIT = 0x000f
|
||||
TAG_MDIRLIMIT = 0x0010
|
||||
TAG_MTREELIMIT = 0x0011
|
||||
TAG_GSTATE = 0x0100
|
||||
TAG_GRM = 0x0100
|
||||
TAG_NAME = 0x0200
|
||||
@@ -144,16 +147,19 @@ def tagrepr(tag, w, size, off=None):
|
||||
'shrub' if tag & TAG_SHRUB else '',
|
||||
'magic' if (tag & 0xfff) == TAG_MAGIC
|
||||
else 'version' if (tag & 0xfff) == TAG_VERSION
|
||||
else 'flags' if (tag & 0xfff) == TAG_FLAGS
|
||||
else 'cksumtype' if (tag & 0xfff) == TAG_CKSUMTYPE
|
||||
else 'redundtype' if (tag & 0xfff) == TAG_REDUNDTYPE
|
||||
else 'blocklimit' if (tag & 0xfff) == TAG_BLOCKLIMIT
|
||||
else 'disklimit' if (tag & 0xfff) == TAG_DISKLIMIT
|
||||
else 'mleaflimit' if (tag & 0xfff) == TAG_MLEAFLIMIT
|
||||
else 'rflags' if (tag & 0xfff) == TAG_RFLAGS
|
||||
else 'wflags' if (tag & 0xfff) == TAG_WFLAGS
|
||||
else 'oflags' if (tag & 0xfff) == TAG_OFLAGS
|
||||
else 'blocksize' if (tag & 0xfff) == TAG_BLOCKSIZE
|
||||
else 'blockcount' if (tag & 0xfff) == TAG_BLOCKCOUNT
|
||||
else 'sizelimit' if (tag & 0xfff) == TAG_SIZELIMIT
|
||||
else 'namelimit' if (tag & 0xfff) == TAG_NAMELIMIT
|
||||
else 'utaglimit' if (tag & 0xfff) == TAG_UTAGLIMIT
|
||||
else 'uattrlimit' if (tag & 0xfff) == TAG_UATTRLIMIT
|
||||
else 'staglimit' if (tag & 0xfff) == TAG_STAGLIMIT
|
||||
else 'sattrlimit' if (tag & 0xfff) == TAG_SATTRLIMIT
|
||||
else 'mdirlimit' if (tag & 0xfff) == TAG_MDIRLIMIT
|
||||
else 'mtreelimit' if (tag & 0xfff) == TAG_MTREELIMIT
|
||||
else 'config 0x%02x' % (tag & 0xff),
|
||||
' w%d' % w if w else '',
|
||||
size)
|
||||
|
||||
Reference in New Issue
Block a user