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
+5 -5
View File
@@ -3979,10 +3979,10 @@ code = '''
b_size[1] = strlen(b_);
c_size[1] = strlen(c_);
// attempting to sync should error
lfsr_file_sync(&lfs, &file[1]) => LFS_ERR_NOENT;
// attempting to sync the zombie file is a noop
lfsr_file_sync(&lfs, &file[1]) => 0;
// attempting to resync should error
// attempting to resync the zombie file should error
lfsr_file_resync(&lfs, &file[1]) => LFS_ERR_NOENT;
// other file unaffected?
@@ -4239,8 +4239,8 @@ code = '''
}
}
// attempting to sync the zombie file should error
lfsr_file_sync(&lfs, &file[0]) => LFS_ERR_NOENT;
// attempting to sync the zombie file is a noop
lfsr_file_sync(&lfs, &file[0]) => 0;
// attempting to resync the zombie file should error
lfsr_file_resync(&lfs, &file[0]) => LFS_ERR_NOENT;