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:
Christopher Haster
2024-06-20 11:24:57 -05:00
parent 7e96ff4dbd
commit 0502cb8f92
3 changed files with 70 additions and 61 deletions
+1 -4
View File
@@ -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) {
+2 -2
View File
@@ -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);
+67 -55
View File
@@ -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,9 +1820,15 @@ code = '''
if (WHEN == 1) {
lfsr_mkdir(&lfs, "spider") => 0;
// read should immediately error
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_BUSY;
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
goto done;
}
@@ -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,9 +1898,15 @@ code = '''
if (WHEN == 1) {
lfsr_remove(&lfs, "spider") => 0;
// read should immediately error
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_BUSY;
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
goto done;
}
@@ -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,9 +1976,15 @@ code = '''
if (WHEN == 1) {
lfsr_rename(&lfs, "spider", "scorpion") => 0;
// read should immediately error
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_BUSY;
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
goto done;
}
@@ -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;
}
// we should be at end of traversal now
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
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;
}
// we should be at end of traversal now
lfsr_traversal_read(&lfs, &t, &tinfo) => LFS_ERR_NOENT;
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