Fixed missing erase during file relocation

This was an easy fix, but highlighted the fact that the current testing
framework doesn't detect when a block is written to without an
associated erase.

Added a quick solution that creates an empty file during an erase.
This commit is contained in:
Christopher Haster
2017-06-25 16:56:12 -05:00
parent a1138a41ce
commit 0e1022a86c
2 changed files with 25 additions and 5 deletions

View File

@@ -127,12 +127,12 @@ int lfs_emubd_prog(const struct lfs_config *cfg, lfs_block_t block,
snprintf(emu->child, LFS_NAME_MAX, "%x", block);
FILE *f = fopen(emu->path, "r+b");
if (!f && errno == ENOENT) {
f = fopen(emu->path, "w+b");
if (!f) {
if (!f && errno != ENOENT) {
return -errno;
}
}
// Check that file was erased
assert(f);
int err = fseek(f, off, SEEK_SET);
if (err) {
@@ -185,6 +185,18 @@ int lfs_emubd_erase(const struct lfs_config *cfg, lfs_block_t block) {
}
}
if (err || S_ISREG(st.st_mode)) {
FILE *f = fopen(emu->path, "w");
if (!f) {
return -errno;
}
err = fclose(f);
if (err) {
return -errno;
}
}
emu->stats.erase_count += 1;
return 0;
}

8
lfs.c
View File

@@ -1196,6 +1196,14 @@ relocate:
return err;
}
err = lfs_bd_erase(lfs, nblock);
if (err) {
if (err == LFS_ERR_CORRUPT) {
goto relocate;
}
return err;
}
// either read from dirty cache or disk
for (lfs_off_t i = 0; i < file->off; i++) {
uint8_t data;