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) { | 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 |     // iterate over all directory directory entries | ||||||
|     pdir->tail[0] = 0; |     pdir->tail[0] = 0; | ||||||
|     pdir->tail[1] = 1; |     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], | static int32_t lfs_parent(lfs_t *lfs, const lfs_block_t pair[2], | ||||||
|         lfs_mdir_t *parent) { |         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 |     // search for both orderings so we can reuse the find function | ||||||
|     lfs_block_t child[2] = {pair[0], pair[1]}; |     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); | //    return lfs_dir_setattrs(lfs, &dir, &entry, attrs, count); | ||||||
| //} | //} | ||||||
|  |  | ||||||
| //static int lfs_fs_size_count(void *p, lfs_block_t block) { | // TODO need lfs? | ||||||
| //    lfs_size_t *size = p; | static int lfs_fs_size_count(lfs_t *lfs, void *p, lfs_block_t block) { | ||||||
| //    *size += 1; |     lfs_size_t *size = p; | ||||||
| //    return 0; |     *size += 1; | ||||||
| //} |     return 0; | ||||||
| // | } | ||||||
| //lfs_ssize_t lfs_fs_size(lfs_t *lfs) { |  | ||||||
| //    lfs_size_t size = 0; | lfs_ssize_t lfs_fs_size(lfs_t *lfs) { | ||||||
| //    int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size); |     lfs_size_t size = 0; | ||||||
| //    if (err) { |     int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size); | ||||||
| //        return err; |     if (err) { | ||||||
| //    } |         return err; | ||||||
| // |     } | ||||||
| //    return size; |  | ||||||
| //} |     return size; | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -249,7 +249,8 @@ struct lfs_info { | |||||||
|  |  | ||||||
| // Custom attribute structure | // Custom attribute structure | ||||||
| struct lfs_attr { | 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; |     uint8_t type; | ||||||
|  |  | ||||||
|     // Pointer to buffer containing the attribute |     // Pointer to buffer containing the attribute | ||||||
| @@ -259,7 +260,7 @@ struct lfs_attr { | |||||||
|     lfs_size_t size; |     lfs_size_t size; | ||||||
|  |  | ||||||
|     // Pointer to next attribute in linked list |     // Pointer to next attribute in linked list | ||||||
|     const struct lfs_attr *next; |     struct lfs_attr *next; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Optional configuration provided during lfs_file_opencfg | // Optional configuration provided during lfs_file_opencfg | ||||||
| @@ -268,9 +269,9 @@ struct lfs_file_config { | |||||||
|     // If NULL, malloc will be used by default. |     // If NULL, malloc will be used by default. | ||||||
|     void *buffer; |     void *buffer; | ||||||
|  |  | ||||||
|     // Optional, custom attributes |     // Optional, linked list of custom attributes. | ||||||
|     // TODO document more |     // 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); | 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 | // 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. | // Returns the number of allocated blocks, or a negative error code on failure. | ||||||
| lfs_ssize_t lfs_fs_size(lfs_t *lfs); | lfs_ssize_t lfs_fs_size(lfs_t *lfs); | ||||||
|  |  | ||||||
|  |  | ||||||
| /// Miscellaneous littlefs specific operations /// |  | ||||||
|  |  | ||||||
| // Traverse through all blocks in use by the filesystem | // Traverse through all blocks in use by the filesystem | ||||||
| // | // | ||||||
| // The provided callback will be called with each block address that is | // 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. | // blocks are in use or how much of the storage is available. | ||||||
| // | // | ||||||
| // Returns a negative error code on failure. | // Returns a negative error code on failure. | ||||||
| int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); | // TODO don't pass lfs_t? | ||||||
|  | int lfs_fs_traverse(lfs_t *lfs, int (*cb)(lfs_t*, 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); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -78,8 +78,11 @@ do | |||||||
|     rm -rf blocks |     rm -rf blocks | ||||||
|     mkdir blocks |     mkdir blocks | ||||||
|     ln -s /dev/zero blocks/$(printf '%x' $i) |     ln -s /dev/zero blocks/$(printf '%x' $i) | ||||||
|  |     echo $i 1i | ||||||
|     lfs_mktree |     lfs_mktree | ||||||
|  |     echo $i 2i | ||||||
|     lfs_chktree |     lfs_chktree | ||||||
|  |     echo $i 3i | ||||||
| done | done | ||||||
|  |  | ||||||
| echo "--- Block persistance ---" | echo "--- Block persistance ---" | ||||||
|   | |||||||
| @@ -15,25 +15,29 @@ tests/test.py << TEST | |||||||
|     lfs_mkdir(&lfs, "parent/child") => 0; |     lfs_mkdir(&lfs, "parent/child") => 0; | ||||||
|     lfs_remove(&lfs, "parent/orphan") => 0; |     lfs_remove(&lfs, "parent/orphan") => 0; | ||||||
| TEST | 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 | # linked-list entry and should orphan the child | ||||||
| rm -v blocks/8 | truncate -s-14 blocks/8 | ||||||
| tests/test.py << TEST | tests/test.py  << TEST | ||||||
|     lfs_mount(&lfs, &cfg) => 0; |     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; |     lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; | ||||||
|     unsigned after = 0; |     lfs_ssize_t before = lfs_fs_size(&lfs); | ||||||
|     lfs_traverse(&lfs, test_count, &after) => 0; |     before => 10; | ||||||
|     test_log("after", after); |  | ||||||
|  |     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; |     lfs_unmount(&lfs) => 0; | ||||||
| TEST | TEST | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user