Added LFS_T_RDONLY, LFS_T_RDWR, etc

These mimic the relevant LFS_O_* flags, and allow users to assert
whether or not a traversal will mutate the filesystem:

  LFS_T_MODE          0x00000001  The traversal's access mode
  LFS_T_RDWR          0x00000000  Open traversal as read and write
  LFS_T_RDONLY        0x00000001  Open traversal as read only

In theory, these could also change internal allocations, but littlefs
doesn't really work that way.

Note we _don't_ add related LFS_GC_RDONLY, LFS_GC_RDWR, etc flags. These
are sort of implied by the relevant LFS_M_* flags.

Adds a bit more code, probably because of the slightly more complicated
internal constants for the internal traversals. But I think the
self-documentingness is worth it:

           code          stack          ctx
  before: 37200           2288          636
  after:  37220 (+0.1%)   2288 (+0.0%)  636 (+0.0%)
This commit is contained in:
Christopher Haster
2025-05-24 22:57:35 -05:00
parent 5b74aafa17
commit f7e17c8aad
9 changed files with 249 additions and 150 deletions
+23 -17
View File
@@ -710,7 +710,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -810,7 +810,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -912,7 +912,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -999,7 +999,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -1118,7 +1118,7 @@ code = '''
// run lfsr_traversal_t
} else if (AFTER == 2) {
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, GC_FLAGS) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDWR | GC_FLAGS) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1152,7 +1152,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -1281,7 +1281,7 @@ code = '''
// run lfsr_traversal_t
} else if (AFTER == 2) {
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, GC_FLAGS) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDWR | GC_FLAGS) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1315,7 +1315,7 @@ code = '''
// traverse to find blocks
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, 0) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDONLY) => 0;
lfs_block_t k = 0;
for (lfs_block_t j = 0;; j++) {
assert(j < 2*BLOCK_COUNT);
@@ -1471,7 +1471,7 @@ code = '''
}
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, GC_FLAGS) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDWR | GC_FLAGS) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1506,7 +1506,8 @@ code = '''
if (LOOKAHEAD) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_LOOKAHEAD) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_LOOKAHEAD) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1521,7 +1522,8 @@ code = '''
if (COMPACT) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_COMPACT) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_COMPACT) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1658,7 +1660,7 @@ code = '''
}
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, GC_FLAGS) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDWR | GC_FLAGS) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1693,7 +1695,8 @@ code = '''
if (LOOKAHEAD) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_LOOKAHEAD) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_LOOKAHEAD) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1708,7 +1711,8 @@ code = '''
if (COMPACT) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_COMPACT) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_COMPACT) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1785,7 +1789,7 @@ code = '''
}
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, GC_FLAGS) => 0;
lfsr_traversal_open(&lfs, &t, LFS_T_RDWR | GC_FLAGS) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1820,7 +1824,8 @@ code = '''
if (LOOKAHEAD) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_LOOKAHEAD) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_LOOKAHEAD) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);
@@ -1835,7 +1840,8 @@ code = '''
if (COMPACT) {
// we need an explicit traversal for this
lfsr_traversal_t t;
lfsr_traversal_open(&lfs, &t, LFS_T_COMPACT) => 0;
lfsr_traversal_open(&lfs, &t,
LFS_T_RDWR | LFS_T_COMPACT) => 0;
while (true) {
struct lfs_tinfo tinfo;
int err = lfsr_traversal_read(&lfs, &t, &tinfo);