mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-11-01 00:38:29 +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; |     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, | static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir, | ||||||
|         lfs_entry_t *entry, const void *data) { |         lfs_entry_t *entry, const void *data) { | ||||||
|     // check if we fit, if top bit is set we do not and move on |     // 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[0] = dir.pair[0]; | ||||||
|     cwd.d.tail[1] = dir.pair[1]; |     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) { |     if (err) { | ||||||
|         return 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.nlen = strlen(path); | ||||||
|         entry.d.u.file.head = 0xffffffff; |         entry.d.u.file.head = 0xffffffff; | ||||||
|         entry.d.u.file.size = 0; |         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) { |         if (err) { | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
| @@ -2007,7 +2072,13 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { | |||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|     } else { |     } 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) { |         if (err) { | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user