From fb2304487206c6deed88f941da45c3e6113ad5f7 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 15 Mar 2018 21:26:03 -0500 Subject: [PATCH] Fixed big-endian support for entry structures --- lfs.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/lfs.c b/lfs.c index 66c8163cfe0..cfbc2b91f82 100644 --- a/lfs.c +++ b/lfs.c @@ -349,11 +349,10 @@ static void lfs_entry_fromle32(struct lfs_disk_entry *d) { d->u.dir[1] = lfs_fromle32(d->u.dir[1]); } -// TODO -//static void lfs_entry_tole32(struct lfs_disk_entry *d) { -// d->u.dir[0] = lfs_tole32(d->u.dir[0]); -// d->u.dir[1] = lfs_tole32(d->u.dir[1]); -//} +static void lfs_entry_tole32(struct lfs_disk_entry *d) { + d->u.dir[0] = lfs_tole32(d->u.dir[0]); + d->u.dir[1] = lfs_tole32(d->u.dir[1]); +} static void lfs_superblock_fromle32(struct lfs_disk_superblock *d) { d->root[0] = lfs_fromle32(d->root[0]); @@ -683,7 +682,10 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, r->off += entry->off; } - return lfs_dir_commit(lfs, dir, regions); + lfs_entry_tole32(&entry->d); + int err = lfs_dir_commit(lfs, dir, regions); + lfs_entry_fromle32(&entry->d); + return err; } // we need to allocate a new dir block @@ -701,7 +703,9 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, r->off += entry->off; } + lfs_entry_tole32(&entry->d); err = lfs_dir_commit(lfs, dir, regions); + lfs_entry_fromle32(&entry->d); if (err) { return err; } @@ -783,7 +787,9 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir, r->off += entry->off; } + lfs_entry_tole32(&entry->d); int err = lfs_dir_commit(lfs, dir, regions); + lfs_entry_fromle32(&entry->d); if (err) { return err; } @@ -807,32 +813,35 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir, } } else { lfs_dir_t olddir = *dir; - lfs_off_t oldoff = entry->off; - lfs_size_t oldsize = entry->size - diff; + lfs_entry_t oldentry = { + .off = entry->off, + .size = entry->size - diff, + .d.type = entry->d.type | LFS_STRUCT_MOVED, + }; // mark as moving - entry->d.type |= LFS_STRUCT_MOVED; int err = lfs_dir_commit(lfs, &olddir, &(struct lfs_region){ - oldoff, 0, - lfs_commit_mem, &entry->d.type, 1}); + oldentry.off, 0, + lfs_commit_mem, &oldentry.d.type, 1}); if (err) { return err; } - entry->d.type &= LFS_STRUCT_MOVED; // append updated entry + lfs_entry_tole32(&entry->d); err = lfs_dir_append(lfs, dir, entry, &(struct lfs_region){ 0, +entry->size, lfs_commit_disk, &(struct lfs_commit_disk){ - olddir.pair[0], entry->off, regions}, oldsize}); + olddir.pair[0], entry->off, regions}, oldentry.size}); + lfs_entry_fromle32(&entry->d); if (err) { return err; } // remove old entry - err = lfs_dir_remove(lfs, dir, &(lfs_entry_t){oldoff, oldsize}); + err = lfs_dir_remove(lfs, dir, &oldentry); if (err) { return err; } @@ -1645,10 +1654,12 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { entry.d.u.file.head = file->head; entry.d.u.file.size = file->size; + lfs_entry_tole32(&entry.d); err = lfs_dir_update(lfs, &cwd, &entry, &(struct lfs_region){ 0, 0, lfs_commit_mem, &entry.d, sizeof(entry.d)}); + lfs_entry_fromle32(&entry.d); if (err) { return err; } @@ -2073,7 +2084,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { err = lfs_dir_update(lfs, &oldcwd, &oldentry, &(struct lfs_region){ 0, 0, - lfs_commit_mem, &oldentry.d, sizeof(oldentry.d)}); + lfs_commit_mem, &oldentry.d.type, 1}); if (err) { return err; }