mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Added handling for corrupt as initial state of blocks
Before this, littlefs incorrectly assumed corrupt blocks were only the result of our own modification. This would be fine for most cases of freshly erased storage, but for storage with block-level ECC this wasn't always true. Fortunately, it's quite easy for littlefs to handle this case correctly, as long as corrupt storage always reports that it is corrupt, which for most forms of ECC is the case unless we perform a write on the storage. found by rojer
This commit is contained in:
		
							
								
								
									
										13
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -417,11 +417,14 @@ static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir) { | |||||||
|     // rather than clobbering one of the blocks we just pretend |     // rather than clobbering one of the blocks we just pretend | ||||||
|     // the revision may be valid |     // the revision may be valid | ||||||
|     int err = lfs_bd_read(lfs, dir->pair[0], 0, &dir->d.rev, 4); |     int err = lfs_bd_read(lfs, dir->pair[0], 0, &dir->d.rev, 4); | ||||||
|     dir->d.rev = lfs_fromle32(dir->d.rev); |     if (err && err != LFS_ERR_CORRUPT) { | ||||||
|     if (err) { |  | ||||||
|         return err; |         return err; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (err != LFS_ERR_CORRUPT) { | ||||||
|  |         dir->d.rev = lfs_fromle32(dir->d.rev); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // set defaults |     // set defaults | ||||||
|     dir->d.rev += 1; |     dir->d.rev += 1; | ||||||
|     dir->d.size = sizeof(dir->d)+4; |     dir->d.size = sizeof(dir->d)+4; | ||||||
| @@ -445,6 +448,9 @@ static int lfs_dir_fetch(lfs_t *lfs, | |||||||
|         int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test)); |         int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test)); | ||||||
|         lfs_dir_fromle32(&test); |         lfs_dir_fromle32(&test); | ||||||
|         if (err) { |         if (err) { | ||||||
|  |             if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -464,6 +470,9 @@ static int lfs_dir_fetch(lfs_t *lfs, | |||||||
|         err = lfs_bd_crc(lfs, tpair[i], sizeof(test), |         err = lfs_bd_crc(lfs, tpair[i], sizeof(test), | ||||||
|                 (0x7fffffff & test.size) - sizeof(test), &crc); |                 (0x7fffffff & test.size) - sizeof(test), &crc); | ||||||
|         if (err) { |         if (err) { | ||||||
|  |             if (err == LFS_ERR_CORRUPT) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|             return err; |             return err; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user