t: Restricted LFS_ERR_BUSY to only LFS_T_EXCL
So now lfsr_traversal_read will only return LFS_ERR_BUSY if LFS_T_EXCL
was provided to lfsr_traversal_open.
This means it's no longer possible to opportunistically traverse blocks,
_and_ detect mutation in the same traversal (though I suppose you could
open multiple traversals for this?), but on the flipside this
potentially frees up the implementation a bit.
This motivation for this is that LFS_ERR_BUSY is potentially confusing
and annoying to handle if you don't care about mutation.
code stack
before: 34566 2624
after: 34558 (-0.0%) 2624 (+0.0%)
This commit is contained in:
@@ -9532,10 +9532,7 @@ done:;
|
||||
lfs_alloc_markfree(lfs);
|
||||
}
|
||||
|
||||
// return BUSY if we're dirty, NOENT if we're clean
|
||||
return (lfsr_f_isdirty(t->mt.o.flags))
|
||||
? LFS_ERR_BUSY
|
||||
: LFS_ERR_NOENT;
|
||||
return LFS_ERR_NOENT;
|
||||
}
|
||||
|
||||
static int lfsr_traversal_rewind_(lfs_t *lfs, lfsr_traversal_t *t) {
|
||||
|
||||
@@ -1058,8 +1058,8 @@ int lfsr_traversal_close(lfs_t *lfs, lfsr_traversal_t *traversal);
|
||||
//
|
||||
// Fills out the tinfo structure.
|
||||
//
|
||||
// Returns 0 on success, LFS_ERR_NOENT at the end of traversal, LFS_ERR_BUSY
|
||||
// if filesystem has been modified, or a negative error code on failure.
|
||||
// Returns 0 on success, LFS_ERR_NOENT at the end of traversal, or a
|
||||
// negative error code on failure.
|
||||
int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *traversal,
|
||||
struct lfs_tinfo *tinfo);
|
||||
|
||||
|
||||
+59
-47
@@ -1691,8 +1691,7 @@ code = '''
|
||||
LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => 0;
|
||||
lfsr_file_close(&lfs, &file) => 0;
|
||||
|
||||
// read should immediately error
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
goto done;
|
||||
}
|
||||
@@ -1708,8 +1707,7 @@ code = '''
|
||||
lfsr_file_close(&lfs, &file) => 0;
|
||||
}
|
||||
|
||||
// final read should return BUSY
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
done:;
|
||||
@@ -1822,12 +1820,18 @@ code = '''
|
||||
if (WHEN == 1) {
|
||||
lfsr_mkdir(&lfs, "spider") => 0;
|
||||
|
||||
if (EXCL) {
|
||||
// read should immediately error
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_MDIR);
|
||||
assert(tinfo.block == 0 || tinfo.block == 1);
|
||||
@@ -1843,8 +1847,7 @@ code = '''
|
||||
}
|
||||
}
|
||||
|
||||
// final read should return BUSY
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
done:;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
@@ -1895,12 +1898,18 @@ code = '''
|
||||
if (WHEN == 1) {
|
||||
lfsr_remove(&lfs, "spider") => 0;
|
||||
|
||||
if (EXCL) {
|
||||
// read should immediately error
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_MDIR);
|
||||
assert(tinfo.block == 0 || tinfo.block == 1);
|
||||
@@ -1916,8 +1925,7 @@ code = '''
|
||||
}
|
||||
}
|
||||
|
||||
// final read should return BUSY
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
done:;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
@@ -1968,12 +1976,18 @@ code = '''
|
||||
if (WHEN == 1) {
|
||||
lfsr_rename(&lfs, "spider", "scorpion") => 0;
|
||||
|
||||
if (EXCL) {
|
||||
// read should immediately error
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
struct lfs_tinfo tinfo;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_MDIR);
|
||||
assert(tinfo.block == 0 || tinfo.block == 1);
|
||||
@@ -1989,8 +2003,7 @@ code = '''
|
||||
}
|
||||
}
|
||||
|
||||
// final read should return BUSY
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
done:;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
@@ -2050,8 +2063,11 @@ code = '''
|
||||
// step traversal
|
||||
struct lfs_tinfo tinfo;
|
||||
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
|
||||
assert(!err || err == LFS_ERR_BUSY);
|
||||
if (err == LFS_ERR_BUSY) {
|
||||
assert(!err
|
||||
|| (!EXCL && err == LFS_ERR_NOENT)
|
||||
|| (EXCL && err == LFS_ERR_BUSY));
|
||||
if (err == LFS_ERR_NOENT
|
||||
|| err == LFS_ERR_BUSY) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2124,8 +2140,11 @@ code = '''
|
||||
// step traversal
|
||||
struct lfs_tinfo tinfo;
|
||||
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
|
||||
assert(!err || err == LFS_ERR_BUSY);
|
||||
if (err == LFS_ERR_BUSY) {
|
||||
assert(!err
|
||||
|| (!EXCL && err == LFS_ERR_NOENT)
|
||||
|| (EXCL && err == LFS_ERR_BUSY));
|
||||
if (err == LFS_ERR_NOENT
|
||||
|| err == LFS_ERR_BUSY) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2213,7 +2232,7 @@ code = '''
|
||||
lfsr_file_close(&lfs, &file) => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -2298,7 +2317,7 @@ code = '''
|
||||
lfsr_file_close(&lfs, &file) => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -2379,7 +2398,7 @@ code = '''
|
||||
lfsr_file_close(&lfs, &file) => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -2452,7 +2471,7 @@ code = '''
|
||||
lfsr_file_write(&lfs, &file1, wbuf1, SIZE) => SIZE;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file1) => 0;
|
||||
@@ -2544,7 +2563,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file1) => 0;
|
||||
@@ -2624,7 +2643,7 @@ code = '''
|
||||
lfsr_file_write(&lfs, &file1, wbuf1, SIZE) => SIZE;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file1) => 0;
|
||||
@@ -2701,8 +2720,7 @@ code = '''
|
||||
lfsr_file_close(&lfs, &file1) => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo)
|
||||
=> (DESYNC) ? LFS_ERR_NOENT : LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file2) => 0;
|
||||
@@ -2798,12 +2816,9 @@ code = '''
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
}
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
} else {
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
}
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file2) => 0;
|
||||
@@ -2892,12 +2907,9 @@ code = '''
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
}
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
} else {
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
}
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
lfsr_file_close(&lfs, &file2) => 0;
|
||||
@@ -2978,7 +2990,7 @@ code = '''
|
||||
lfsr_remove(&lfs, "spider") => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3048,7 +3060,7 @@ code = '''
|
||||
lfsr_rename(&lfs, "spider", "tarantula") => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3118,7 +3130,7 @@ code = '''
|
||||
lfsr_rename(&lfs, "tarantula", "spider") => 0;
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3190,7 +3202,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3280,7 +3292,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3380,7 +3392,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3460,7 +3472,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3541,7 +3553,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3645,7 +3657,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3740,7 +3752,7 @@ code = '''
|
||||
}
|
||||
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -3896,7 +3908,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4056,7 +4068,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4221,7 +4233,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4385,7 +4397,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4548,7 +4560,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4718,7 +4730,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
@@ -4891,7 +4903,7 @@ code = '''
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => 0;
|
||||
assert(tinfo.btype == LFS_BTYPE_DATA);
|
||||
// we should be at end of traversal now
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_BUSY;
|
||||
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
|
||||
lfsr_traversal_close(&lfs, &t) => 0;
|
||||
|
||||
// check the file contents
|
||||
|
||||
Reference in New Issue
Block a user