mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-11-01 00:38:29 +01:00 
			
		
		
		
	WIP Fixed deorphan test
This commit is contained in:
		
							
								
								
									
										42
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -3255,6 +3255,12 @@ int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) { | ||||
| } | ||||
| */ | ||||
| static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) { | ||||
|     if (lfs_pairisnull(lfs->root)) { | ||||
|         // TODO best place for this? | ||||
|         // TODO needed for relocate | ||||
|         return LFS_ERR_NOENT; | ||||
|     } | ||||
|  | ||||
|     // iterate over all directory directory entries | ||||
|     pdir->tail[0] = 0; | ||||
|     pdir->tail[1] = 1; | ||||
| @@ -3275,6 +3281,11 @@ static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) { | ||||
|  | ||||
| static int32_t lfs_parent(lfs_t *lfs, const lfs_block_t pair[2], | ||||
|         lfs_mdir_t *parent) { | ||||
|     if (lfs_pairisnull(lfs->root)) { | ||||
|         // TODO best place for this? | ||||
|         return LFS_ERR_NOENT; | ||||
|     } | ||||
|  | ||||
|     // search for both orderings so we can reuse the find function | ||||
|     lfs_block_t child[2] = {pair[0], pair[1]}; | ||||
|  | ||||
| @@ -3531,18 +3542,19 @@ int lfs_deorphan(lfs_t *lfs) { | ||||
| //    return lfs_dir_setattrs(lfs, &dir, &entry, attrs, count); | ||||
| //} | ||||
|  | ||||
| //static int lfs_fs_size_count(void *p, lfs_block_t block) { | ||||
| //    lfs_size_t *size = p; | ||||
| //    *size += 1; | ||||
| //    return 0; | ||||
| //} | ||||
| // | ||||
| //lfs_ssize_t lfs_fs_size(lfs_t *lfs) { | ||||
| //    lfs_size_t size = 0; | ||||
| //    int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size); | ||||
| //    if (err) { | ||||
| //        return err; | ||||
| //    } | ||||
| // | ||||
| //    return size; | ||||
| //} | ||||
| // TODO need lfs? | ||||
| static int lfs_fs_size_count(lfs_t *lfs, void *p, lfs_block_t block) { | ||||
|     lfs_size_t *size = p; | ||||
|     *size += 1; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| lfs_ssize_t lfs_fs_size(lfs_t *lfs) { | ||||
|     lfs_size_t size = 0; | ||||
|     int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size); | ||||
|     if (err) { | ||||
|         return err; | ||||
|     } | ||||
|  | ||||
|     return size; | ||||
| } | ||||
|   | ||||
							
								
								
									
										27
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -249,7 +249,8 @@ struct lfs_info { | ||||
|  | ||||
| // Custom attribute structure | ||||
| struct lfs_attr { | ||||
|     // Type of attribute, provided by user and used to identify the attribute | ||||
|     // 8-bit Type of attribute, provided by user and used to | ||||
|     // identify the attribute | ||||
|     uint8_t type; | ||||
|  | ||||
|     // Pointer to buffer containing the attribute | ||||
| @@ -259,7 +260,7 @@ struct lfs_attr { | ||||
|     lfs_size_t size; | ||||
|  | ||||
|     // Pointer to next attribute in linked list | ||||
|     const struct lfs_attr *next; | ||||
|     struct lfs_attr *next; | ||||
| }; | ||||
|  | ||||
| // Optional configuration provided during lfs_file_opencfg | ||||
| @@ -268,9 +269,9 @@ struct lfs_file_config { | ||||
|     // If NULL, malloc will be used by default. | ||||
|     void *buffer; | ||||
|  | ||||
|     // Optional, custom attributes | ||||
|     // Optional, linked list of custom attributes. | ||||
|     // TODO document more | ||||
|     const struct lfs_attr *attrs; | ||||
|     struct lfs_attr *attrs; | ||||
| }; | ||||
|  | ||||
|  | ||||
| @@ -582,7 +583,8 @@ lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir); | ||||
| int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); | ||||
|  | ||||
|  | ||||
| /// Filesystem filesystem operations /// | ||||
| /// Filesystem filesystem operations /// TODO choose one | ||||
| /// Miscellaneous littlefs specific operations /// TODO choose one | ||||
|  | ||||
| // Get custom attributes on the filesystem | ||||
| // | ||||
| @@ -616,9 +618,6 @@ int lfs_fs_setattr(lfs_t *lfs, | ||||
| // Returns the number of allocated blocks, or a negative error code on failure. | ||||
| lfs_ssize_t lfs_fs_size(lfs_t *lfs); | ||||
|  | ||||
|  | ||||
| /// Miscellaneous littlefs specific operations /// | ||||
|  | ||||
| // Traverse through all blocks in use by the filesystem | ||||
| // | ||||
| // The provided callback will be called with each block address that is | ||||
| @@ -626,16 +625,8 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs); | ||||
| // blocks are in use or how much of the storage is available. | ||||
| // | ||||
| // Returns a negative error code on failure. | ||||
| int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); | ||||
|  | ||||
| // Prunes any recoverable errors that may have occured in the filesystem | ||||
| // | ||||
| // Not needed to be called by user unless an operation is interrupted | ||||
| // but the filesystem is still mounted. This is already called on first | ||||
| // allocation. | ||||
| // | ||||
| // Returns a negative error code on failure. | ||||
| int lfs_deorphan(lfs_t *lfs); | ||||
| // TODO don't pass lfs_t? | ||||
| int lfs_fs_traverse(lfs_t *lfs, int (*cb)(lfs_t*, void*, lfs_block_t), void *data); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -78,8 +78,11 @@ do | ||||
|     rm -rf blocks | ||||
|     mkdir blocks | ||||
|     ln -s /dev/zero blocks/$(printf '%x' $i) | ||||
|     echo $i 1i | ||||
|     lfs_mktree | ||||
|     echo $i 2i | ||||
|     lfs_chktree | ||||
|     echo $i 3i | ||||
| done | ||||
|  | ||||
| echo "--- Block persistance ---" | ||||
|   | ||||
| @@ -15,25 +15,29 @@ tests/test.py << TEST | ||||
|     lfs_mkdir(&lfs, "parent/child") => 0; | ||||
|     lfs_remove(&lfs, "parent/orphan") => 0; | ||||
| TEST | ||||
| # remove most recent file, this should be the update to the previous | ||||
| # corrupt most recent commit, this should be the update to the previous | ||||
| # linked-list entry and should orphan the child | ||||
| rm -v blocks/8 | ||||
| truncate -s-14 blocks/8 | ||||
| tests/test.py  << TEST | ||||
|     lfs_mount(&lfs, &cfg) => 0; | ||||
|     lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; | ||||
|     unsigned before = 0; | ||||
|     lfs_traverse(&lfs, test_count, &before) => 0; | ||||
|     test_log("before", before); | ||||
|  | ||||
|     lfs_deorphan(&lfs) => 0; | ||||
|  | ||||
|     lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; | ||||
|     unsigned after = 0; | ||||
|     lfs_traverse(&lfs, test_count, &after) => 0; | ||||
|     test_log("after", after); | ||||
|     lfs_ssize_t before = lfs_fs_size(&lfs); | ||||
|     before => 10; | ||||
|  | ||||
|     lfs_unmount(&lfs) => 0; | ||||
|     lfs_mount(&lfs, &cfg) => 0; | ||||
|  | ||||
|     lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; | ||||
|     lfs_ssize_t orphaned = lfs_fs_size(&lfs); | ||||
|     orphaned => 10; | ||||
|  | ||||
|     lfs_mkdir(&lfs, "parent/otherchild") => 0; | ||||
|  | ||||
|     lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; | ||||
|     lfs_ssize_t deorphaned = lfs_fs_size(&lfs); | ||||
|     deorphaned => 10; | ||||
|  | ||||
|     int diff = before - after; | ||||
|     diff => 2; | ||||
|     lfs_unmount(&lfs) => 0; | ||||
| TEST | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user