mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 08:42:40 +01:00 
			
		
		
		
	Changed block_cycles disable from 0 to -1
As it is now, block_cycles = 0 disables wear leveling. This was a mistake as 0 is the "default" value for several other config options. It's even worse when migrating from v1 as it's easy to miss the addition of block_cycles and end up with a filesystem that is not actually wear-leveling. Clearly, block_cycles = 0 should do anything but disable wear-leveling. Here, I've changed block_cycles = 0 to assert. Forcing users to set a value for block_cycles (500 is suggested). block_cycles can be set to -1 to explicitly disable wear leveling if desired.
This commit is contained in:
		
							
								
								
									
										8
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -1453,7 +1453,7 @@ static int lfs_dir_compact(lfs_t *lfs, | |||||||
|  |  | ||||||
|     // increment revision count |     // increment revision count | ||||||
|     dir->rev += 1; |     dir->rev += 1; | ||||||
|     if (lfs->cfg->block_cycles && |     if (lfs->cfg->block_cycles > 0 && | ||||||
|             (dir->rev % (lfs->cfg->block_cycles+1) == 0)) { |             (dir->rev % (lfs->cfg->block_cycles+1) == 0)) { | ||||||
|         if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { |         if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { | ||||||
|             // oh no! we're writing too much to the superblock, |             // oh no! we're writing too much to the superblock, | ||||||
| @@ -3192,8 +3192,10 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|     LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4)) |     LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4)) | ||||||
|             <= lfs->cfg->block_size); |             <= lfs->cfg->block_size); | ||||||
|  |  | ||||||
|     // we don't support some corner cases |     // block_cycles = 0 is no longer supported, must either set a number | ||||||
|     LFS_ASSERT(lfs->cfg->block_cycles < 0xffffffff); |     // of erase cycles before moving logs to another block (~500 suggested), | ||||||
|  |     // or explicitly disable wear-leveling with -1. | ||||||
|  |     LFS_ASSERT(lfs->cfg->block_cycles != 0); | ||||||
|  |  | ||||||
|     // setup read cache |     // setup read cache | ||||||
|     if (lfs->cfg->read_buffer) { |     if (lfs->cfg->read_buffer) { | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -190,9 +190,12 @@ struct lfs_config { | |||||||
|     // Number of erasable blocks on the device. |     // Number of erasable blocks on the device. | ||||||
|     lfs_size_t block_count; |     lfs_size_t block_count; | ||||||
|  |  | ||||||
|     // Number of erase cycles before we should move data to another block. |     // Number of erase cycles before we should move logs to another block. | ||||||
|     // May be zero, in which case no block-level wear-leveling is performed. |     // Suggested values are in the range 100-1000, with large values having | ||||||
|     uint32_t block_cycles; |     // better performance at the cost of less consistent wear distribution. | ||||||
|  |     // | ||||||
|  |     // Set to -1 to disable block-level wear-leveling. | ||||||
|  |     int32_t block_cycles; | ||||||
|  |  | ||||||
|     // Size of block caches. Each cache buffers a portion of a block in RAM. |     // Size of block caches. Each cache buffers a portion of a block in RAM. | ||||||
|     // The littlefs needs a read cache, a program cache, and one additional |     // The littlefs needs a read cache, a program cache, and one additional | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user