|
|
@@ -1265,12 +1265,13 @@ static int lfs_dir_commitattr(lfs_t *lfs, struct lfs_commit *commit,
|
|
|
}
|
|
|
|
|
|
static int lfs_dir_commitcrc(lfs_t *lfs, struct lfs_commit *commit) {
|
|
|
- const lfs_off_t off1 = commit->off;
|
|
|
- const uint32_t crc1 = commit->crc;
|
|
|
// align to program units
|
|
|
- const lfs_off_t end = lfs_alignup(off1 + 2*sizeof(uint32_t),
|
|
|
+ const lfs_off_t end = lfs_alignup(commit->off + 2*sizeof(uint32_t),
|
|
|
lfs->cfg->prog_size);
|
|
|
|
|
|
+ lfs_off_t off1 = 0;
|
|
|
+ uint32_t crc1 = 0;
|
|
|
+
|
|
|
// create crc tags to fill up remainder of commit, note that
|
|
|
// padding is not crced, which lets fetches skip padding but
|
|
|
// makes committing a bit more complicated
|
|
|
@@ -1306,6 +1307,12 @@ static int lfs_dir_commitcrc(lfs_t *lfs, struct lfs_commit *commit) {
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+ // keep track of non-padding checksum to verify
|
|
|
+ if (off1 == 0) {
|
|
|
+ off1 = commit->off + sizeof(uint32_t);
|
|
|
+ crc1 = commit->crc;
|
|
|
+ }
|
|
|
+
|
|
|
commit->off += sizeof(tag)+lfs_tag_size(tag);
|
|
|
commit->ptag = tag ^ ((lfs_tag_t)reset << 31);
|
|
|
commit->crc = 0xffffffff; // reset crc for next "commit"
|
|
|
@@ -1319,7 +1326,7 @@ static int lfs_dir_commitcrc(lfs_t *lfs, struct lfs_commit *commit) {
|
|
|
|
|
|
// successful commit, check checksums to make sure
|
|
|
lfs_off_t off = commit->begin;
|
|
|
- lfs_off_t noff = off1 + sizeof(uint32_t);
|
|
|
+ lfs_off_t noff = off1;
|
|
|
while (off < end) {
|
|
|
uint32_t crc = 0xffffffff;
|
|
|
for (lfs_off_t i = off; i < noff+sizeof(uint32_t); i++) {
|