mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	WIP something something flexible updates
This commit is contained in:
		
							
								
								
									
										77
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -666,6 +666,59 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir, | ||||
|     return err; | ||||
| } | ||||
|  | ||||
| static int lfs_dir_append_(lfs_t *lfs, lfs_dir_t *dir, | ||||
|         lfs_entry_t *entry, struct lfs_region *region) { | ||||
|     // check if we fit, if top bit is set we do not and move on | ||||
|     while (true) { | ||||
|         if (dir->d.size + lfs_entry_size(entry) <= lfs->cfg->block_size) { | ||||
|             entry->off = dir->d.size - 4; | ||||
|             for (struct lfs_region *r = region; r; r = r->next) { | ||||
|                 r->oldoff += entry->off; | ||||
|             } | ||||
|  | ||||
|             lfs_entry_tole32(&entry->d); | ||||
|             int err = lfs_dir_commit(lfs, dir, | ||||
|                     &(struct lfs_region){ | ||||
|                         LFS_FROM_MEM, entry->off, 0, | ||||
|                         {.m.data = &entry->d}, 4, region}); | ||||
|             lfs_entry_fromle32(&entry->d); | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         // we need to allocate a new dir block | ||||
|         if (!(0x80000000 & dir->d.size)) { | ||||
|             lfs_dir_t olddir = *dir; | ||||
|             int err = lfs_dir_alloc(lfs, dir); | ||||
|             if (err) { | ||||
|                 return err; | ||||
|             } | ||||
|  | ||||
|             dir->d.tail[0] = olddir.d.tail[0]; | ||||
|             dir->d.tail[1] = olddir.d.tail[1]; | ||||
|             entry->off = dir->d.size - 4; | ||||
|             lfs_entry_tole32(&entry->d); | ||||
|             err = lfs_dir_commit(lfs, dir, | ||||
|                     &(struct lfs_region){ | ||||
|                         LFS_FROM_MEM, entry->off, 0, | ||||
|                         {.m.data = &entry->d}, 4, region}); | ||||
|             lfs_entry_fromle32(&entry->d); | ||||
|             if (err) { | ||||
|                 return err; | ||||
|             } | ||||
|  | ||||
|             olddir.d.size |= 0x80000000; | ||||
|             olddir.d.tail[0] = dir->pair[0]; | ||||
|             olddir.d.tail[1] = dir->pair[1]; | ||||
|             return lfs_dir_commit(lfs, &olddir, NULL); | ||||
|         } | ||||
|  | ||||
|         int err = lfs_dir_fetch(lfs, dir, dir->d.tail); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, | ||||
|         lfs_entry_t *entry, const void *data) { | ||||
|     // check if we fit, if top bit is set we do not and move on | ||||
| @@ -963,7 +1016,13 @@ int lfs_mkdir(lfs_t *lfs, const char *path) { | ||||
|     cwd.d.tail[0] = dir.pair[0]; | ||||
|     cwd.d.tail[1] = dir.pair[1]; | ||||
|  | ||||
|     err = lfs_dir_append(lfs, &cwd, &entry, path); | ||||
|     err = lfs_dir_append_(lfs, &cwd, &entry, | ||||
|             &(struct lfs_region){ | ||||
|                 LFS_FROM_MEM, 0, 0, | ||||
|                 {.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4, | ||||
|             &(struct lfs_region){ | ||||
|                 LFS_FROM_MEM, 0, 0, | ||||
|                 {.m.data = path}, entry.d.nlen}}); | ||||
|     if (err) { | ||||
|         return err; | ||||
|     } | ||||
| @@ -1347,7 +1406,13 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file, | ||||
|         entry.d.nlen = strlen(path); | ||||
|         entry.d.u.file.head = 0xffffffff; | ||||
|         entry.d.u.file.size = 0; | ||||
|         err = lfs_dir_append(lfs, &cwd, &entry, path); | ||||
|         err = lfs_dir_append_(lfs, &cwd, &entry, | ||||
|                 &(struct lfs_region){ | ||||
|                     LFS_FROM_MEM, 0, 0, | ||||
|                     {.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4, | ||||
|                 &(struct lfs_region){ | ||||
|                     LFS_FROM_MEM, 0, 0, | ||||
|                     {.m.data = path}, entry.d.nlen}}); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
| @@ -2007,7 +2072,13 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { | ||||
|             return err; | ||||
|         } | ||||
|     } else { | ||||
|         err = lfs_dir_append(lfs, &newcwd, &newentry, newpath); | ||||
|         err = lfs_dir_append_(lfs, &newcwd, &newentry, | ||||
|                 &(struct lfs_region){ | ||||
|                     LFS_FROM_MEM, 0, 0, | ||||
|                     {.m.data = (uint8_t*)&newentry.d + 4}, sizeof(newentry.d) - 4, | ||||
|                 &(struct lfs_region){ | ||||
|                     LFS_FROM_MEM, 0, 0, | ||||
|                     {.m.data = newpath}, newentry.d.nlen}}); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user