rattrs: Converted rattrs to full variable-length isa
It's funny to see what originally started as a simple list of rbyd attrs
slowly morph into a full isa. But it makes sense. What we really want is
an abstract description of operations that can be played and replayed as
necessary to atomically update the mtree.
Using a fixed lfs3_rattr_t struct to represent this in C is easy, and
avoids strict-aliasing issues, but ultimately limited when it comes to
the wide-range of data we want to attach to attributes.
Unlike a computer's isa, we want to be able to include full 12-24 byte
branch pointers directly in the instruction!
---
So here's a full variable-length isa organized by words (max(uintptr_t,
uint32_t)).
The first 32-bit word extends the 16-bit tag with an extra 16-bits of
control information:
wwll llff ffcc cccc tttt tttt tttt tttt
^'-.-''-.-''--.--' : :
'--|----|-----|----:-----------------:-- compressed weight
:: '----|-----|----:-----------------:-- total len
:: '-----|----:-----------------:-- from encoder
:: '----:-----------------:-- optional count
:: rgmm kkkk -kkk kkkk
11 => w=-1 ^^ ^ '-.' '---.---'
00 => w=0 '|-|---|------|------ rm bit
01 => w=+1 '-|---|------|------ grow bit
10 => w=attached '---|------|------ mask bits
'------|------ tag suptype
'------ tag subtype
The 4-bit length field always encodes the full length of the
instruction, including the instruction itself and optional weight. The
4-bit from + 6-bit count fields operate independently and tell
lfs3_rbyd_appendrattr_ how to actually encode the data related to the
instruction.
To work around strict-aliasing issues, complex structs are expected to
be broken down into words and reconstructed in lfs3_rbyd_appendrattr_.
Most of our structs are organized into words anyways. For example:
// new child
*r++ = LFS3_RATTR(5, LFS3_TAG_BRANCH, -2, LFS3_FROM_BRANCH);
*r++ = LFS3_RATTR_WEIGHT(+child_->weight);
*r++ = LFS3_RATTR_ARG(child_->blocks[0]);
*r++ = LFS3_RATTR_ARG(child_->trunk);
*r++ = LFS3_RATTR_ARG(child_->cksum);
This also changes rattr-lists to be null-terminated, which makes a bit
more sense in a variable-length isa:
*r++ = LFS3_RATTR_NULL; // all zeros, including length
One concern with null-terminated rattr-lists is how easy it is to
forget the null-terminator, but an assert that all non-null rattrs have
non-zero length seemed to catch the many many mistakes during adoption.
Alternatively, separate LFS3_FROM_NULL/LFS3_FROM_NIL from fields could
be used if encoding space gets tight.
I'm also quite happy with the 2-bit weight feild, which allows omitting
the optional weight word for -1,0,+1 weights. These should cover at
least all mdir operations.
Note the exact encoding of the rattr fields is less of a concern than
the tag fields, as it doesn't reside on-disk can be changed on whim.
---
Saves a nice chunk of code and stack:
code stack ctx
before: 35920 2280 660
after: 35324 (-1.7%) 2176 (-4.6%) 660 (+0.0%)
code stack ctx
gbmap before: 38812 2296 772
gbmap after: 38156 (-1.7%) 2192 (-4.5%) 772 (+0.0%)
The stack savings are obvious, but the code savings a bit less so. A
variable length isa _is_ more complicated, but by limiting most encoding
decisions to compile-time (2-bit weights vs 32-bit weights for example),
the savings from fewer word manipulations on the stack wins.
This commit is contained in:
+150
-120
@@ -4566,50 +4566,56 @@ code = '''
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/coldbrew";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/turkish";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/tubruk";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/vietnamese";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/thai";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
|
||||
// stat paths
|
||||
struct lfs3_info info;
|
||||
@@ -4740,50 +4746,56 @@ code = '''
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coldbrew";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "turkish";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "tubruk";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "vietnamese";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "thai";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
|
||||
if (DIR) {
|
||||
lfs3_mkdir(&lfs3, "drip/coffee") => LFS3_ERR_NOTDIR;
|
||||
@@ -5036,50 +5048,56 @@ code = '''
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/coldbrew";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/turkish";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/tubruk";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/vietnamese";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/thai";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
|
||||
// stat paths
|
||||
struct lfs3_info info;
|
||||
@@ -5278,50 +5296,56 @@ code = '''
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/coldbrew";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/turkish";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/tubruk";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/vietnamese";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/thai";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
|
||||
// stat paths
|
||||
struct lfs3_info info;
|
||||
@@ -5520,50 +5544,56 @@ code = '''
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/coldbrew";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/turkish";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/tubruk";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/vietnamese";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
path = "coffee/thai";
|
||||
lfs3_mtree_pathlookup(&lfs3, &path,
|
||||
&mdir, &did) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_CAT(
|
||||
LFS3_TAG_NAME + 0x13, +1,
|
||||
lfs3_data_fromleb128(did, (uint8_t[LFS3_LEB128_DSIZE]){0}),
|
||||
LFS3_DATA_BUF(path, lfs3_path_namelen(path))))) => 0;
|
||||
LFS3_RATTR(4, LFS3_TAG_NAME + 0x13, +1, LFS3_FROM_NAME),
|
||||
LFS3_RATTR_ARG(did),
|
||||
LFS3_RATTR_ARG(path),
|
||||
LFS3_RATTR_ARG(lfs3_path_namelen(path)),
|
||||
LFS3_RATTR_NULL)) => 0;
|
||||
|
||||
// stat paths
|
||||
struct lfs3_info info;
|
||||
|
||||
Reference in New Issue
Block a user