mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	Added -Wjump-misses-init and fixed uninitialized warnings
This commit is contained in:
		
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							| @@ -25,7 +25,8 @@ ifdef WORD | |||||||
| override CFLAGS += -m$(WORD) | override CFLAGS += -m$(WORD) | ||||||
| endif | endif | ||||||
| override CFLAGS += -I. | override CFLAGS += -I. | ||||||
| override CFLAGS += -std=c99 -Wall -pedantic -Wshadow -Wunused-parameter | override CFLAGS += -std=c99 -Wall -pedantic | ||||||
|  | override CFLAGS += -Wshadow -Wunused-parameter -Wjump-misses-init | ||||||
|  |  | ||||||
|  |  | ||||||
| all: $(TARGET) | all: $(TARGET) | ||||||
|   | |||||||
							
								
								
									
										224
									
								
								lfs.c
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								lfs.c
									
									
									
									
									
								
							| @@ -2096,83 +2096,86 @@ cleanup: | |||||||
| } | } | ||||||
|  |  | ||||||
| int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { | int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { | ||||||
|     int err = lfs_init(lfs, cfg); |     int err = 0; | ||||||
|     if (err) { |     if (true) { | ||||||
|         return err; |         err = lfs_init(lfs, cfg); | ||||||
|     } |         if (err) { | ||||||
|  |             return err; | ||||||
|  |         } | ||||||
|  |  | ||||||
|     // create free lookahead |         // create free lookahead | ||||||
|     memset(lfs->free.buffer, 0, lfs->cfg->lookahead/8); |         memset(lfs->free.buffer, 0, lfs->cfg->lookahead/8); | ||||||
|     lfs->free.off = 0; |         lfs->free.off = 0; | ||||||
|     lfs->free.size = lfs_min(lfs->cfg->lookahead, lfs->cfg->block_count); |         lfs->free.size = lfs_min(lfs->cfg->lookahead, lfs->cfg->block_count); | ||||||
|     lfs->free.i = 0; |         lfs->free.i = 0; | ||||||
|     lfs_alloc_ack(lfs); |         lfs_alloc_ack(lfs); | ||||||
|  |  | ||||||
|     // create superblock dir |         // create superblock dir | ||||||
|     lfs_dir_t superdir; |         lfs_dir_t superdir; | ||||||
|     err = lfs_dir_alloc(lfs, &superdir); |         err = lfs_dir_alloc(lfs, &superdir); | ||||||
|     if (err) { |         if (err) { | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // write root directory |  | ||||||
|     lfs_dir_t root; |  | ||||||
|     err = lfs_dir_alloc(lfs, &root); |  | ||||||
|     if (err) { |  | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     err = lfs_dir_commit(lfs, &root, NULL, 0); |  | ||||||
|     if (err) { |  | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     lfs->root[0] = root.pair[0]; |  | ||||||
|     lfs->root[1] = root.pair[1]; |  | ||||||
|  |  | ||||||
|     // write superblocks |  | ||||||
|     lfs_superblock_t superblock = { |  | ||||||
|         .off = sizeof(superdir.d), |  | ||||||
|         .d.type = LFS_TYPE_SUPERBLOCK, |  | ||||||
|         .d.elen = sizeof(superblock.d) - sizeof(superblock.d.magic) - 4, |  | ||||||
|         .d.nlen = sizeof(superblock.d.magic), |  | ||||||
|         .d.version = LFS_DISK_VERSION, |  | ||||||
|         .d.magic = {"littlefs"}, |  | ||||||
|         .d.block_size  = lfs->cfg->block_size, |  | ||||||
|         .d.block_count = lfs->cfg->block_count, |  | ||||||
|         .d.root = {lfs->root[0], lfs->root[1]}, |  | ||||||
|     }; |  | ||||||
|     superdir.d.tail[0] = root.pair[0]; |  | ||||||
|     superdir.d.tail[1] = root.pair[1]; |  | ||||||
|     superdir.d.size = sizeof(superdir.d) + sizeof(superblock.d) + 4; |  | ||||||
|  |  | ||||||
|     // write both pairs to be safe |  | ||||||
|     lfs_superblock_tole32(&superblock.d); |  | ||||||
|     bool valid = false; |  | ||||||
|     for (int i = 0; i < 2; i++) { |  | ||||||
|         err = lfs_dir_commit(lfs, &superdir, (struct lfs_region[]){ |  | ||||||
|                 {sizeof(superdir.d), sizeof(superblock.d), |  | ||||||
|                  &superblock.d, sizeof(superblock.d)} |  | ||||||
|             }, 1); |  | ||||||
|         if (err && err != LFS_ERR_CORRUPT) { |  | ||||||
|             goto cleanup; |             goto cleanup; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         valid = valid || !err; |         // write root directory | ||||||
|     } |         lfs_dir_t root; | ||||||
|  |         err = lfs_dir_alloc(lfs, &root); | ||||||
|  |         if (err) { | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |  | ||||||
|     if (!valid) { |         err = lfs_dir_commit(lfs, &root, NULL, 0); | ||||||
|         err = LFS_ERR_CORRUPT; |         if (err) { | ||||||
|         goto cleanup; |             goto cleanup; | ||||||
|     } |         } | ||||||
|  |  | ||||||
|     // sanity check that fetch works |         lfs->root[0] = root.pair[0]; | ||||||
|     err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1}); |         lfs->root[1] = root.pair[1]; | ||||||
|     if (err) { |  | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     lfs_alloc_ack(lfs); |         // write superblocks | ||||||
|  |         lfs_superblock_t superblock = { | ||||||
|  |             .off = sizeof(superdir.d), | ||||||
|  |             .d.type = LFS_TYPE_SUPERBLOCK, | ||||||
|  |             .d.elen = sizeof(superblock.d) - sizeof(superblock.d.magic) - 4, | ||||||
|  |             .d.nlen = sizeof(superblock.d.magic), | ||||||
|  |             .d.version = LFS_DISK_VERSION, | ||||||
|  |             .d.magic = {"littlefs"}, | ||||||
|  |             .d.block_size  = lfs->cfg->block_size, | ||||||
|  |             .d.block_count = lfs->cfg->block_count, | ||||||
|  |             .d.root = {lfs->root[0], lfs->root[1]}, | ||||||
|  |         }; | ||||||
|  |         superdir.d.tail[0] = root.pair[0]; | ||||||
|  |         superdir.d.tail[1] = root.pair[1]; | ||||||
|  |         superdir.d.size = sizeof(superdir.d) + sizeof(superblock.d) + 4; | ||||||
|  |  | ||||||
|  |         // write both pairs to be safe | ||||||
|  |         lfs_superblock_tole32(&superblock.d); | ||||||
|  |         bool valid = false; | ||||||
|  |         for (int i = 0; i < 2; i++) { | ||||||
|  |             err = lfs_dir_commit(lfs, &superdir, (struct lfs_region[]){ | ||||||
|  |                     {sizeof(superdir.d), sizeof(superblock.d), | ||||||
|  |                      &superblock.d, sizeof(superblock.d)} | ||||||
|  |                 }, 1); | ||||||
|  |             if (err && err != LFS_ERR_CORRUPT) { | ||||||
|  |                 goto cleanup; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             valid = valid || !err; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if (!valid) { | ||||||
|  |             err = LFS_ERR_CORRUPT; | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // sanity check that fetch works | ||||||
|  |         err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1}); | ||||||
|  |         if (err) { | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         lfs_alloc_ack(lfs); | ||||||
|  |     } | ||||||
|  |  | ||||||
| cleanup: | cleanup: | ||||||
|     lfs_deinit(lfs); |     lfs_deinit(lfs); | ||||||
| @@ -2180,53 +2183,56 @@ cleanup: | |||||||
| } | } | ||||||
|  |  | ||||||
| int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { | ||||||
|     int err = lfs_init(lfs, cfg); |     int err = 0; | ||||||
|     if (err) { |     if (true) { | ||||||
|         return err; |         err = lfs_init(lfs, cfg); | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // setup free lookahead |  | ||||||
|     lfs->free.off = 0; |  | ||||||
|     lfs->free.size = 0; |  | ||||||
|     lfs->free.i = 0; |  | ||||||
|     lfs_alloc_ack(lfs); |  | ||||||
|  |  | ||||||
|     // load superblock |  | ||||||
|     lfs_dir_t dir; |  | ||||||
|     lfs_superblock_t superblock; |  | ||||||
|     err = lfs_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1}); |  | ||||||
|     if (err && err != LFS_ERR_CORRUPT) { |  | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (!err) { |  | ||||||
|         err = lfs_bd_read(lfs, dir.pair[0], sizeof(dir.d), |  | ||||||
|                 &superblock.d, sizeof(superblock.d)); |  | ||||||
|         lfs_superblock_fromle32(&superblock.d); |  | ||||||
|         if (err) { |         if (err) { | ||||||
|  |             return err; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // setup free lookahead | ||||||
|  |         lfs->free.off = 0; | ||||||
|  |         lfs->free.size = 0; | ||||||
|  |         lfs->free.i = 0; | ||||||
|  |         lfs_alloc_ack(lfs); | ||||||
|  |  | ||||||
|  |         // load superblock | ||||||
|  |         lfs_dir_t dir; | ||||||
|  |         lfs_superblock_t superblock; | ||||||
|  |         err = lfs_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1}); | ||||||
|  |         if (err && err != LFS_ERR_CORRUPT) { | ||||||
|             goto cleanup; |             goto cleanup; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         lfs->root[0] = superblock.d.root[0]; |         if (!err) { | ||||||
|         lfs->root[1] = superblock.d.root[1]; |             err = lfs_bd_read(lfs, dir.pair[0], sizeof(dir.d), | ||||||
|     } |                     &superblock.d, sizeof(superblock.d)); | ||||||
|  |             lfs_superblock_fromle32(&superblock.d); | ||||||
|  |             if (err) { | ||||||
|  |                 goto cleanup; | ||||||
|  |             } | ||||||
|  |  | ||||||
|     if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) { |             lfs->root[0] = superblock.d.root[0]; | ||||||
|         LFS_ERROR("Invalid superblock at %d %d", 0, 1); |             lfs->root[1] = superblock.d.root[1]; | ||||||
|         err = LFS_ERR_CORRUPT; |         } | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     uint16_t major_version = (0xffff & (superblock.d.version >> 16)); |         if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) { | ||||||
|     uint16_t minor_version = (0xffff & (superblock.d.version >>  0)); |             LFS_ERROR("Invalid superblock at %d %d", 0, 1); | ||||||
|     if ((major_version != LFS_DISK_VERSION_MAJOR || |             err = LFS_ERR_CORRUPT; | ||||||
|          minor_version > LFS_DISK_VERSION_MINOR)) { |             goto cleanup; | ||||||
|         LFS_ERROR("Invalid version %d.%d", major_version, minor_version); |         } | ||||||
|         err = LFS_ERR_INVAL; |  | ||||||
|         goto cleanup; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return 0; |         uint16_t major_version = (0xffff & (superblock.d.version >> 16)); | ||||||
|  |         uint16_t minor_version = (0xffff & (superblock.d.version >>  0)); | ||||||
|  |         if ((major_version != LFS_DISK_VERSION_MAJOR || | ||||||
|  |              minor_version > LFS_DISK_VERSION_MINOR)) { | ||||||
|  |             LFS_ERROR("Invalid version %d.%d", major_version, minor_version); | ||||||
|  |             err = LFS_ERR_INVAL; | ||||||
|  |             goto cleanup; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
| cleanup: | cleanup: | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user