mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Fixed big-endian support for entry structures
This commit is contained in:
		
							
								
								
									
										41
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								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; | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user