Skip to content

Commit

Permalink
Fixed missing erase during file relocation
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
geky committed Jun 29, 2017
1 parent a1138a4 commit 0e1022a
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
22 changes: 17 additions & 5 deletions emubd/lfs_emubd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
8 changes: 8 additions & 0 deletions lfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1196,6 +1196,14 @@ static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) {
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;
Expand Down

0 comments on commit 0e1022a

Please sign in to comment.