mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	Merge pull request #502 from mon/feature/meta_limits
Add metadata_max config to help performance on devices with large blocks
This commit is contained in:
		
							
								
								
									
										15
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -1591,7 +1591,8 @@ static int lfs_dir_compact(lfs_t *lfs, | ||||
|         // for metadata updates. | ||||
|         if (end - begin < 0xff && | ||||
|                 size <= lfs_min(lfs->cfg->block_size - 36, | ||||
|                     lfs_alignup(lfs->cfg->block_size/2, | ||||
|                     lfs_alignup((lfs->cfg->metadata_max ? | ||||
|                             lfs->cfg->metadata_max : lfs->cfg->block_size)/2, | ||||
|                         lfs->cfg->prog_size))) { | ||||
|             break; | ||||
|         } | ||||
| @@ -1676,7 +1677,8 @@ static int lfs_dir_compact(lfs_t *lfs, | ||||
|                 .crc = 0xffffffff, | ||||
|  | ||||
|                 .begin = 0, | ||||
|                 .end = lfs->cfg->block_size - 8, | ||||
|                 .end = (lfs->cfg->metadata_max ? | ||||
|                     lfs->cfg->metadata_max : lfs->cfg->block_size) - 8, | ||||
|             }; | ||||
|  | ||||
|             // erase block to write to | ||||
| @@ -1886,7 +1888,8 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, | ||||
|             .crc = 0xffffffff, | ||||
|  | ||||
|             .begin = dir->off, | ||||
|             .end = lfs->cfg->block_size - 8, | ||||
|             .end = (lfs->cfg->metadata_max ? | ||||
|                 lfs->cfg->metadata_max : lfs->cfg->block_size) - 8, | ||||
|         }; | ||||
|  | ||||
|         // traverse attrs that need to be written out | ||||
| @@ -2968,7 +2971,9 @@ static lfs_ssize_t lfs_file_rawwrite(lfs_t *lfs, lfs_file_t *file, | ||||
|     if ((file->flags & LFS_F_INLINE) && | ||||
|             lfs_max(file->pos+nsize, file->ctz.size) > | ||||
|             lfs_min(0x3fe, lfs_min( | ||||
|                 lfs->cfg->cache_size, lfs->cfg->block_size/8))) { | ||||
|                 lfs->cfg->cache_size, | ||||
|                 (lfs->cfg->metadata_max ? | ||||
|                     lfs->cfg->metadata_max : lfs->cfg->block_size) / 8))) { | ||||
|         // inline file doesn't fit anymore | ||||
|         int err = lfs_file_outline(lfs, file); | ||||
|         if (err) { | ||||
| @@ -3538,6 +3543,8 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { | ||||
|         lfs->attr_max = LFS_ATTR_MAX; | ||||
|     } | ||||
|  | ||||
|     LFS_ASSERT(lfs->cfg->metadata_max <= lfs->cfg->block_size); | ||||
|  | ||||
|     // setup default state | ||||
|     lfs->root[0] = LFS_BLOCK_NULL; | ||||
|     lfs->root[1] = LFS_BLOCK_NULL; | ||||
|   | ||||
							
								
								
									
										6
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								lfs.h
									
									
									
									
									
								
							| @@ -256,6 +256,12 @@ struct lfs_config { | ||||
|     // larger attributes size but must be <= LFS_ATTR_MAX. Defaults to | ||||
|     // LFS_ATTR_MAX when zero. | ||||
|     lfs_size_t attr_max; | ||||
|  | ||||
|     // Optional upper limit on total space given to metadata pairs in bytes. On | ||||
|     // devices with large blocks (e.g. 128kB) setting this to a low size (2-8kB) | ||||
|     // can help bound the metadata compaction time. Must be <= block_size. | ||||
|     // Defaults to block_size when zero. | ||||
|     lfs_size_t metadata_max; | ||||
| }; | ||||
|  | ||||
| // File info structure | ||||
|   | ||||
		Reference in New Issue
	
	Block a user