mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v2.4.0
			...
			fix-tell-r
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f42d28da24 | ||
|  | 73fd57b1e4 | 
							
								
								
									
										24
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -1503,9 +1503,13 @@ static int lfs_dir_compact(lfs_t *lfs, | ||||
|                 } | ||||
|             } | ||||
| #ifdef LFS_MIGRATE | ||||
|         } else if (lfs_pair_cmp(dir->pair, lfs->root) == 0 && lfs->lfs1) { | ||||
|             // we can't relocate our root during migrations, as this would | ||||
|             // cause the superblock to get updated, which would clobber v1 | ||||
|         } else if (lfs->lfs1) { | ||||
|             // do not proactively relocate blocks during migrations, this | ||||
|             // can cause a number of failure states such: clobbering the | ||||
|             // v1 superblock if we relocate root, and invalidating directory | ||||
|             // pointers if we relocate the head of a directory. On top of | ||||
|             // this, relocations increase the overall complexity of | ||||
|             // lfs_migration, which is already a delicate operation. | ||||
| #endif | ||||
|         } else { | ||||
|             // we're writing too much, time to relocate | ||||
| @@ -2064,10 +2068,14 @@ int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) { | ||||
|     dir->pos = lfs_min(2, off); | ||||
|     off -= dir->pos; | ||||
|  | ||||
|     while (off != 0) { | ||||
|         dir->id = lfs_min(dir->m.count, off); | ||||
|         dir->pos += dir->id; | ||||
|         off -= dir->id; | ||||
|     // skip superblock entry | ||||
|     dir->id = (off > 0 && lfs_pair_cmp(dir->head, lfs->root) == 0); | ||||
|  | ||||
|     while (off > 0) { | ||||
|         int diff = lfs_min(dir->m.count - dir->id, off); | ||||
|         dir->id += diff; | ||||
|         dir->pos += diff; | ||||
|         off -= diff; | ||||
|  | ||||
|         if (dir->id == dir->m.count) { | ||||
|             if (!dir->m.split) { | ||||
| @@ -2080,6 +2088,8 @@ int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) { | ||||
|                 LFS_TRACE("lfs_dir_seek -> %d", err); | ||||
|                 return err; | ||||
|             } | ||||
|  | ||||
|             dir->id = 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -428,4 +428,78 @@ scripts/test.py << TEST | ||||
| TEST | ||||
| done | ||||
|  | ||||
| echo "--- Root seek test ---" | ||||
| ./scripts/test.py << TEST | ||||
|     lfs_mount(&lfs, &cfg) => 0; | ||||
|     for (int i = 3; i < $MEDIUMSIZE; i++) { | ||||
|         sprintf(path, "hi%03d", i); | ||||
|         lfs_mkdir(&lfs, path) => 0; | ||||
|     } | ||||
|  | ||||
|     lfs_dir_open(&lfs, &dir, "/") => 0; | ||||
|     for (int i = 0; i < $MEDIUMSIZE; i++) { | ||||
|         if (i == 0) { | ||||
|             sprintf(path, "."); | ||||
|         } else if (i == 1) { | ||||
|             sprintf(path, ".."); | ||||
|         } else if (i == 2) { | ||||
|             sprintf(path, "hello"); | ||||
|         } else { | ||||
|             sprintf(path, "hi%03d", i); | ||||
|         } | ||||
|         lfs_dir_read(&lfs, &dir, &info) => 1; | ||||
|         strcmp(path, info.name) => 0; | ||||
|     } | ||||
|     lfs_dir_read(&lfs, &dir, &info) => 0; | ||||
|     lfs_dir_close(&lfs, &dir) => 0; | ||||
|  | ||||
|     for (int j = 0; j < $MEDIUMSIZE; j++) { | ||||
|         lfs_soff_t off = -1; | ||||
|  | ||||
|         lfs_dir_open(&lfs, &dir, "/") => 0; | ||||
|         for (int i = 0; i < $MEDIUMSIZE; i++) { | ||||
|             if (i == 0) { | ||||
|                 sprintf(path, "."); | ||||
|             } else if (i == 1) { | ||||
|                 sprintf(path, ".."); | ||||
|             } else if (i == 2) { | ||||
|                 sprintf(path, "hello"); | ||||
|             } else { | ||||
|                 sprintf(path, "hi%03d", i); | ||||
|             } | ||||
|  | ||||
|             if (i == j) { | ||||
|                 off = lfs_dir_tell(&lfs, &dir); | ||||
|                 off >= 0 => true; | ||||
|             } | ||||
|  | ||||
|             lfs_dir_read(&lfs, &dir, &info) => 1; | ||||
|             strcmp(path, info.name) => 0; | ||||
|         } | ||||
|         lfs_dir_read(&lfs, &dir, &info) => 0; | ||||
|         lfs_dir_close(&lfs, &dir) => 0; | ||||
|  | ||||
|         lfs_dir_open(&lfs, &dir, "/") => 0; | ||||
|         lfs_dir_seek(&lfs, &dir, off) => 0; | ||||
|         for (int i = j; i < $MEDIUMSIZE; i++) { | ||||
|             if (i == 0) { | ||||
|                 sprintf(path, "."); | ||||
|             } else if (i == 1) { | ||||
|                 sprintf(path, ".."); | ||||
|             } else if (i == 2) { | ||||
|                 sprintf(path, "hello"); | ||||
|             } else { | ||||
|                 sprintf(path, "hi%03d", i); | ||||
|             } | ||||
|  | ||||
|             lfs_dir_read(&lfs, &dir, &info) => 1; | ||||
|             strcmp(path, info.name) => 0; | ||||
|         } | ||||
|         lfs_dir_read(&lfs, &dir, &info) => 0; | ||||
|         lfs_dir_close(&lfs, &dir) => 0; | ||||
|     } | ||||
|  | ||||
|     lfs_unmount(&lfs) => 0; | ||||
| TEST | ||||
|  | ||||
| scripts/results.py | ||||
|   | ||||
		Reference in New Issue
	
	Block a user