mirror of
https://github.com/littlefs-project/littlefs.git
synced 2025-12-01 12:20:02 +00:00
Moved most on-disk definitions into lfs3.h
Having on-disk definitions in one place is useful for referencing them later, even if they aren't relevant for most API users. .h files in C are already forced to expose a bunch of internal details anyways, in order to provide struct size/alignment. Might as well include on-disk information that would have even bigger consequences if it changed. Moved: - Compat flag definitions - Tag definitions - DSIZEs and relevant encoding comments - Note some of these were already required to define lfs3_t
This commit is contained in:
253
lfs3.c
253
lfs3.c
@ -1025,112 +1025,6 @@ static int lfs3_bd_cpyck(lfs3_t *lfs3,
|
||||
|
||||
/// Tags - lfs3_tag_t stuff ///
|
||||
|
||||
// 16-bit metadata tags
|
||||
enum lfs3_tag {
|
||||
// the null tag is reserved
|
||||
LFS3_TAG_NULL = 0x0000,
|
||||
|
||||
// config tags
|
||||
LFS3_TAG_CONFIG = 0x0000,
|
||||
LFS3_TAG_MAGIC = 0x0031,
|
||||
LFS3_TAG_VERSION = 0x0034,
|
||||
LFS3_TAG_RCOMPAT = 0x0035,
|
||||
LFS3_TAG_WCOMPAT = 0x0036,
|
||||
LFS3_TAG_OCOMPAT = 0x0037,
|
||||
LFS3_TAG_GEOMETRY = 0x0038,
|
||||
LFS3_TAG_NAMELIMIT = 0x0039,
|
||||
LFS3_TAG_FILELIMIT = 0x003a,
|
||||
// in-device only, to help find unknown config tags
|
||||
LFS3_TAG_UNKNOWNCONFIG = 0x003b,
|
||||
|
||||
// global-state tags
|
||||
LFS3_TAG_GDELTA = 0x0100,
|
||||
LFS3_TAG_GRMDELTA = 0x0100,
|
||||
LFS3_TAG_GBMAPDELTA = 0x0104,
|
||||
|
||||
// name tags
|
||||
LFS3_TAG_NAME = 0x0200,
|
||||
LFS3_TAG_BNAME = 0x0200,
|
||||
LFS3_TAG_REG = 0x0201,
|
||||
LFS3_TAG_DIR = 0x0202,
|
||||
LFS3_TAG_STICKYNOTE = 0x0203,
|
||||
LFS3_TAG_BOOKMARK = 0x0204,
|
||||
// in-device only name tags, these should never get written to disk
|
||||
LFS3_TAG_ORPHAN = 0x0205,
|
||||
LFS3_TAG_TRV = 0x0206,
|
||||
LFS3_TAG_UNKNOWN = 0x0207,
|
||||
// non-file name tags
|
||||
LFS3_TAG_MNAME = 0x0220,
|
||||
|
||||
// struct tags
|
||||
LFS3_TAG_STRUCT = 0x0300,
|
||||
LFS3_TAG_BRANCH = 0x0300,
|
||||
LFS3_TAG_DATA = 0x0304,
|
||||
LFS3_TAG_BLOCK = 0x0308,
|
||||
LFS3_TAG_DID = 0x0314,
|
||||
LFS3_TAG_BSHRUB = 0x0318,
|
||||
LFS3_TAG_BTREE = 0x031c,
|
||||
LFS3_TAG_MROOT = 0x0321,
|
||||
LFS3_TAG_MDIR = 0x0325,
|
||||
LFS3_TAG_MTREE = 0x032c,
|
||||
LFS3_TAG_BMRANGE = 0x0330,
|
||||
LFS3_TAG_BMFREE = 0x0330,
|
||||
LFS3_TAG_BMINUSE = 0x0331,
|
||||
LFS3_TAG_BMERASED = 0x0332,
|
||||
LFS3_TAG_BMBAD = 0x0333,
|
||||
|
||||
// user/sys attributes
|
||||
LFS3_TAG_ATTR = 0x0400,
|
||||
LFS3_TAG_UATTR = 0x0400,
|
||||
LFS3_TAG_SATTR = 0x0500,
|
||||
|
||||
// shrub tags belong to secondary trees
|
||||
LFS3_TAG_SHRUB = 0x1000,
|
||||
|
||||
// alt pointers form the inner nodes of our rbyd trees
|
||||
LFS3_TAG_ALT = 0x4000,
|
||||
LFS3_TAG_B = 0x0000,
|
||||
LFS3_TAG_R = 0x2000,
|
||||
LFS3_TAG_LE = 0x0000,
|
||||
LFS3_TAG_GT = 0x1000,
|
||||
|
||||
// checksum tags
|
||||
LFS3_TAG_CKSUM = 0x3000,
|
||||
LFS3_TAG_PHASE = 0x0003,
|
||||
LFS3_TAG_PERTURB = 0x0004,
|
||||
LFS3_TAG_NOTE = 0x3100,
|
||||
LFS3_TAG_ECKSUM = 0x3200,
|
||||
LFS3_TAG_GCKSUMDELTA = 0x3300,
|
||||
|
||||
// in-device only tags, these should never get written to disk
|
||||
LFS3_TAG_INTERNAL = 0x0800,
|
||||
LFS3_TAG_RATTRS = 0x0800,
|
||||
LFS3_TAG_SHRUBCOMMIT = 0x0801,
|
||||
LFS3_TAG_GRMPUSH = 0x0802,
|
||||
LFS3_TAG_MOVE = 0x0803,
|
||||
LFS3_TAG_ATTRS = 0x0804,
|
||||
|
||||
// some in-device only tag modifiers
|
||||
LFS3_TAG_RM = 0x8000,
|
||||
LFS3_TAG_GROW = 0x4000,
|
||||
LFS3_TAG_MASK0 = 0x0000,
|
||||
LFS3_TAG_MASK2 = 0x1000,
|
||||
LFS3_TAG_MASK8 = 0x2000,
|
||||
LFS3_TAG_MASK12 = 0x3000,
|
||||
};
|
||||
|
||||
// some other tag encodings with their own subfields
|
||||
#define LFS3_TAG_ALT(c, d, key) \
|
||||
(LFS3_TAG_ALT \
|
||||
| (0x2000 & (c)) \
|
||||
| (0x1000 & (d)) \
|
||||
| (0x0fff & (lfs3_tag_t)(key)))
|
||||
|
||||
#define LFS3_TAG_ATTR(attr) \
|
||||
(LFS3_TAG_ATTR \
|
||||
| ((0x80 & (lfs3_tag_t)(attr)) << 1) \
|
||||
| (0x7f & (lfs3_tag_t)(attr)))
|
||||
|
||||
// tag type operations
|
||||
static inline lfs3_tag_t lfs3_tag_mode(lfs3_tag_t tag) {
|
||||
return tag & 0xf000;
|
||||
@ -1388,13 +1282,6 @@ static inline bool lfs3_tag_diverging2(
|
||||
|
||||
// support for encoding/decoding tags on disk
|
||||
|
||||
// tag encoding:
|
||||
// .---+---+---+- -+- -+- -+- -+---+- -+- -+- -. tag: 1 be16 2 bytes
|
||||
// | tag | weight | size | weight: 1 leb128 <=5 bytes
|
||||
// '---+---+---+- -+- -+- -+- -+---+- -+- -+- -' size: 1 leb128 <=4 bytes
|
||||
// total: <=11 bytes
|
||||
#define LFS3_TAG_DSIZE (2+5+4)
|
||||
|
||||
// needed in lfs3_bd_readtag
|
||||
#ifdef LFS3_CKMETAPARITY
|
||||
static inline bool lfs3_m_isckparity(uint32_t flags);
|
||||
@ -1932,13 +1819,6 @@ static int lfs3_bd_progdata(lfs3_t *lfs3,
|
||||
// macros for le32/leb128/lleb128 encoding, these are useful for
|
||||
// building rattrs
|
||||
|
||||
// le32 encoding:
|
||||
// .---+---+---+---. total: 1 le32 4 bytes
|
||||
// | le32 |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_LE32_DSIZE 4
|
||||
|
||||
#ifndef LFS3_RDONLY
|
||||
static inline lfs3_data_t lfs3_data_fromle32(uint32_t word,
|
||||
uint8_t buffer[static LFS3_LE32_DSIZE]) {
|
||||
@ -1947,13 +1827,6 @@ static inline lfs3_data_t lfs3_data_fromle32(uint32_t word,
|
||||
}
|
||||
#endif
|
||||
|
||||
// leb128 encoding:
|
||||
// .---+- -+- -+- -+- -. total: 1 leb128 <=5 bytes
|
||||
// | leb128 |
|
||||
// '---+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_LEB128_DSIZE 5
|
||||
|
||||
#ifndef LFS3_RDONLY
|
||||
static inline lfs3_data_t lfs3_data_fromleb128(uint32_t word,
|
||||
uint8_t buffer[static LFS3_LEB128_DSIZE]) {
|
||||
@ -1969,13 +1842,6 @@ static inline lfs3_data_t lfs3_data_fromleb128(uint32_t word,
|
||||
}
|
||||
#endif
|
||||
|
||||
// lleb128 encoding:
|
||||
// .---+- -+- -+- -. total: 1 leb128 <=4 bytes
|
||||
// | lleb128 |
|
||||
// '---+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_LLEB128_DSIZE 4
|
||||
|
||||
#ifndef LFS3_RDONLY
|
||||
static inline lfs3_data_t lfs3_data_fromlleb128(uint32_t word,
|
||||
uint8_t buffer[static LFS3_LLEB128_DSIZE]) {
|
||||
@ -1992,6 +1858,8 @@ static inline lfs3_data_t lfs3_data_fromlleb128(uint32_t word,
|
||||
#endif
|
||||
|
||||
|
||||
/// Rattrs - lfs3_rattr_t stuff ///
|
||||
|
||||
// rattr layouts/lazy encoders
|
||||
enum lfs3_from {
|
||||
LFS3_FROM_BUF = 0,
|
||||
@ -2009,85 +1877,6 @@ enum lfs3_from {
|
||||
LFS3_FROM_GEOMETRY = 10,
|
||||
};
|
||||
|
||||
// we need to at least define DSIZE/DATA macros here
|
||||
|
||||
// bptr encoding:
|
||||
// .---+- -+- -+- -. size: 1 leb128 <=4 bytes
|
||||
// | size | block: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -. off: 1 leb128 <=4 bytes
|
||||
// | block | cksize: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' cksum: 1 le32 4 bytes
|
||||
// | off | total: <=21 bytes
|
||||
// +---+- -+- -+- -+
|
||||
// | cksize |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BPTR_DSIZE (4+5+4+4+4)
|
||||
|
||||
// ecksum encoding:
|
||||
// .---+- -+- -+- -. cksize: 1 leb128 <=4 bytes
|
||||
// | cksize | cksum: 1 le32 4 bytes
|
||||
// +---+- -+- -+- -+ total: <=8 bytes
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_ECKSUM_DSIZE (4+4)
|
||||
|
||||
// branch encoding:
|
||||
// .---+- -+- -+- -+- -. block: 1 leb128 <=5 bytes
|
||||
// | block | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' cksum: 1 le32 4 bytes
|
||||
// | trunk | total: <=13 bytes
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BRANCH_DSIZE (5+4+4)
|
||||
|
||||
// btree encoding:
|
||||
// .---+- -+- -+- -+- -. weight: 1 leb128 <=5 bytes
|
||||
// | weight | block: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -+ trunk: 1 leb128 <=4 bytes
|
||||
// | block | cksum: 1 le32 4 bytes
|
||||
// +---+- -+- -+- -+- -' total: <=18 bytes
|
||||
// | trunk |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BTREE_DSIZE (5+LFS3_BRANCH_DSIZE)
|
||||
|
||||
// shrub encoding:
|
||||
// .---+- -+- -+- -+- -. weight: 1 leb128 <=5 bytes
|
||||
// | weight | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' total: <=9 bytes
|
||||
// | trunk |
|
||||
// '---+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_SHRUB_DSIZE (5+4)
|
||||
|
||||
// mptr encoding:
|
||||
// .---+- -+- -+- -+- -. blocks: 2 leb128s <=2x5 bytes
|
||||
// | block x 2 | total: <=10 bytes
|
||||
// + +
|
||||
// | |
|
||||
// '---+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_MPTR_DSIZE (5+5)
|
||||
|
||||
// geometry encoding
|
||||
// .---+- -+- -+- -. block_size: 1 leb128 <=4 bytes
|
||||
// | block_size | block_count: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -. total: <=9 bytes
|
||||
// | block_count |
|
||||
// '---+- -+- -+- -+- -'
|
||||
#define LFS3_GEOMETRY_DSIZE (4+5)
|
||||
|
||||
|
||||
/// Rattrs - lfs3_rattr_t stuff ///
|
||||
|
||||
// operations on attribute lists
|
||||
|
||||
// our core attribute type
|
||||
@ -15258,43 +15047,7 @@ static int lfs3_deinit(lfs3_t *lfs3) {
|
||||
|
||||
/// Mount/unmount ///
|
||||
|
||||
// compatibility flags
|
||||
//
|
||||
// - RCOMPAT => Must understand to read the filesystem
|
||||
// - WCOMPAT => Must understand to write to the filesystem
|
||||
// - OCOMPAT => No understanding necessary, we don't really use these
|
||||
//
|
||||
// note, "understanding" does not necessarily mean support
|
||||
//
|
||||
#define LFS3_RCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
#define LFS3_RCOMPAT_WRONLY 0x00000004 // Reading is disallowed
|
||||
#define LFS3_RCOMPAT_MMOSS 0x00000010 // May use an inlined mdir
|
||||
#define LFS3_RCOMPAT_MSPROUT 0x00000020 // May use an mdir pointer
|
||||
#define LFS3_RCOMPAT_MSHRUB 0x00000040 // May use an inlined mtree
|
||||
#define LFS3_RCOMPAT_MTREE 0x00000080 // May use an mtree
|
||||
#define LFS3_RCOMPAT_BMOSS 0x00000100 // Files may use inlined data
|
||||
#define LFS3_RCOMPAT_BSPROUT 0x00000200 // Files may use block pointers
|
||||
#define LFS3_RCOMPAT_BSHRUB 0x00000400 // Files may use inlined btrees
|
||||
#define LFS3_RCOMPAT_BTREE 0x00000800 // Files may use btrees
|
||||
#define LFS3_RCOMPAT_GRM 0x00010000 // Global-remove in use
|
||||
// internal
|
||||
#define LFS3_rcompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
#define LFS3_WCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
#define LFS3_WCOMPAT_RDONLY 0x00000002 // Writing is disallowed
|
||||
#define LFS3_WCOMPAT_GCKSUM 0x00040000 // Global-checksum in use
|
||||
#define LFS3_WCOMPAT_GBMAP 0x00080000 // Global on-disk block-map in use
|
||||
#define LFS3_WCOMPAT_DIR 0x01000000 // Directory files in use
|
||||
// internal
|
||||
#define LFS3_wcompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
#define LFS3_OCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
// internal
|
||||
#define LFS3_ocompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
typedef uint32_t lfs3_rcompat_t;
|
||||
typedef uint32_t lfs3_wcompat_t;
|
||||
typedef uint32_t lfs3_ocompat_t;
|
||||
// compat flags things
|
||||
|
||||
static inline bool lfs3_wcompat_isgbmap(lfs3_wcompat_t flags) {
|
||||
return flags & LFS3_WCOMPAT_GBMAP;
|
||||
|
||||
313
lfs3.h
313
lfs3.h
@ -55,6 +55,10 @@ typedef int32_t lfs3_smid_t;
|
||||
typedef uint32_t lfs3_did_t;
|
||||
typedef int32_t lfs3_sdid_t;
|
||||
|
||||
typedef uint32_t lfs3_rcompat_t;
|
||||
typedef uint32_t lfs3_wcompat_t;
|
||||
typedef uint32_t lfs3_ocompat_t;
|
||||
|
||||
// Maximum name size in bytes, may be redefined to reduce the size of the
|
||||
// info struct. Limited to <= 1022. Stored in superblock and must be
|
||||
// respected by other littlefs drivers.
|
||||
@ -314,7 +318,6 @@ enum lfs3_type {
|
||||
#define LFS3_I_CKMETA 0x00010000 // Metadata checksums not checked recently
|
||||
#define LFS3_I_CKDATA 0x00020000 // Data checksums not checked recently
|
||||
|
||||
|
||||
// Block types
|
||||
enum lfs3_btype {
|
||||
LFS3_BTYPE_MDIR = 1,
|
||||
@ -724,7 +727,283 @@ struct lfs3_file_cfg {
|
||||
};
|
||||
|
||||
|
||||
/// internal littlefs data structures ///
|
||||
|
||||
/// On-disk things ///
|
||||
|
||||
// On-disk metadata tags
|
||||
enum lfs3_tag {
|
||||
// the null tag is reserved
|
||||
LFS3_TAG_NULL = 0x0000,
|
||||
|
||||
// config tags
|
||||
LFS3_TAG_CONFIG = 0x0000,
|
||||
LFS3_TAG_MAGIC = 0x0031,
|
||||
LFS3_TAG_VERSION = 0x0034,
|
||||
LFS3_TAG_RCOMPAT = 0x0035,
|
||||
LFS3_TAG_WCOMPAT = 0x0036,
|
||||
LFS3_TAG_OCOMPAT = 0x0037,
|
||||
LFS3_TAG_GEOMETRY = 0x0038,
|
||||
LFS3_TAG_NAMELIMIT = 0x0039,
|
||||
LFS3_TAG_FILELIMIT = 0x003a,
|
||||
// in-device only, to help find unknown config tags
|
||||
LFS3_TAG_UNKNOWNCONFIG = 0x003b,
|
||||
|
||||
// global-state tags
|
||||
LFS3_TAG_GDELTA = 0x0100,
|
||||
LFS3_TAG_GRMDELTA = 0x0100,
|
||||
LFS3_TAG_GBMAPDELTA = 0x0104,
|
||||
|
||||
// name tags
|
||||
LFS3_TAG_NAME = 0x0200,
|
||||
LFS3_TAG_BNAME = 0x0200,
|
||||
LFS3_TAG_REG = 0x0201,
|
||||
LFS3_TAG_DIR = 0x0202,
|
||||
LFS3_TAG_STICKYNOTE = 0x0203,
|
||||
LFS3_TAG_BOOKMARK = 0x0204,
|
||||
// in-device only name tags, these should never get written to disk
|
||||
LFS3_TAG_ORPHAN = 0x0205,
|
||||
LFS3_TAG_TRV = 0x0206,
|
||||
LFS3_TAG_UNKNOWN = 0x0207,
|
||||
// non-file name tags
|
||||
LFS3_TAG_MNAME = 0x0220,
|
||||
|
||||
// struct tags
|
||||
LFS3_TAG_STRUCT = 0x0300,
|
||||
LFS3_TAG_BRANCH = 0x0300,
|
||||
LFS3_TAG_DATA = 0x0304,
|
||||
LFS3_TAG_BLOCK = 0x0308,
|
||||
LFS3_TAG_DID = 0x0314,
|
||||
LFS3_TAG_BSHRUB = 0x0318,
|
||||
LFS3_TAG_BTREE = 0x031c,
|
||||
LFS3_TAG_MROOT = 0x0321,
|
||||
LFS3_TAG_MDIR = 0x0325,
|
||||
LFS3_TAG_MTREE = 0x032c,
|
||||
LFS3_TAG_BMRANGE = 0x0330,
|
||||
LFS3_TAG_BMFREE = 0x0330,
|
||||
LFS3_TAG_BMINUSE = 0x0331,
|
||||
LFS3_TAG_BMERASED = 0x0332,
|
||||
LFS3_TAG_BMBAD = 0x0333,
|
||||
|
||||
// user/sys attributes
|
||||
LFS3_TAG_ATTR = 0x0400,
|
||||
LFS3_TAG_UATTR = 0x0400,
|
||||
LFS3_TAG_SATTR = 0x0500,
|
||||
|
||||
// shrub tags belong to secondary trees
|
||||
LFS3_TAG_SHRUB = 0x1000,
|
||||
|
||||
// alt pointers form the inner nodes of our rbyd trees
|
||||
LFS3_TAG_ALT = 0x4000,
|
||||
LFS3_TAG_B = 0x0000,
|
||||
LFS3_TAG_R = 0x2000,
|
||||
LFS3_TAG_LE = 0x0000,
|
||||
LFS3_TAG_GT = 0x1000,
|
||||
|
||||
// checksum tags
|
||||
LFS3_TAG_CKSUM = 0x3000,
|
||||
LFS3_TAG_PHASE = 0x0003,
|
||||
LFS3_TAG_PERTURB = 0x0004,
|
||||
LFS3_TAG_NOTE = 0x3100,
|
||||
LFS3_TAG_ECKSUM = 0x3200,
|
||||
LFS3_TAG_GCKSUMDELTA = 0x3300,
|
||||
|
||||
// in-device only tags, these should never get written to disk
|
||||
LFS3_TAG_INTERNAL = 0x0800,
|
||||
LFS3_TAG_RATTRS = 0x0800,
|
||||
LFS3_TAG_SHRUBCOMMIT = 0x0801,
|
||||
LFS3_TAG_GRMPUSH = 0x0802,
|
||||
LFS3_TAG_MOVE = 0x0803,
|
||||
LFS3_TAG_ATTRS = 0x0804,
|
||||
|
||||
// some in-device only tag modifiers
|
||||
LFS3_TAG_RM = 0x8000,
|
||||
LFS3_TAG_GROW = 0x4000,
|
||||
LFS3_TAG_MASK0 = 0x0000,
|
||||
LFS3_TAG_MASK2 = 0x1000,
|
||||
LFS3_TAG_MASK8 = 0x2000,
|
||||
LFS3_TAG_MASK12 = 0x3000,
|
||||
};
|
||||
|
||||
// some other tag encodings with their own subfields
|
||||
#define LFS3_TAG_ALT(c, d, key) \
|
||||
(LFS3_TAG_ALT \
|
||||
| (0x2000 & (c)) \
|
||||
| (0x1000 & (d)) \
|
||||
| (0x0fff & (lfs3_tag_t)(key)))
|
||||
|
||||
#define LFS3_TAG_ATTR(attr) \
|
||||
(LFS3_TAG_ATTR \
|
||||
| ((0x80 & (lfs3_tag_t)(attr)) << 1) \
|
||||
| (0x7f & (lfs3_tag_t)(attr)))
|
||||
|
||||
|
||||
// On-disk compat flags
|
||||
//
|
||||
// - RCOMPAT => Must understand to read the filesystem
|
||||
// - WCOMPAT => Must understand to write to the filesystem
|
||||
// - OCOMPAT => No understanding necessary, we don't really use these
|
||||
//
|
||||
// note, "understanding" does not necessarily mean support
|
||||
//
|
||||
#define LFS3_RCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
#define LFS3_RCOMPAT_WRONLY 0x00000004 // Reading is disallowed
|
||||
#define LFS3_RCOMPAT_MMOSS 0x00000010 // May use an inlined mdir
|
||||
#define LFS3_RCOMPAT_MSPROUT 0x00000020 // May use an mdir pointer
|
||||
#define LFS3_RCOMPAT_MSHRUB 0x00000040 // May use an inlined mtree
|
||||
#define LFS3_RCOMPAT_MTREE 0x00000080 // May use an mtree
|
||||
#define LFS3_RCOMPAT_BMOSS 0x00000100 // Files may use inlined data
|
||||
#define LFS3_RCOMPAT_BSPROUT 0x00000200 // Files may use block pointers
|
||||
#define LFS3_RCOMPAT_BSHRUB 0x00000400 // Files may use inlined btrees
|
||||
#define LFS3_RCOMPAT_BTREE 0x00000800 // Files may use btrees
|
||||
#define LFS3_RCOMPAT_GRM 0x00010000 // Global-remove in use
|
||||
// internally used flags
|
||||
#define LFS3_rcompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
#define LFS3_WCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
#define LFS3_WCOMPAT_RDONLY 0x00000002 // Writing is disallowed
|
||||
#define LFS3_WCOMPAT_GCKSUM 0x00040000 // Global-checksum in use
|
||||
#define LFS3_WCOMPAT_GBMAP 0x00080000 // Global on-disk block-map in use
|
||||
#define LFS3_WCOMPAT_DIR 0x01000000 // Directory files in use
|
||||
// internally used flags
|
||||
#define LFS3_wcompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
#define LFS3_OCOMPAT_NONSTANDARD 0x00000001 // Non-standard filesystem format
|
||||
// internally used flags
|
||||
#define LFS3_ocompat_OVERFLOW 0x80000000 // Can't represent all flags
|
||||
|
||||
|
||||
// On-disk encodings/decodings
|
||||
|
||||
// tag encoding:
|
||||
// .---+---+---+- -+- -+- -+- -+---+- -+- -+- -. tag: 1 be16 2 bytes
|
||||
// | tag | weight | size | weight: 1 leb128 <=5 bytes
|
||||
// '---+---+---+- -+- -+- -+- -+---+- -+- -+- -' size: 1 leb128 <=4 bytes
|
||||
// total: <=11 bytes
|
||||
#define LFS3_TAG_DSIZE (2+5+4)
|
||||
|
||||
// le32 encoding:
|
||||
// .---+---+---+---. total: 1 le32 4 bytes
|
||||
// | le32 |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_LE32_DSIZE 4
|
||||
|
||||
// leb128 encoding:
|
||||
// .---+- -+- -+- -+- -. total: 1 leb128 <=5 bytes
|
||||
// | leb128 |
|
||||
// '---+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_LEB128_DSIZE 5
|
||||
|
||||
// lleb128 encoding:
|
||||
// .---+- -+- -+- -. total: 1 leb128 <=4 bytes
|
||||
// | lleb128 |
|
||||
// '---+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_LLEB128_DSIZE 4
|
||||
|
||||
// geometry encoding
|
||||
// .---+- -+- -+- -. block_size: 1 leb128 <=4 bytes
|
||||
// | block_size | block_count: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -. total: <=9 bytes
|
||||
// | block_count |
|
||||
// '---+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_GEOMETRY_DSIZE (4+5)
|
||||
|
||||
// grm encoding:
|
||||
// .- -+- -+- -+- -+- -. mids: 2 leb128s <=2x5 bytes
|
||||
// ' mids ' total: <=10 bytes
|
||||
// + +
|
||||
// ' '
|
||||
// '- -+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_GRM_DSIZE (5+5)
|
||||
|
||||
// gbmap encoding:
|
||||
// .---+- -+- -+- -+- -. window: 1 leb128 <=5 bytes
|
||||
// | window | known: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -+ block: 1 leb128 <=5 bytes
|
||||
// | known | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -+ cksum: 1 le32 4 bytes
|
||||
// | block | total: 23 bytes
|
||||
// +---+- -+- -+- -+- -'
|
||||
// | trunk |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_GBMAP_DSIZE (5+5+5+4+4)
|
||||
|
||||
// branch encoding:
|
||||
// .---+- -+- -+- -+- -. block: 1 leb128 <=5 bytes
|
||||
// | block | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' cksum: 1 le32 4 bytes
|
||||
// | trunk | total: <=13 bytes
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BRANCH_DSIZE (5+4+4)
|
||||
|
||||
// bptr encoding:
|
||||
// .---+- -+- -+- -. size: 1 leb128 <=4 bytes
|
||||
// | size | block: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -. off: 1 leb128 <=4 bytes
|
||||
// | block | cksize: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' cksum: 1 le32 4 bytes
|
||||
// | off | total: <=21 bytes
|
||||
// +---+- -+- -+- -+
|
||||
// | cksize |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BPTR_DSIZE (4+5+4+4+4)
|
||||
|
||||
// btree encoding:
|
||||
// .---+- -+- -+- -+- -. weight: 1 leb128 <=5 bytes
|
||||
// | weight | block: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -+ trunk: 1 leb128 <=4 bytes
|
||||
// | block | cksum: 1 le32 4 bytes
|
||||
// +---+- -+- -+- -+- -' total: <=18 bytes
|
||||
// | trunk |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_BTREE_DSIZE (5+LFS3_BRANCH_DSIZE)
|
||||
|
||||
// shrub encoding:
|
||||
// .---+- -+- -+- -+- -. weight: 1 leb128 <=5 bytes
|
||||
// | weight | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -' total: <=9 bytes
|
||||
// | trunk |
|
||||
// '---+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_SHRUB_DSIZE (5+4)
|
||||
|
||||
// mptr encoding:
|
||||
// .---+- -+- -+- -+- -. blocks: 2 leb128s <=2x5 bytes
|
||||
// | block x 2 | total: <=10 bytes
|
||||
// + +
|
||||
// | |
|
||||
// '---+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_MPTR_DSIZE (5+5)
|
||||
|
||||
// ecksum encoding:
|
||||
// .---+- -+- -+- -. cksize: 1 leb128 <=4 bytes
|
||||
// | cksize | cksum: 1 le32 4 bytes
|
||||
// +---+- -+- -+- -+ total: <=8 bytes
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
//
|
||||
#define LFS3_ECKSUM_DSIZE (4+4)
|
||||
|
||||
|
||||
|
||||
/// Internal littlefs structs ///
|
||||
|
||||
// either an on-disk or in-RAM data pointer
|
||||
//
|
||||
@ -917,34 +1196,10 @@ typedef struct lfs3_trv {
|
||||
} lfs3_trv_t;
|
||||
|
||||
// littlefs global state
|
||||
|
||||
// grm encoding:
|
||||
// .- -+- -+- -+- -+- -. mids: 2 leb128s <=2x5 bytes
|
||||
// ' mids ' total: <=10 bytes
|
||||
// + +
|
||||
// ' '
|
||||
// '- -+- -+- -+- -+- -'
|
||||
//
|
||||
#define LFS3_GRM_DSIZE (5+5)
|
||||
|
||||
typedef struct lfs3_grm {
|
||||
lfs3_smid_t queue[2];
|
||||
} lfs3_grm_t;
|
||||
|
||||
// gbmap encoding:
|
||||
// .---+- -+- -+- -+- -. window: 1 leb128 <=5 bytes
|
||||
// | window | known: 1 leb128 <=5 bytes
|
||||
// +---+- -+- -+- -+- -+ block: 1 leb128 <=5 bytes
|
||||
// | known | trunk: 1 leb128 <=4 bytes
|
||||
// +---+- -+- -+- -+- -+ cksum: 1 le32 4 bytes
|
||||
// | block | total: 23 bytes
|
||||
// +---+- -+- -+- -+- -'
|
||||
// | trunk |
|
||||
// +---+- -+- -+- -+
|
||||
// | cksum |
|
||||
// '---+---+---+---'
|
||||
#define LFS3_GBMAP_DSIZE (5+5+5+4+4)
|
||||
|
||||
typedef struct lfs3_gbmap {
|
||||
lfs3_block_t window;
|
||||
lfs3_block_t known;
|
||||
@ -990,15 +1245,14 @@ typedef struct lfs3 {
|
||||
} pcache;
|
||||
// optional prog-aligned cksum
|
||||
uint32_t pcksum;
|
||||
#endif
|
||||
|
||||
#if !defined(LFS3_RDONLY) && defined(LFS3_CKMETAPARITY)
|
||||
#ifdef LFS3_CKMETAPARITY
|
||||
struct {
|
||||
lfs3_block_t block;
|
||||
// sign(off) => tail parity
|
||||
lfs3_size_t off;
|
||||
} ptail;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef LFS3_RDONLY
|
||||
struct lfs3_lookahead {
|
||||
@ -1043,6 +1297,7 @@ typedef struct lfs3 {
|
||||
} lfs3_t;
|
||||
|
||||
|
||||
|
||||
/// Filesystem functions ///
|
||||
|
||||
// Format a block device with the littlefs
|
||||
|
||||
Reference in New Issue
Block a user