Made lfsr_file_sync a noop if zombied

So now calling lfsr_file_sync on zombied files is a noop:

  // create a file
  lfsr_file_t a;
  lfsr_file_open(&lfs, &a, "a",
          LFS_O_RDWR | LFS_O_CREAT | LFS_O_EXCL) => 0;

  // remove, creating a zombie
  lfsr_remove(&lfs, "a") => 0;

  // sync, this is now a noop (previously LFS_ERR_NOENT)
  lfsr_file_sync(&lfs, &a) => 0;

  // close is also a noop
  lfsr_file_close(&lfs, &a) => 0;

I've been on the fence on this for a while, on one hand erroring
provides more information to the user, on the other hand a noop is less
surprising if the user comes from other systems.

Ended up making this a noop. I figured minimizing surprises is good API
design, and the user can always use lfsr_stat to check if the file still
exists.

This also matches POSIX, and, perhaps more importantly, the current
version of littlefs.

---

Note that lfsr_file_resync still errors with LFS_ERR_NOENT. It's hard to
argue the file "matches the state of disk" otherwise.

Code changes minimal:

           code          stack          ctx
  before: 35784           2440          640
  after:  35780 (-0.0%)   2440 (+0.0%)  640 (+0.0%)
This commit is contained in:
Christopher Haster
2025-04-25 17:29:34 -05:00
parent f29e4b9a6e
commit b5e503ca85
10 changed files with 59 additions and 66 deletions
+34 -22
View File
@@ -5318,8 +5318,10 @@ code = '''
lfsr_file_open(&lfs, &file_, "batman", LFS_O_WRONLY) => LFS_ERR_NOENT;
lfsr_file_open(&lfs, &file_, "batman", LFS_O_RDWR) => LFS_ERR_NOENT;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
// but we should still be able to read our file handle
lfsr_file_rewind(&lfs, &file) => 0;
@@ -5451,8 +5453,10 @@ code = '''
lfsr_file_open(&lfs, &file_, "batman", LFS_O_WRONLY) => LFS_ERR_NOENT;
lfsr_file_open(&lfs, &file_, "batman", LFS_O_RDWR) => LFS_ERR_NOENT;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
// but we should still be able to read our file handle
lfsr_file_rewind(&lfs, &file) => 0;
@@ -5627,9 +5631,11 @@ code = '''
lfsr_file_read(&lfs, &file_, rbuf, CHUNK) => 0;
lfsr_file_close(&lfs, &file_) => 0;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
// but we should be able to sync our second file just fine
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
// syncing our second file should actually sync
lfsr_file_sync(&lfs, &file__) => 0;
// second file should appear on disk now
@@ -5886,9 +5892,11 @@ code = '''
lfsr_file_read(&lfs, &file_, rbuf, CHUNK) => 0;
lfsr_file_close(&lfs, &file_) => 0;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
// but we should be able to sync our second file just fine
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
// syncing our second file should actually sync
lfsr_file_sync(&lfs, &file__) => 0;
// second file should appear on disk now
@@ -6187,10 +6195,13 @@ code = '''
lfsr_file_read(&lfs, &file_, rbuf, CHUNK) => 0;
lfsr_file_close(&lfs, &file_) => 0;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
lfsr_file_sync(&lfs, &file__) => LFS_ERR_NOENT;
// but we should be able to sync our third file just fine
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
lfsr_file_sync(&lfs, &file__) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
lfsr_file_resync(&lfs, &file__) => LFS_ERR_NOENT;
// syncing our third file should actually sync
lfsr_file_sync(&lfs, &file___) => 0;
// third file should appear on disk now
@@ -6502,10 +6513,13 @@ code = '''
lfsr_file_read(&lfs, &file_, rbuf, CHUNK) => 0;
lfsr_file_close(&lfs, &file_) => 0;
// removed files can not be synced
lfsr_file_sync(&lfs, &file) => LFS_ERR_NOENT;
lfsr_file_sync(&lfs, &file__) => LFS_ERR_NOENT;
// but we should be able to sync our third file just fine
// syncing removed files is a noop
lfsr_file_sync(&lfs, &file) => 0;
lfsr_file_sync(&lfs, &file__) => 0;
// resyncing removed files is an error
lfsr_file_resync(&lfs, &file) => LFS_ERR_NOENT;
lfsr_file_resync(&lfs, &file__) => LFS_ERR_NOENT;
// syncing our third file should actually sync
lfsr_file_sync(&lfs, &file___) => 0;
// third file should appear on disk now
@@ -10892,8 +10906,7 @@ code = '''
wbuf[k] = 'a' + (TEST_PRNG(&wprng_) % 26);
}
lfsr_file_write(&lfs, &sim_files[j]->file, wbuf, SIZE) => SIZE;
lfsr_file_sync(&lfs, &sim_files[j]->file)
=> (!sim_files[j]->zombie) ? 0 : LFS_ERR_NOENT;
lfsr_file_sync(&lfs, &sim_files[j]->file) => 0;
// update sim
sim_files[j]->prng = wprng;
@@ -11320,8 +11333,7 @@ code = '''
wbuf[k] = 'a' + (TEST_PRNG(&wprng_) % 26);
}
lfsr_file_write(&lfs, &sim_files[j]->file, wbuf, SIZE) => SIZE;
lfsr_file_sync(&lfs, &sim_files[j]->file)
=> (!sim_files[j]->zombie) ? 0 : LFS_ERR_NOENT;
lfsr_file_sync(&lfs, &sim_files[j]->file) => 0;
// update sim
sim_files[j]->prng = wprng;