/littlefs-2.7.6/ |
D | lfs.c | 5 * SPDX-License-Identifier: BSD-3-Clause 10 #define LFS_BLOCK_NULL ((lfs_block_t)-1) 11 #define LFS_BLOCK_INLINE ((lfs_block_t)-2) 18 rcache->block = LFS_BLOCK_NULL; in lfs_cache_drop() 23 memset(pcache->buffer, 0xff, lfs->cfg->cache_size); in lfs_cache_zero() 24 pcache->block = LFS_BLOCK_NULL; in lfs_cache_zero() 32 if (block >= lfs->cfg->block_count || in lfs_bd_read() 33 off+size > lfs->cfg->block_size) { in lfs_bd_read() 40 if (pcache && block == pcache->block && in lfs_bd_read() 41 off < pcache->off + pcache->size) { in lfs_bd_read() [all …]
|
D | DESIGN.md | 3 A little fail-safe filesystem designed for microcontrollers. 6 | | | .---._____ 7 .-----. | | 8 --|o |---| littlefs | 9 --| |---| | 10 '-----' '----------' 16 filesystem that is resilient to power-loss and flash wear without using 19 This document covers the high-level design of littlefs, how it is different 21 low-level details covering every bit on disk, check out [SPEC.md](SPEC.md). 25 The embedded systems littlefs targets are usually 32-bit microcontrollers with [all …]
|
D | lfs_util.h | 5 * SPDX-License-Identifier: BSD-3-Clause 11 // LFS_CONFIG as a header file to include (-DLFS_CONFIG=lfs_config.h). 65 // macros must not have side-effects as the macros can be removed for a smaller 71 #define LFS_TRACE(fmt, ...) LOG_DBG("%s:%d:trace: " fmt, __FILE__, __LINE__, __VA_ARGS__) 74 printf("%s:%d:trace: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) 83 #define LFS_DEBUG(fmt, ...) LOG_DBG("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__) 86 printf("%s:%d:debug: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) 95 #define LFS_WARN(fmt, ...) LOG_WRN("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__) 98 printf("%s:%d:warn: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) 107 #define LFS_ERROR(fmt, ...) LOG_ERR("%s:%d: " fmt, __FILE__, __LINE__, __VA_ARGS__) [all …]
|
D | .travis.yml | 4 - CFLAGS=-Werror 5 - MAKEFLAGS=-j 11 - $HOME/.cache/apt 14 _: &install-common 16 - sudo apt-get install python3 python3-pip 17 - sudo pip3 install toml 18 # setup a ram-backed disk to speed up reentrant tests 19 - mkdir disks 20 - sudo mount -t tmpfs -o size=100m tmpfs disks 21 - export TFLAGS="$TFLAGS --disk=disks/disk" [all …]
|
D | README.md | 3 A little fail-safe filesystem designed for microcontrollers. 6 | | | .---._____ 7 .-----. | | 8 --|o |---| littlefs | 9 --| |---| | 10 '-----' '----------' 14 **Power-loss resilience** - littlefs is designed to handle random power 15 failures. All file operations have strong copy-on-write guarantees and if 18 **Dynamic wear leveling** - littlefs is designed with flash in mind, and 22 **Bounded RAM/ROM** - littlefs is designed to work with a small amount of [all …]
|
D | Makefile | 12 DEP := $(SRC:.c=.d) 16 override CFLAGS += -O0 -g3 18 override CFLAGS += -Os 21 override CFLAGS += -m$(WORD) 24 override CFLAGS += -DLFS_YES_TRACE 26 override CFLAGS += -I. 27 override CFLAGS += -std=c99 -Wall -pedantic 28 override CFLAGS += -Wextra -Wshadow -Wjump-misses-init -Wundef 29 # Remove missing-field-initializers because of GCC bug 30 override CFLAGS += -Wno-missing-field-initializers [all …]
|
D | SPEC.md | 10 | | | .---._____ 11 .-----. | | 12 --|o |---| littlefs | 13 --| |---| | 14 '-----' '----------' 20 - littlefs is a block-based filesystem. The disk is divided into an array of 23 - Block pointers are stored in 32 bits, with the special value `0xffffffff` 26 - In addition to the logical block size (which usually matches the erase 31 - By default, all values in littlefs are stored in little-endian byte order. 49 The high-level layout of a metadata block is fairly simple: [all …]
|
/littlefs-2.7.6/bd/ |
D | lfs_filebd.c | 5 * SPDX-License-Identifier: BSD-3-Clause 21 (void*)cfg, cfg->context, in lfs_filebd_createcfg() 22 (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, in lfs_filebd_createcfg() 23 (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, in lfs_filebd_createcfg() 24 cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, in lfs_filebd_createcfg() 25 path, (void*)bdcfg, bdcfg->erase_value); in lfs_filebd_createcfg() 26 lfs_filebd_t *bd = cfg->context; in lfs_filebd_createcfg() 27 bd->cfg = bdcfg; in lfs_filebd_createcfg() 30 bd->fd = open(path, O_RDWR | O_CREAT, 0666); in lfs_filebd_createcfg() 31 if (bd->fd < 0) { in lfs_filebd_createcfg() [all …]
|
D | lfs_testbd.c | 6 * SPDX-License-Identifier: BSD-3-Clause 23 (void*)cfg, cfg->context, in lfs_testbd_createcfg() 24 (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, in lfs_testbd_createcfg() 25 (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, in lfs_testbd_createcfg() 26 cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, in lfs_testbd_createcfg() 27 path, (void*)bdcfg, bdcfg->erase_value, bdcfg->erase_cycles, in lfs_testbd_createcfg() 28 bdcfg->badblock_behavior, bdcfg->power_cycles, in lfs_testbd_createcfg() 29 bdcfg->buffer, bdcfg->wear_buffer); in lfs_testbd_createcfg() 30 lfs_testbd_t *bd = cfg->context; in lfs_testbd_createcfg() 31 bd->cfg = bdcfg; in lfs_testbd_createcfg() [all …]
|
D | lfs_rambd.c | 5 * SPDX-License-Identifier: BSD-3-Clause 16 (void*)cfg, cfg->context, in lfs_rambd_createcfg() 17 (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, in lfs_rambd_createcfg() 18 (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, in lfs_rambd_createcfg() 19 cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, in lfs_rambd_createcfg() 20 (void*)bdcfg, bdcfg->erase_value, bdcfg->buffer); in lfs_rambd_createcfg() 21 lfs_rambd_t *bd = cfg->context; in lfs_rambd_createcfg() 22 bd->cfg = bdcfg; in lfs_rambd_createcfg() 25 if (bd->cfg->buffer) { in lfs_rambd_createcfg() 26 bd->buffer = bd->cfg->buffer; in lfs_rambd_createcfg() [all …]
|
/littlefs-2.7.6/tests/ |
D | test_relocations.toml | 12 while (LFS_BLOCK_COUNT - lfs_fs_size(&lfs) > 16) { 39 if (j == ITERATIONS-1) { 78 while (LFS_BLOCK_COUNT - lfs_fs_size(&lfs) > 16) { 150 # TODO fix this case, caused by non-DAG trees 169 for (int d = 0; d < DEPTH; d++) { 170 sprintf(&full_path[2*d], "/%c", alpha[rand() % FILES]); 177 for (int d = 0; d < DEPTH; d++) { 179 path[2*d+2] = '\0'; 184 for (int d = 0; d < DEPTH; d++) { 186 path[2*d+2] = '\0'; [all …]
|
D | test_orphans.toml | 14 // to the linked-list entry, which should orphan the orphan. Note this 23 int off = LFS_BLOCK_SIZE-1; 25 off -= 1; 27 memset(&bbuffer[off-3], LFS_BLOCK_SIZE, 3); 61 # TODO fix this case, caused by non-DAG trees 80 for (int d = 0; d < DEPTH; d++) { 81 sprintf(&full_path[2*d], "/%c", alpha[rand() % FILES]); 88 for (int d = 0; d < DEPTH; d++) { 90 path[2*d+2] = '\0'; 95 for (int d = 0; d < DEPTH; d++) { [all …]
|
D | test_exhaustion.toml | 24 sprintf(path, "roadrunner/test%d", i); 53 sprintf(path, "roadrunner/test%d", i); 77 sprintf(path, "roadrunner/test%d", i); 82 LFS_WARN("completed %d cycles", cycle); 106 sprintf(path, "test%d", i); 135 sprintf(path, "test%d", i); 159 sprintf(path, "test%d", i); 164 LFS_WARN("completed %d cycles", cycle); 167 # These are a sort of high-level litmus test for wear-leveling. One definition 168 # of wear-leveling is that increasing a block device's space translates directly [all …]
|
D | test_dirs.toml | 24 sprintf(path, "dir%03d", i); 38 sprintf(path, "dir%03d", i); 55 sprintf(path, "removeme%03d", i); 69 sprintf(path, "removeme%03d", i); 80 sprintf(path, "removeme%03d", i); 105 sprintf(path, "test%03d", i); 119 sprintf(path, "test%03d", i); 132 sprintf(oldpath, "test%03d", i); 133 sprintf(newpath, "tedd%03d", i); 147 sprintf(path, "tedd%03d", i); [all …]
|
D | test_move.toml | 8 lfs_mkdir(&lfs, "d") => 0; 54 lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; 82 lfs_mkdir(&lfs, "d") => 0; 102 int off = LFS_BLOCK_SIZE-1; 104 off -= 1; 106 memset(&bbuffer[off-3], LFS_BLOCK_SIZE, 3); 145 lfs_file_open(&lfs, &file, "d/hello", LFS_O_RDONLY) => LFS_ERR_NOENT; 158 lfs_mkdir(&lfs, "d") => 0; 178 int off = LFS_BLOCK_SIZE-1; 180 off -= 1; [all …]
|
D | test_files.toml | 34 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i); 49 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE-i); 73 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i); 88 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i); 103 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i); 118 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i); 130 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i); 155 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i); 170 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE1-i); 185 lfs_size_t chunk = lfs_min(CHUNKSIZE, SIZE2-i); [all …]
|
D | test_truncate.toml | 103 size = lfs_min(lfs.cfg->cache_size, sizeof(buffer)/2); 120 lfs_size_t trunc = size - qsize; 135 trunc -= qsize; 141 lfs_file_read(&lfs, &file, rb, size) => trunc - qsize; 142 memcmp(rb, wb + qsize, trunc - qsize) => 0; 298 // mid-file shrinking truncate 303 // mid-file expanding truncate 319 sprintf(path, "hairyhead%d", i); 346 sprintf(path, "hairyhead%d", i); 373 sprintf(path, "hairyhead%d", i);
|
D | test_alloc.toml | 3 if = 'LFS_BLOCK_CYCLES == -1' 7 define.SIZE = '(((LFS_BLOCK_SIZE-8)*(LFS_BLOCK_COUNT-6)) / FILES)' 50 define.SIZE = '(((LFS_BLOCK_SIZE-8)*(LFS_BLOCK_COUNT-6)) / FILES)' 89 define.SIZE = '(((LFS_BLOCK_SIZE-8)*(LFS_BLOCK_COUNT-6)) / FILES)' 144 define.SIZE = '(((LFS_BLOCK_SIZE-8)*(LFS_BLOCK_COUNT-6)) / FILES)' 230 define.SIZE = '(((LFS_BLOCK_SIZE-8)*(LFS_BLOCK_COUNT-4)) / 3)' 348 filesize -= 3*LFS_BLOCK_SIZE; 425 sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); 446 sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); 458 sprintf(path, "dirwithanexhaustivelylongnameforpadding%d", i); [all …]
|
/littlefs-2.7.6/scripts/ |
D | test.py | 27 ./scripts/explode_asserts.py $$< -o $$@ 31 -include tests/*.d 35 $(CC) $(CFLAGS) $^ $(LFLAGS) -o $@ 50 'LFS_BLOCK_CYCLES': -1, 125 return '%s#%d#%d (%s)' % ( 130 return '%s#%d#%d' % ( 133 return '%s#%d' % ( 152 f.write('void test_case%d(%s) {' % (self.caseno, ','.join( 159 f.write(4*' '+'// test case %d\n' % self.caseno) 160 f.write(4*' '+'#line %d "%s"\n' % (self.code_lineno, self.suite.path)) [all …]
|
D | readtree.py | 21 for m in it.chain((m for d in dirs for m in d), mdirs): 35 blocks[id(data[-1])] = block 107 print("%-47s%s" % ("littlefs v%s.%s" % version, 116 print(" orphans >=%d" % max(tag.size, 1)) 118 print(" move dir {%#x, %#x} id %d" % ( 127 print("mdir {%#x, %#x} rev %d (was %d)%s%s" % ( 130 ' -> {%#x, %#x}' % struct.unpack('<II', mdir.tail.data) 144 ' ' if j == len(dir)-1 else 145 'v' if k == len(lines)-1 else 177 parser.add_argument('-l', '--log', action='store_true', [all …]
|
D | prefix.py | 24 name, count3 = re.subn('\\B-D'+from_prefix.upper(), 25 '-D'+to_prefix.upper(), name) 34 'git', 'ls-tree', '-r', '--name-only', 'HEAD']).split() 55 print '%s: %d replacements' % ( 56 '%s -> %s' % (oldname, newname) if namecount else oldname,
|
D | readmdir.py | 123 mask = 0x7ff & ~((1 << prefix)-1) 128 type, prefix//4, self.type & ((1 << prefix)-1)) 141 return 'Tag(%r, %d, %d)' % (self.typerepr(), self.id, self.size) 182 while len(block) - off >= 4: 240 return not ((other.rev - self.rev) & 0x80000000) 258 tag.id <= gtag.id - gdiff): 259 if tag.is_('create') and tag.id == gtag.id - gdiff: 266 (int(gmask) & int(gtag.chid(gtag.id - gdiff)))): 276 f.write("%-8s %-8s %-13s %4s %4s" % ( 283 f.write("%08x: %08x %-13s %4s %4s" % ( [all …]
|
D | explode_asserts.py | 17 printf("%s:%d:assert: assert failed with ", file, line); 188 'op': ['strcmp', 'memcmp', '->'], 355 outf.write("#line %d \"%s\"\n" % (1, args.input)) 377 parser.add_argument('-o', '--output', required=True, 379 parser.add_argument('-p', '--pattern', action='append', 381 parser.add_argument('--maxwidth', default=MAXWIDTH, type=int,
|