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:
+34
-22
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user