Browse Source

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.
Christopher Haster 8 năm trước cách đây
mục cha
commit
0e1022a86c
2 tập tin đã thay đổi với 25 bổ sung5 xóa
  1. 17 5
      emubd/lfs_emubd.c
  2. 8 0
      lfs.c

+ 17 - 5
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;
 }

+ 8 - 0
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;