mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Fixed several small issues found during wider testing
- Fixed cache tarnishing issue where flush did not clean up read caches - Removed extra alloc acks which would prevent file relocations from resolving on an exhausted filesystem - Removed unsigned comparison < 0 from changed in file seek - Fixed bug in lfs_dir_getslice with using gtag's size - Removed warnings around PRIu32 used 16-bit types in debug info
This commit is contained in:
		
							
								
								
									
										21
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -556,8 +556,7 @@ static lfs_stag_t lfs_dir_getslice(lfs_t *lfs, const lfs_mdir_t *dir, | |||||||
|                 return err; |                 return err; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             memset((uint8_t*)gbuffer + diff, 0, |             memset((uint8_t*)gbuffer + diff, 0, gsize - diff); | ||||||
|                     lfs_tag_size(gtag) - diff); |  | ||||||
|  |  | ||||||
|             return tag + gdiff; |             return tag + gdiff; | ||||||
|         } |         } | ||||||
| @@ -1651,6 +1650,7 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, | |||||||
|             f->flags &= ~LFS_F_READING; |             f->flags &= ~LFS_F_READING; | ||||||
|             f->off = 0; |             f->off = 0; | ||||||
|  |  | ||||||
|  |             lfs_alloc_ack(lfs); | ||||||
|             int err = lfs_file_relocate(lfs, f); |             int err = lfs_file_relocate(lfs, f); | ||||||
|             if (err) { |             if (err) { | ||||||
|                 return err; |                 return err; | ||||||
| @@ -2419,7 +2419,6 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) { | |||||||
| } | } | ||||||
|  |  | ||||||
| static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) { | static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) { | ||||||
|     lfs_alloc_ack(lfs); |  | ||||||
|     while (true) { |     while (true) { | ||||||
|         // just relocate what exists into new block |         // just relocate what exists into new block | ||||||
|         lfs_block_t nblock; |         lfs_block_t nblock; | ||||||
| @@ -2490,7 +2489,12 @@ relocate: | |||||||
| } | } | ||||||
|  |  | ||||||
| static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { | static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { | ||||||
|     file->flags &= ~LFS_F_READING; |     if (file->flags & LFS_F_READING) { | ||||||
|  |         if (!(file->flags & LFS_F_INLINE)) { | ||||||
|  |             lfs_cache_drop(lfs, &file->cache); | ||||||
|  |         } | ||||||
|  |         file->flags &= ~LFS_F_READING; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (file->flags & LFS_F_WRITING) { |     if (file->flags & LFS_F_WRITING) { | ||||||
|         lfs_off_t pos = file->pos; |         lfs_off_t pos = file->pos; | ||||||
| @@ -2737,6 +2741,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, | |||||||
|                 lfs->cfg->cache_size, lfs->cfg->block_size/8))) { |                 lfs->cfg->cache_size, lfs->cfg->block_size/8))) { | ||||||
|         // inline file doesn't fit anymore |         // inline file doesn't fit anymore | ||||||
|         file->off = file->pos; |         file->off = file->pos; | ||||||
|  |         lfs_alloc_ack(lfs); | ||||||
|         int err = lfs_file_relocate(lfs, file); |         int err = lfs_file_relocate(lfs, file); | ||||||
|         if (err) { |         if (err) { | ||||||
|             file->flags |= LFS_F_ERRED; |             file->flags |= LFS_F_ERRED; | ||||||
| @@ -2832,7 +2837,7 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, | |||||||
|         npos = file->ctz.size + off; |         npos = file->ctz.size + off; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (npos < 0 || npos > lfs->file_max) { |     if (npos > lfs->file_max) { | ||||||
|         // file position out of range |         // file position out of range | ||||||
|         return LFS_ERR_INVAL; |         return LFS_ERR_INVAL; | ||||||
|     } |     } | ||||||
| @@ -3370,7 +3375,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|             uint16_t minor_version = (0xffff & (superblock.version >>  0)); |             uint16_t minor_version = (0xffff & (superblock.version >>  0)); | ||||||
|             if ((major_version != LFS_DISK_VERSION_MAJOR || |             if ((major_version != LFS_DISK_VERSION_MAJOR || | ||||||
|                  minor_version > LFS_DISK_VERSION_MINOR)) { |                  minor_version > LFS_DISK_VERSION_MINOR)) { | ||||||
|                 LFS_ERROR("Invalid version %"PRIu32".%"PRIu32, |                 LFS_ERROR("Invalid version %"PRIu16".%"PRIu16, | ||||||
|                         major_version, minor_version); |                         major_version, minor_version); | ||||||
|                 err = LFS_ERR_INVAL; |                 err = LFS_ERR_INVAL; | ||||||
|                 goto cleanup; |                 goto cleanup; | ||||||
| @@ -3428,7 +3433,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | |||||||
|     lfs->gpending.tag += !lfs_tag_isvalid(lfs->gpending.tag); |     lfs->gpending.tag += !lfs_tag_isvalid(lfs->gpending.tag); | ||||||
|     lfs->gstate = lfs->gpending; |     lfs->gstate = lfs->gpending; | ||||||
|     if (lfs_gstate_hasmove(&lfs->gstate)) { |     if (lfs_gstate_hasmove(&lfs->gstate)) { | ||||||
|         LFS_DEBUG("Found move %"PRIu32" %"PRIu32" %"PRIu32, |         LFS_DEBUG("Found move %"PRIu32" %"PRIu32" %"PRIu16, | ||||||
|                 lfs->gstate.pair[0], |                 lfs->gstate.pair[0], | ||||||
|                 lfs->gstate.pair[1], |                 lfs->gstate.pair[1], | ||||||
|                 lfs_tag_id(lfs->gstate.tag)); |                 lfs_tag_id(lfs->gstate.tag)); | ||||||
| @@ -3664,7 +3669,7 @@ static int lfs_fs_demove(lfs_t *lfs) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Fix bad moves |     // Fix bad moves | ||||||
|     LFS_DEBUG("Fixing move %"PRIu32" %"PRIu32" %"PRIu32, |     LFS_DEBUG("Fixing move %"PRIu32" %"PRIu32" %"PRIu16, | ||||||
|             lfs->gstate.pair[0], |             lfs->gstate.pair[0], | ||||||
|             lfs->gstate.pair[1], |             lfs->gstate.pair[1], | ||||||
|             lfs_tag_id(lfs->gstate.tag)); |             lfs_tag_id(lfs->gstate.tag)); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user