diff --git a/emubd/lfs_emubd.c b/emubd/lfs_emubd.c index 2c3b348..9e34f6e 100644 --- a/emubd/lfs_emubd.c +++ b/emubd/lfs_emubd.c @@ -127,13 +127,13 @@ 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) { - return -errno; - } + if (!f && errno != ENOENT) { + return -errno; } + // Check that file was erased + assert(f); + int err = fseek(f, off, SEEK_SET); if (err) { return -errno; @@ -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; } diff --git a/lfs.c b/lfs.c index aa40eec..c88b03a 100644 --- a/lfs.c +++ b/lfs.c @@ -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;