From b03420ccfc0e39238201ebeb0360b2f7f73716f0 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 26 Dec 2022 21:57:24 -0600 Subject: [PATCH] Got rbyd yellow splitting working --- lfs.c | 140 +++++---- tests/test_rbyd.toml | 654 ++++++++++++++++++++++--------------------- 2 files changed, 419 insertions(+), 375 deletions(-) diff --git a/lfs.c b/lfs.c index 8489727c..38d2cac5 100644 --- a/lfs.c +++ b/lfs.c @@ -394,6 +394,10 @@ static inline lfs_size_t lfs_tag_dsize(lfs_tag_t tag) { return sizeof(tag) + lfs_tag_size(tag + lfs_tag_isdelete(tag)); } +// 32-bit metadata tags +// +// in-device, these are effectively 31-bit unsigned integers +// on-disk, these are encoded as leb128, so smaller constants are prefered typedef uint32_t lfs_rtag_t; typedef int32_t lfs_srtag_t; @@ -416,15 +420,11 @@ enum lfs_rtag_type1 { LFS_TYPE1_ALTRGT = 0x07, }; -enum lfs_rtag_color { - LFS_COLOR_B = 0, - LFS_COLOR_R = 1, -}; +#define LFS_ALT_B false +#define LFS_ALT_R true -enum lfs_rtag_dir { - LFS_DIR_LT = 0, - LFS_DIR_GT = 1, -}; +#define LFS_ALT_LT false +#define LFS_ALT_GT true #define LFS_MKRTAG_(type1, type2, id) \ (((0x7f & (lfs_rtag_t)(type1)) << 0) \ @@ -441,8 +441,9 @@ enum lfs_rtag_dir { | ((0xfffffff & (lfs_rtag_t)(weight)) << 3)) #define LFS_MKRALT(color, dir, weight) \ - LFS_MKRALT_(LFS_COLOR_##color, LFS_DIR_##dir, weight) + LFS_MKRALT_(LFS_ALT_##color, LFS_ALT_##dir, weight) +// tag operations static inline bool lfs_rtag_isvalid(lfs_rtag_t tag) { return !(tag & 0x80000000); } @@ -471,6 +472,15 @@ static inline uint16_t lfs_rtag_id(lfs_rtag_t tag) { return tag >> 15; } +static inline lfs_rtag_t lfs_rtag_setid(lfs_rtag_t tag, uint16_t id) { + return (tag & 0x7fff) | ((lfs_rtag_t)id << 15); +} + +static inline lfs_rtag_t lfs_rtag_inc(lfs_rtag_t tag) { + return tag + 0x8; +} + +// alt operations static inline bool lfs_rtag_isblack(lfs_rtag_t tag) { return !(tag & 0x1); } @@ -479,6 +489,14 @@ static inline bool lfs_rtag_isred(lfs_rtag_t tag) { return tag & 0x1; } +static inline lfs_rtag_t lfs_rtag_red(lfs_rtag_t tag) { + return tag | 0x1; +} + +static inline lfs_rtag_t lfs_rtag_black(lfs_rtag_t tag) { + return tag & ~0x1; +} + static inline bool lfs_rtag_islt(lfs_rtag_t tag) { return !(tag & 0x2); } @@ -495,6 +513,10 @@ static inline lfs_srtag_t lfs_rtag_weight(lfs_rtag_t tag) { return tag >> 3; } +static inline lfs_rtag_t lfs_rtag_merge(lfs_rtag_t a, lfs_rtag_t b) { + return a + (b & ~0x7); +} + //static inline lfs_srtag_t lfs_rtag_weight2(lfs_rtag_t tag, lfs_rtag_t tag2) { // return lfs_rtag_weight(tag) + lfs_rtag_weight(tag2); //} @@ -543,22 +565,6 @@ static inline void lfs_rtag_untrim(lfs_rtag_t alt, } } -static inline lfs_rtag_t lfs_rtag_inc(lfs_rtag_t tag) { - return tag + 0x8; -} - -static inline lfs_rtag_t lfs_rtag_red(lfs_rtag_t tag) { - return tag | 0x1; -} - -static inline lfs_rtag_t lfs_rtag_black(lfs_rtag_t tag) { - return tag & ~0x1; -} - -static inline lfs_rtag_t lfs_rtag_setid(lfs_rtag_t tag, uint16_t id) { - return (tag & 0x7fff) | ((lfs_rtag_t)id << 15); -} - // operations on attribute lists struct lfs_mattr { lfs_tag_t tag; @@ -1417,6 +1423,7 @@ static int lfs_rbyd_commit(lfs_t *lfs, lfs_rbyd_t *rbyd, // append each tag to the tree for (const struct lfs_rattr *attr = attrs; attr; attr = attr->next) { + printf("append()\n"); // assume we'll update our trunk lfs_off_t branch = trunk; trunk = off; @@ -1453,6 +1460,19 @@ static int lfs_rbyd_commit(lfs_t *lfs, lfs_rbyd_t *rbyd, jump = branch - jump; lfs_rtag_t branch_ = branch + delta; +// // prune? +// printf("prune? %x >= %x (%x+%x+1)\n", lfs_rtag_weight(alt), lt+gt+1, lt, gt); +// if (lfs_rtag_weight(alt) >= lt+gt+1) { +// printf("prune!\n"); +// LFS_ASSERT(p_alts[0]); +// +// branch = jump; +// branch_ = 0; // TODO is this needed? +// alt = lfs_rtag_black(p_alts[0]); +// jump = p_jumps[0]; +// lfs_rbyd_p_pop(p_alts, p_jumps); +// } + // // prune? // // TODO ugh, just clean this up later // if (p_alts[0] @@ -1476,38 +1496,44 @@ static int lfs_rbyd_commit(lfs_t *lfs, lfs_rbyd_t *rbyd, // lfs_rbyd_p_pop(p_alts, p_jumps); // } // -// -// // split? -// if (lfs_rtag_isred(alt) -// && p_alts[0] -// && lfs_rtag_isred(p_alts[0])) { -// LFS_ASSERT(lfs_rtag_isparallel(alt, p_alts[0])); -// -// if (lfs_rtag_follow2(alt, p_alts[0], lt, gt)) { -// lfs_rtag_t alt_ = p_alts[0]; -// lfs_off_t jump_ = p_jumps[0]; -// p_alts[0] = lfs_rtag_black( -// lfs_rtag_flip2(alt, alt_, lt, gt)); -// p_jumps[0] = jump; -// alt = lfs_rtag_black(alt_); -// jump = jump_; -// -// lfs_rtag_trim(alt_, <, >); -// lfs_rtag_trim(alt, <, >); -// lfs_rbyd_p_red(p_alts, p_jumps); -// -// } else { -// lfs_rtag_t alt_ = p_alts[0]; -// p_alts[0] = lfs_rtag_black(alt); -// p_jumps[0] = xylem; -// -// lfs_rtag_trim(alt_, <, >); -// lfs_rtag_trim(alt, <, >); -// lfs_rbyd_p_red(p_alts, p_jumps); -// -// continue; -// } -// } + // two reds makes a yellow, split? + if (p_alts[0] + && lfs_rtag_isred(p_alts[0]) + && lfs_rtag_isred(alt)) { + LFS_ASSERT(lfs_rtag_isparallel(alt, p_alts[0])); + + // if we take the red or yellow alt we can just point + // to the black alt, otherwise we need to point to the + // yellow alt and prune later + if (lfs_rtag_follow(alt, lt, gt)) { + printf("ysplit follow\n"); + lfs_rtag_t alt_ = p_alts[0]; + lfs_off_t jump_ = p_jumps[0]; + p_alts[0] = lfs_rtag_black( + lfs_rtag_flip(alt, lt, gt)); + p_jumps[0] = branch_; + + alt = lfs_rtag_black(alt_); + branch_ = jump; + jump = jump_; + + lfs_rtag_untrim(alt, <, >); + lfs_rtag_trim(p_alts[0], <, >); + lfs_rbyd_p_red(p_alts, p_jumps); + + } else { + printf("ysplit nofollow\n"); + p_alts[0] = lfs_rtag_black( + lfs_rtag_merge(alt, p_alts[0])); + p_jumps[0] = xylem; + + lfs_rtag_trim(alt, <, >); + lfs_rbyd_p_red(p_alts, p_jumps); + //xylem = branch; + branch = branch_; + continue; + } + } // should've taken red alt? needs a flip printf("lt,gt = (%x,%x)\n", lt, gt); diff --git a/tests/test_rbyd.toml b/tests/test_rbyd.toml index a06aa4fa..c7b3646e 100644 --- a/tests/test_rbyd.toml +++ b/tests/test_rbyd.toml @@ -19,9 +19,10 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; // try an empty commit - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; @@ -57,9 +58,10 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; // try an empty commit - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; @@ -100,15 +102,16 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // try an empty commit - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0; // TODO test in-between lookups for consistently finding the next >= tag? - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size) => LFS_ERR_NOENT; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) @@ -183,14 +186,15 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // try an empty commit - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size) => LFS_ERR_NOENT; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) @@ -267,22 +271,23 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; + lfs_srtag_t tag; // traverse requires correct biasing of the weights in the rbyd tree // so that lookups return strictly the tag greater than or equal to // the tag requested - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL))) => 0; - lfs_off_t off; - lfs_size_t size; - lfs_srtag_t tag = lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size); + tag = lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size); assert(tag == LFS_MKRTAG(GSTATE, 1, 0)); - // TODO use lfs_tag_incid? tag = lfs_rbyd_lookup(&lfs, &rbyd, lfs_rtag_inc(tag), &off, &size); assert(tag == LFS_MKRTAG(GSTATE, 2, 0)); tag = lfs_rbyd_lookup(&lfs, &rbyd, lfs_rtag_inc(tag), &off, &size); @@ -312,11 +317,15 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; + lfs_srtag_t tag; // traverse requires correct biasing of the weights in the rbyd tree // so that lookups return strictly the tag greater than or equal to // the tag requested - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, @@ -324,9 +333,7 @@ code = ''' lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL)) => 0; - lfs_off_t off; - lfs_size_t size; - lfs_srtag_t tag = lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size); + tag = lfs_rbyd_lookup(&lfs, &rbyd, 0, &off, &size); assert(tag == LFS_MKRTAG(GSTATE, 1, 0)); tag = lfs_rbyd_lookup(&lfs, &rbyd, lfs_rtag_inc(tag), &off, &size); assert(tag == LFS_MKRTAG(GSTATE, 2, 0)); @@ -357,20 +364,21 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // create a split in the leaves // .-'| // 1 1 2 - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, NULL))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -408,12 +416,15 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // ignore a black edge // .----'| // 1 2 1 2 2 - lfs_rbyd_t rbyd = rbyd_init; + rbyd = rbyd_init; lfs_bd_erase(&lfs, rbyd.block) => 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -421,8 +432,6 @@ code = ''' LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xcccccccc}, 4, NULL)))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -461,6 +470,9 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // ignore a black edge // | 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -476,8 +488,6 @@ code = ''' LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, NULL)))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -523,6 +533,9 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // ignore a red edge and black edge // | 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -539,8 +552,6 @@ code = ''' LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -630,6 +641,9 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // ignore a red edge and black edge // 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -648,8 +662,6 @@ code = ''' LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -753,6 +765,9 @@ code = ''' .count = 0, .erased = true, }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; // all three the same // 0; lfs_rbyd_commit(&lfs, &rbyd, LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -771,8 +786,6 @@ code = ''' LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, NULL))))) => 0; lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; - lfs_off_t off; - lfs_size_t size; lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) => LFS_MKRTAG(GSTATE, 1, 0); lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -861,283 +874,286 @@ code = ''' => LFS_MKRTAG(GSTATE, 4, 0); ''' -#[cases.test_rbyd_ysplits] -#in = 'lfs.c' -#code = ''' -# lfs_t lfs; -# lfs_init(&lfs, cfg) => 0; -# -# lfs_rbyd_t rbyd_init = { -# .block = 0, -# .trunk = 0, -# .noff = 0, -# .rev = 1, -# .crc = 0, -# .count = 0, -# .erased = true, -# }; -# -# // split a yellow triple, not taking any alt -# // | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_off_t off; -# lfs_size_t size; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# -# // split a yellow triple, taking the black alt -# // | b -# // | | .-'| | | .-'| -# // 1 2 3 4 1 2 3 4 3 -# rbyd = rbyd_init; -# lfs_bd_erase(&lfs, rbyd.block) => 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# -# // split a yellow triple, taking the red alt -# // b -# // .-------'| .-'| -# // | .--------|-'| -# // | | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# -# // split a yellow triple, taking the yellow alt -# // b -# // .-------'| .-'| -# // | b -# // | .----'| => .-----|-'| -# // | | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -#''' -# -#[cases.test_rbyd_quintifoliate] -#in = 'lfs.c' -#code = ''' -# lfs_t lfs; -# lfs_init(&lfs, cfg) => 0; -# -# lfs_rbyd_t rbyd_init = { -# .block = 0, -# .trunk = 0, -# .noff = 0, -# .rev = 1, -# .crc = 0, -# .count = 0, -# .erased = true, -# }; -# -# // split a yellow triple, not taking any alt -# // | .----' | -# // | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_off_t off; -# lfs_size_t size; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 5, 0); -# -# // split a yellow triple, taking the black alt -# // | .----' | -# // | r -# // | .----'| | | .-'| -# // | | b -# // | | .-'| | | .--|-'| -# // 1 2 4 5 1 2 4 5 3 -# rbyd = rbyd_init; -# lfs_bd_erase(&lfs, rbyd.block) => 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 5, 0); -# -# // split a yellow triple, taking the red alt -# // >b -# // .-'| -# // b -# // | .----'| => | .-----|-'| -# // | | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 5, 0); -# -# // split a yellow triple, taking the yellow alt -# // >b -# // .-'| -# // r -# // .-------'| .-----|-'| -# // | b -# // | .----'| => .--|-----|-'| -# // | | 0; -# lfs_rbyd_commit(&lfs, &rbyd, -# LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xaaaaaaaa}, 4, -# LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4, -# LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, -# LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, -# LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; -# -# lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 1, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 2, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 3, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 4, 0); -# lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) -# => LFS_MKRTAG(GSTATE, 5, 0); -#''' +[cases.test_rbyd_ysplits] +in = 'lfs.c' +code = ''' + lfs_t lfs; + lfs_init(&lfs, cfg) => 0; + + lfs_rbyd_t rbyd_init = { + .block = 0, + .trunk = 0, + .noff = 0, + .rev = 1, + .crc = 0, + .count = 0, + .erased = true, + }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; + + // split a yellow triple, not taking any alt + // | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + + // split a yellow triple, taking the black alt + // | b + // | | .-'| | | .-'| + // 1 2 3 4 1 2 3 4 3 + rbyd = rbyd_init; + lfs_bd_erase(&lfs, rbyd.block) => 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + + // split a yellow triple, taking the red alt + // b + // .-------'| .-'| + // | .--------|-'| + // | | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + + // split a yellow triple, taking the yellow alt + // b + // .-------'| .-'| + // | b + // | .----'| => .-----|-'| + // | | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); +''' + +[cases.test_rbyd_quintifoliate] +in = 'lfs.c' +code = ''' + lfs_t lfs; + lfs_init(&lfs, cfg) => 0; + + lfs_rbyd_t rbyd_init = { + .block = 0, + .trunk = 0, + .noff = 0, + .rev = 1, + .crc = 0, + .count = 0, + .erased = true, + }; + lfs_rbyd_t rbyd; + lfs_off_t off; + lfs_size_t size; + + // split a yellow triple, not taking any alt + // | .----' | + // | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 5, 0); + + // split a yellow triple, taking the black alt + // | .----' | + // | r + // | .----'| | | .-'| + // | | b + // | | .-'| | | .--|-'| + // 1 2 4 5 1 2 4 5 3 + rbyd = rbyd_init; + lfs_bd_erase(&lfs, rbyd.block) => 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 5, 0); + + // split a yellow triple, taking the red alt + // >b + // .-'| + // b + // | .----'| => | .-----|-'| + // | | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 5, 0); + + // split a yellow triple, taking the yellow alt + // >b + // .-'| + // r + // .-------'| .-----|-'| + // | b + // | .----'| => .--|-----|-'| + // | | 0; + lfs_rbyd_commit(&lfs, &rbyd, + LFS_MKRATTR(GSTATE, 2, 0, &(uint32_t){0xaaaaaaaa}, 4, + LFS_MKRATTR(GSTATE, 3, 0, &(uint32_t){0xbbbbbbbb}, 4, + LFS_MKRATTR(GSTATE, 4, 0, &(uint32_t){0xcccccccc}, 4, + LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xdddddddd}, 4, + LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xeeeeeeee}, 4, NULL)))))) => 0; + + lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 1, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 2, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 3, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 3, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 4, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 4, 0); + lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 5, 0), &off, &size) + => LFS_MKRTAG(GSTATE, 5, 0); +''' + #[cases.test_rbyd_prunes] #in = 'lfs.c' #code = ''' @@ -1153,6 +1169,9 @@ code = ''' # .count = 0, # .erased = true, # }; +# lfs_rbyd_t rbyd; +# lfs_off_t off; +# lfs_size_t size; # # // don't prune # // 0; # lfs_rbyd_commit(&lfs, &rbyd, # LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -1177,8 +1196,6 @@ code = ''' # LFS_MKRATTR(GSTATE, 5, 0, &(uint32_t){0xffffffff}, 4, NULL))))))) => 0; # # lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_off_t off; -# lfs_size_t size; # lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) # => LFS_MKRTAG(GSTATE, 1, 0); # lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size) @@ -1274,6 +1291,9 @@ code = ''' # .count = 0, # .erased = true, # }; +# lfs_rbyd_t rbyd; +# lfs_off_t off; +# lfs_size_t size; # # // don't prune # // 0; # lfs_rbyd_commit(&lfs, &rbyd, # LFS_MKRATTR(GSTATE, 1, 0, &(uint32_t){0xaaaaaaaa}, 4, @@ -1300,8 +1320,6 @@ code = ''' # LFS_MKRATTR(GSTATE, 6, 0, &(uint32_t){0xffffffff}, 4, NULL))))))) => 0; # # lfs_rbyd_fetch(&lfs, &rbyd, rbyd.block, NULL) => 0; -# lfs_off_t off; -# lfs_size_t size; # lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 1, 0), &off, &size) # => LFS_MKRTAG(GSTATE, 1, 0); # lfs_rbyd_lookup(&lfs, &rbyd, LFS_MKRTAG(GSTATE, 2, 0), &off, &size)