Renamed omdir -> handle
- lfs3_omdir_t -> lfs3_handle_t - lfs3.omdirs -> lfs3.handles - o -> h - lfs3_omdir_* -> lfs3_handle_* - lfs3_omdir_ismidopen -> lfs3_mid_isopen From conversations with users, the term "handle" or "file handle" seems to be the most common/easily understood term for the lfs3_file_t struct itself. It makes sense to adopt this in our codebase. I usually dislike inventing new names for things when prefixes can imply a relationship (size -> ssize, cache -> rcache, shrub -> bshrub, etc), but lfs3_omdirs_t was probably a bit much.
This commit is contained in:
@@ -691,11 +691,14 @@ typedef struct lfs3_mdir {
|
||||
uint32_t gcksumdelta;
|
||||
} lfs3_mdir_t;
|
||||
|
||||
typedef struct lfs3_omdir {
|
||||
struct lfs3_omdir *next;
|
||||
// a handle to an opened mdir for tracking purposes
|
||||
typedef struct lfs3_handle {
|
||||
// an invasive linked-list is used to keep things in-sync
|
||||
struct lfs3_handle *next;
|
||||
// flags includes the type and type-specific flags
|
||||
uint32_t flags;
|
||||
lfs3_mdir_t mdir;
|
||||
} lfs3_omdir_t;
|
||||
} lfs3_handle_t;
|
||||
|
||||
// a shrub is a secondary trunk in an mdir
|
||||
typedef lfs3_rbyd_t lfs3_shrub_t;
|
||||
@@ -703,7 +706,7 @@ typedef lfs3_rbyd_t lfs3_shrub_t;
|
||||
// a bshrub is like a btree but with a shrub as a root
|
||||
typedef struct lfs3_bshrub {
|
||||
// bshrubs need to be tracked for commits to work
|
||||
lfs3_omdir_t o;
|
||||
lfs3_handle_t h;
|
||||
// files contain both an active bshrub and staging bshrub, to allow
|
||||
// staging during mdir compacts
|
||||
// trunk=0 => no bshrub/btree
|
||||
@@ -749,7 +752,7 @@ typedef struct lfs3_file {
|
||||
|
||||
// littlefs directory type
|
||||
typedef struct lfs3_dir {
|
||||
lfs3_omdir_t o;
|
||||
lfs3_handle_t h;
|
||||
lfs3_did_t did;
|
||||
lfs3_off_t pos;
|
||||
} lfs3_dir_t;
|
||||
@@ -767,7 +770,7 @@ typedef struct lfs3_traversal {
|
||||
// state machine
|
||||
lfs3_bshrub_t b;
|
||||
// opened file state
|
||||
lfs3_omdir_t *ot;
|
||||
lfs3_handle_t *ht;
|
||||
union {
|
||||
// cycle detection state, only valid when traversing the mroot chain
|
||||
struct {
|
||||
@@ -817,7 +820,7 @@ typedef struct lfs3 {
|
||||
#endif
|
||||
|
||||
// linked-list of opened mdirs
|
||||
lfs3_omdir_t *omdirs;
|
||||
lfs3_handle_t *handles;
|
||||
|
||||
lfs3_mdir_t mroot;
|
||||
#ifndef LFS3_2BONLY
|
||||
|
||||
@@ -977,7 +977,7 @@ code = '''
|
||||
lfs3_file_sync(&lfs3, &file) => 0;
|
||||
|
||||
// delete any bshrub/btree
|
||||
lfs3_mdir_commit(&lfs3, &file.b.o.mdir, LFS3_RATTRS(
|
||||
lfs3_mdir_commit(&lfs3, &file.b.h.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR(
|
||||
LFS3_TAG_RM | LFS3_TAG_MASK8 | LFS3_TAG_STRUCT, 0))) => 0;
|
||||
|
||||
@@ -1093,7 +1093,7 @@ code = '''
|
||||
lfs3_file_sync(&lfs3, &file) => 0;
|
||||
|
||||
// create an empty bshrub
|
||||
lfs3_mdir_commit(&lfs3, &file.b.o.mdir, LFS3_RATTRS(
|
||||
lfs3_mdir_commit(&lfs3, &file.b.h.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_SHRUBCOMMIT(
|
||||
(&(lfs3_shrubcommit_t){
|
||||
.bshrub=&file.b,
|
||||
@@ -1101,7 +1101,7 @@ code = '''
|
||||
.rattrs=((lfs3_rattr_t[]){
|
||||
LFS3_RATTR_BUF(LFS3_TAG_DATA, +1, "?", 1)}),
|
||||
.rattr_count=1})))) => 0;
|
||||
lfs3_mdir_commit(&lfs3, &file.b.o.mdir, LFS3_RATTRS(
|
||||
lfs3_mdir_commit(&lfs3, &file.b.h.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_SHRUBCOMMIT(
|
||||
(&(lfs3_shrubcommit_t){
|
||||
.bshrub=&file.b,
|
||||
@@ -1109,7 +1109,7 @@ code = '''
|
||||
.rattrs=((lfs3_rattr_t[]){
|
||||
LFS3_RATTR(LFS3_TAG_RM, -1)}),
|
||||
.rattr_count=1})))) => 0;
|
||||
lfs3_mdir_commit(&lfs3, &file.b.o.mdir, LFS3_RATTRS(
|
||||
lfs3_mdir_commit(&lfs3, &file.b.h.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_SHRUB(
|
||||
LFS3_TAG_MASK8 | LFS3_TAG_BSHRUB, 0,
|
||||
&file.b.shrub_))) => 0;
|
||||
@@ -1232,7 +1232,7 @@ code = '''
|
||||
LFS3_RATTR_BUF(LFS3_TAG_DATA, +1, "?", 1))) => 0;
|
||||
lfs3_rbyd_commit(&lfs3, &file.b.shrub, 0, LFS3_RATTRS(
|
||||
LFS3_RATTR(LFS3_TAG_RM, -1))) => 0;
|
||||
lfs3_mdir_commit(&lfs3, &file.b.o.mdir, LFS3_RATTRS(
|
||||
lfs3_mdir_commit(&lfs3, &file.b.h.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_BTREE(
|
||||
LFS3_TAG_MASK8 | LFS3_TAG_BTREE, 0,
|
||||
&file.b.shrub))) => 0;
|
||||
|
||||
@@ -5006,7 +5006,7 @@ code = '''
|
||||
|
||||
pos = pos - (weight/2) + 1;
|
||||
}
|
||||
file.b.o.flags |= LFS3_o_UNSYNC;
|
||||
file.b.h.flags |= LFS3_o_UNSYNC;
|
||||
lfs3_file_close(&lfs3, &file) => 0;
|
||||
|
||||
for (int remount = 0; remount < 2; remount++) {
|
||||
@@ -5116,7 +5116,7 @@ code = '''
|
||||
|
||||
pos = pos - (weight/2) + 1;
|
||||
}
|
||||
file.b.o.flags |= LFS3_o_UNSYNC;
|
||||
file.b.h.flags |= LFS3_o_UNSYNC;
|
||||
lfs3_file_close(&lfs3, &file) => 0;
|
||||
|
||||
for (int remount = 0; remount < 2; remount++) {
|
||||
|
||||
+17
-17
@@ -45,7 +45,7 @@ code = '''
|
||||
struct lfs3_fsinfo fsinfo;
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_LOOKAHEAD);
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
|
||||
// run GC until we make progress
|
||||
for (lfs3_block_t i = 0;; i++) {
|
||||
@@ -112,11 +112,11 @@ code = '''
|
||||
struct lfs3_fsinfo fsinfo;
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_LOOKAHEAD);
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
|
||||
// run GC one step
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
assert(lfs3.omdirs == &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles == &lfs3.gc.t.b.h);
|
||||
|
||||
// mutate the filesystem
|
||||
lfs3_file_open(&lfs3, &file, "spider",
|
||||
@@ -128,7 +128,7 @@ code = '''
|
||||
lfs3_file_close(&lfs3, &file) => 0;
|
||||
|
||||
// run GC until our traversal is done
|
||||
while (lfs3.omdirs == &lfs3.gc.t.b.o) {
|
||||
while (lfs3.handles == &lfs3.gc.t.b.h) {
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ code = '''
|
||||
|
||||
// hack, don't use the internals like this
|
||||
uint8_t wbuf[SIZE];
|
||||
while ((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -197,7 +197,7 @@ code = '''
|
||||
struct lfs3_fsinfo fsinfo;
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_COMPACT);
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
|
||||
// run GC until we make progress
|
||||
for (lfs3_block_t i = 0;; i++) {
|
||||
@@ -213,7 +213,7 @@ code = '''
|
||||
}
|
||||
|
||||
// mdir should have been compacted
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// check we can still read the file
|
||||
for (int remount = 0; remount < 2; remount++) {
|
||||
@@ -273,7 +273,7 @@ code = '''
|
||||
|
||||
// hack, don't use the internals like this
|
||||
uint8_t wbuf[SIZE];
|
||||
while ((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -286,19 +286,19 @@ code = '''
|
||||
struct lfs3_fsinfo fsinfo;
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_COMPACT);
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
|
||||
// run GC one traversal + one step
|
||||
while (true) {
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
|
||||
// internal traversal done?
|
||||
if (lfs3.omdirs != &lfs3.gc.t.b.o) {
|
||||
if (lfs3.handles != &lfs3.gc.t.b.h) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
assert(lfs3.omdirs == &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles == &lfs3.gc.t.b.h);
|
||||
|
||||
// mutate the filesystem
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
@@ -309,7 +309,7 @@ code = '''
|
||||
lfs3_file_sync(&lfs3, &file) => 0;
|
||||
|
||||
// run GC until our traversal is done (twice for compact)
|
||||
while (lfs3.omdirs == &lfs3.gc.t.b.o) {
|
||||
while (lfs3.handles == &lfs3.gc.t.b.h) {
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
}
|
||||
|
||||
@@ -410,7 +410,7 @@ code = '''
|
||||
struct lfs3_fsinfo fsinfo;
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_MKCONSISTENT);
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
|
||||
// run GC until we make progress
|
||||
for (lfs3_block_t i = 0;; i++) {
|
||||
@@ -513,7 +513,7 @@ code = '''
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
assert(fsinfo.flags & LFS3_I_MKCONSISTENT);
|
||||
#ifdef LFS3_GC
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
#endif
|
||||
|
||||
// call lfs3_fs_mkconsistent
|
||||
@@ -614,9 +614,9 @@ code = '''
|
||||
}
|
||||
|
||||
// run GC one step
|
||||
assert(lfs3.omdirs != &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles != &lfs3.gc.t.b.h);
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
assert(lfs3.omdirs == &lfs3.gc.t.b.o);
|
||||
assert(lfs3.handles == &lfs3.gc.t.b.h);
|
||||
|
||||
// create the rest of the orphans after GC has started
|
||||
for (lfs3_size_t i = 0; i < ORPHANS; i++) {
|
||||
@@ -638,7 +638,7 @@ code = '''
|
||||
assert(fsinfo.flags & LFS3_I_MKCONSISTENT);
|
||||
|
||||
// run GC until our traversal is done
|
||||
while (lfs3.omdirs == &lfs3.gc.t.b.o) {
|
||||
while (lfs3.handles == &lfs3.gc.t.b.h) {
|
||||
lfs3_fs_gc(&lfs3) => 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ code = '''
|
||||
|
||||
// hack, don't use the internals like this
|
||||
uint8_t wbuf[SIZE];
|
||||
while ((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -245,7 +245,7 @@ code = '''
|
||||
|
||||
// mdir should have been compacted
|
||||
lfs3_file_open(&lfs3, &file, "jellyfish", LFS3_O_RDONLY) => 0;
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// check we can still read the file
|
||||
uint8_t rbuf[SIZE];
|
||||
|
||||
+60
-60
@@ -2860,21 +2860,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "c", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "c", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// insert a new entry, this should update our neighbors
|
||||
lfs3_mdir_t mdir;
|
||||
@@ -2906,8 +2906,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -2920,21 +2920,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "b", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "b", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// try removing left neighbor
|
||||
lfs3_mdir_t mdir;
|
||||
@@ -2956,8 +2956,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -2970,21 +2970,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "b", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "b", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// try removing right neighbor
|
||||
lfs3_mdir_t mdir;
|
||||
@@ -3006,8 +3006,8 @@ code = '''
|
||||
assert(left.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(left.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3022,21 +3022,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "d", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "d", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3083,8 +3083,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3099,21 +3099,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "e", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "e", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3174,8 +3174,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3190,21 +3190,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "b", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "b", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// force mroot to compact twice, this should extend the mroot
|
||||
lfs3_mdir_t old_mroot = lfs3.mroot;
|
||||
@@ -3230,8 +3230,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3248,21 +3248,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "d", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "d", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3327,8 +3327,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3345,21 +3345,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "d", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "d", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3424,8 +3424,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3440,21 +3440,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "f", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "f", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3534,8 +3534,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
@@ -3550,21 +3550,21 @@ code = '''
|
||||
lfs3_alloc_ckpoint(&lfs3);
|
||||
|
||||
// setup our neighbors
|
||||
lfs3_omdir_t left = {.flags=0};
|
||||
lfs3_handle_t left = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "a", 1,
|
||||
&left.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &left.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "a", 1))) => 0;
|
||||
assert(left.mdir.r.weight == 2);
|
||||
lfs3_omdir_open(&lfs3, &left);
|
||||
lfs3_handle_open(&lfs3, &left);
|
||||
|
||||
lfs3_omdir_t right = {.flags=0};
|
||||
lfs3_handle_t right = {.flags=0};
|
||||
lfs3_mtree_namelookup(&lfs3, 0, "e", 1,
|
||||
&right.mdir, NULL) => LFS3_ERR_NOENT;
|
||||
lfs3_mdir_commit(&lfs3, &right.mdir, LFS3_RATTRS(
|
||||
LFS3_RATTR_NAME(LFS3_TAG_REG, +1, 0, "e", 1))) => 0;
|
||||
assert(right.mdir.r.weight == 3);
|
||||
lfs3_omdir_open(&lfs3, &right);
|
||||
lfs3_handle_open(&lfs3, &right);
|
||||
|
||||
// create 2 large entries that needs to be uninlined and split
|
||||
uint8_t buffer[SIZE];
|
||||
@@ -3635,8 +3635,8 @@ code = '''
|
||||
assert(right.mdir.r.trunk == mdir.r.trunk);
|
||||
assert(right.mdir.r.cksum == mdir.r.cksum);
|
||||
|
||||
lfs3_omdir_close(&lfs3, &left);
|
||||
lfs3_omdir_close(&lfs3, &right);
|
||||
lfs3_handle_close(&lfs3, &left);
|
||||
lfs3_handle_close(&lfs3, &right);
|
||||
lfs3_unmount(&lfs3) => 0;
|
||||
'''
|
||||
|
||||
|
||||
+53
-53
@@ -5456,7 +5456,7 @@ code = '''
|
||||
|
||||
// hack, don't use the internals like this
|
||||
uint8_t wbuf[SIZE];
|
||||
while ((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -5493,7 +5493,7 @@ code = '''
|
||||
lfs3_traversal_read(&lfs3, &t, &tinfo) => LFS3_ERR_NOENT;
|
||||
|
||||
// mdir should have been compacted
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// but because we mutated, we're still marked as uncompacted
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -5515,7 +5515,7 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdir should have been compacted
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -5710,7 +5710,7 @@ code = '''
|
||||
|
||||
// hack, don't use the internals like this
|
||||
uint8_t wbuf[SIZE];
|
||||
while ((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -5749,7 +5749,7 @@ code = '''
|
||||
lfs3_traversal_read(&lfs3, &t, &tinfo) => LFS3_ERR_NOENT;
|
||||
|
||||
// mdir should have been compacted
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// but because we mutated, we're still marked as uncompacted
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -5771,7 +5771,7 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdir should have been compacted
|
||||
assert((file.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -5844,10 +5844,10 @@ code = '''
|
||||
assert(lfs3.mtree.weight == 0);
|
||||
// we need internals to check this
|
||||
lfs3_ssize_t estimate = lfs3_mdir_estimate__(&lfs3,
|
||||
&file1.b.o.mdir, -1, -1,
|
||||
&file1.b.h.mdir, -1, -1,
|
||||
NULL);
|
||||
assert(estimate >= 0);
|
||||
if ((file1.b.o.mdir.r.eoff & 0x7fffffff) > GC_COMPACT_THRESH
|
||||
if ((file1.b.h.mdir.r.eoff & 0x7fffffff) > GC_COMPACT_THRESH
|
||||
&& estimate > BLOCK_SIZE/2) {
|
||||
break;
|
||||
}
|
||||
@@ -5902,8 +5902,8 @@ code = '''
|
||||
lfs3_traversal_read(&lfs3, &t, &tinfo) => LFS3_ERR_NOENT;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// but because we mutated, we're still marked as uncompacted
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -5925,8 +5925,8 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6036,7 +6036,7 @@ code = '''
|
||||
// write to each file until mdir >gc_compact_thresh full
|
||||
if (COMPACTSET & 0x1) {
|
||||
// hack, don't use the internals like this
|
||||
while ((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file1) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf1[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -6048,7 +6048,7 @@ code = '''
|
||||
|
||||
if (COMPACTSET & 0x2) {
|
||||
// hack, don't use the internals like this
|
||||
while ((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file2) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf2[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -6060,7 +6060,7 @@ code = '''
|
||||
|
||||
if (COMPACTSET & 0x4) {
|
||||
// hack, don't use the internals like this
|
||||
while ((file3.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file3.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file3) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf3[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -6117,9 +6117,9 @@ code = '''
|
||||
|
||||
if (COMPACTSET) {
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// but because we mutated, we're still marked as uncompacted
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6142,9 +6142,9 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6276,10 +6276,10 @@ code = '''
|
||||
assert(lfs3.mtree.weight == orig);
|
||||
// we need internals to check this
|
||||
lfs3_ssize_t estimate = lfs3_mdir_estimate__(&lfs3,
|
||||
&file2.b.o.mdir, -1, -1,
|
||||
&file2.b.h.mdir, -1, -1,
|
||||
NULL);
|
||||
assert(estimate >= 0);
|
||||
if ((file2.b.o.mdir.r.eoff & 0x7fffffff) > GC_COMPACT_THRESH
|
||||
if ((file2.b.h.mdir.r.eoff & 0x7fffffff) > GC_COMPACT_THRESH
|
||||
&& estimate > BLOCK_SIZE/2) {
|
||||
break;
|
||||
}
|
||||
@@ -6344,10 +6344,10 @@ code = '''
|
||||
lfs3_traversal_read(&lfs3, &t, &tinfo) => LFS3_ERR_NOENT;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file4.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file4.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// but because we mutated, we're still marked as uncompacted
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6369,10 +6369,10 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file4.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file3.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file4.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6536,8 +6536,8 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// and we should be marked as consistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -6845,8 +6845,8 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// and we should be marked as consistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -7009,8 +7009,8 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// and we should be marked as consistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -7182,8 +7182,8 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// and we should be marked as consistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -7355,8 +7355,8 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// and we should be marked as consistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -7456,7 +7456,7 @@ code = '''
|
||||
// write to our mdirs until >gc_compact_thresh full
|
||||
//
|
||||
// hack, don't use the internals like this
|
||||
while ((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file1) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf1[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -7465,7 +7465,7 @@ code = '''
|
||||
lfs3_file_sync(&lfs3, &file1) => 0;
|
||||
}
|
||||
|
||||
while ((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file2) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf2[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -7524,12 +7524,12 @@ code = '''
|
||||
|
||||
// which means there shouldn't be that many files left
|
||||
assert(lfs3.mtree.weight <= (2 << lfs3.mbits));
|
||||
assert(file1.b.o.mdir.r.weight <= 3);
|
||||
assert(file2.b.o.mdir.r.weight <= 3);
|
||||
assert(file1.b.h.mdir.r.weight <= 3);
|
||||
assert(file2.b.h.mdir.r.weight <= 3);
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// we should be marked as consistent, but because we mutated, we're
|
||||
// still marked as uncompacted
|
||||
@@ -7552,8 +7552,8 @@ code = '''
|
||||
lfs3_traversal_close(&lfs3, &t) => 0;
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// uncompacted flag should have been cleared
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
@@ -7631,7 +7631,7 @@ code = '''
|
||||
// write to our mdirs until >gc_compact_thresh full
|
||||
//
|
||||
// hack, don't use the internals like this
|
||||
while ((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file1) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf1[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -7640,7 +7640,7 @@ code = '''
|
||||
lfs3_file_sync(&lfs3, &file1) => 0;
|
||||
}
|
||||
|
||||
while ((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
while ((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH) {
|
||||
lfs3_file_rewind(&lfs3, &file2) => 0;
|
||||
for (lfs3_size_t j = 0; j < SIZE; j++) {
|
||||
wbuf2[j] = 'a' + (TEST_PRNG(&prng) % 26);
|
||||
@@ -7723,8 +7723,8 @@ code = '''
|
||||
}
|
||||
|
||||
// mdirs should have been compacted
|
||||
assert((file1.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.o.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file1.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
assert((file2.b.h.mdir.r.eoff & 0x7fffffff) <= GC_COMPACT_THRESH);
|
||||
|
||||
// if we introduced actual orphans, we _must_ be marked as inconsistent
|
||||
lfs3_fs_stat(&lfs3, &fsinfo) => 0;
|
||||
|
||||
Reference in New Issue
Block a user