Generated v2 prefixes

This commit is contained in:
geky-bot
2024-01-23 18:48:17 +00:00
17 changed files with 455 additions and 250 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ defaults:
jobs: jobs:
post-release: post-release:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
# trigger post-release in dependency repo, this indirection allows the # trigger post-release in dependency repo, this indirection allows the
# dependency repo to be updated often without affecting this repo. At # dependency repo to be updated often without affecting this repo. At
+1 -1
View File
@@ -11,7 +11,7 @@ defaults:
jobs: jobs:
release: release:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
# need to manually check for a couple things # need to manually check for a couple things
# - tests passed? # - tests passed?
+2 -2
View File
@@ -11,7 +11,7 @@ defaults:
jobs: jobs:
# forward custom statuses # forward custom statuses
status: status:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: dawidd6/action-download-artifact@v2 - uses: dawidd6/action-download-artifact@v2
continue-on-error: true continue-on-error: true
@@ -60,7 +60,7 @@ jobs:
# forward custom pr-comments # forward custom pr-comments
comment: comment:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
# only run on success (we don't want garbage comments!) # only run on success (we don't want garbage comments!)
if: ${{github.event.workflow_run.conclusion == 'success'}} if: ${{github.event.workflow_run.conclusion == 'success'}}
+12 -12
View File
@@ -14,7 +14,7 @@ env:
jobs: jobs:
# run tests # run tests
test: test:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -329,7 +329,7 @@ jobs:
# #
# this grows exponentially, so it doesn't turn out to be that many # this grows exponentially, so it doesn't turn out to be that many
test-pls: test-pls:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -359,7 +359,7 @@ jobs:
# run with LFS2_NO_INTRINSICS to make sure that works # run with LFS2_NO_INTRINSICS to make sure that works
test-no-intrinsics: test-no-intrinsics:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -376,7 +376,7 @@ jobs:
# run LFS2_MULTIVERSION tests # run LFS2_MULTIVERSION tests
test-multiversion: test-multiversion:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -393,7 +393,7 @@ jobs:
# run tests on the older version lfs22.0 # run tests on the older version lfs22.0
test-lfs22_0: test-lfs22_0:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -412,7 +412,7 @@ jobs:
# run under Valgrind to check for memory errors # run under Valgrind to check for memory errors
test-valgrind: test-valgrind:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -434,7 +434,7 @@ jobs:
# test that compilation is warning free under clang # test that compilation is warning free under clang
# run with Clang, mostly to check for Clang-specific warnings # run with Clang, mostly to check for Clang-specific warnings
test-clang: test-clang:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -457,7 +457,7 @@ jobs:
# #
# note there's no real benefit to running these on multiple archs # note there's no real benefit to running these on multiple archs
bench: bench:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: install - name: install
@@ -533,7 +533,7 @@ jobs:
# run compatibility tests using the current master as the previous version # run compatibility tests using the current master as the previous version
test-compat: test-compat:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
if: ${{github.event_name == 'pull_request'}} if: ${{github.event_name == 'pull_request'}}
@@ -569,7 +569,7 @@ jobs:
# self-host with littlefs-fuse for a fuzz-like test # self-host with littlefs-fuse for a fuzz-like test
fuse: fuse:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
if: ${{!endsWith(github.ref, '-prefix')}} if: ${{!endsWith(github.ref, '-prefix')}}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -619,7 +619,7 @@ jobs:
# test migration using littlefs-fuse # test migration using littlefs-fuse
migrate: migrate:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
if: ${{!endsWith(github.ref, '-prefix')}} if: ${{!endsWith(github.ref, '-prefix')}}
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -691,7 +691,7 @@ jobs:
# status related tasks that run after tests # status related tasks that run after tests
status: status:
runs-on: ubuntu-22.04 runs-on: ubuntu-latest
needs: [test, bench] needs: [test, bench]
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
+3 -3
View File
@@ -451,7 +451,7 @@ int lfs2_emubd_sync(const struct lfs2_config *cfg) {
/// Additional extended API for driving test features /// /// Additional extended API for driving test features ///
static int lfs2_emubd_rawcrc(const struct lfs2_config *cfg, static int lfs2_emubd_crc_(const struct lfs2_config *cfg,
lfs2_block_t block, uint32_t *crc) { lfs2_block_t block, uint32_t *crc) {
lfs2_emubd_t *bd = cfg->context; lfs2_emubd_t *bd = cfg->context;
@@ -480,7 +480,7 @@ int lfs2_emubd_crc(const struct lfs2_config *cfg,
lfs2_block_t block, uint32_t *crc) { lfs2_block_t block, uint32_t *crc) {
LFS2_EMUBD_TRACE("lfs2_emubd_crc(%p, %"PRIu32", %p)", LFS2_EMUBD_TRACE("lfs2_emubd_crc(%p, %"PRIu32", %p)",
(void*)cfg, block, crc); (void*)cfg, block, crc);
int err = lfs2_emubd_rawcrc(cfg, block, crc); int err = lfs2_emubd_crc_(cfg, block, crc);
LFS2_EMUBD_TRACE("lfs2_emubd_crc -> %d", err); LFS2_EMUBD_TRACE("lfs2_emubd_crc -> %d", err);
return err; return err;
} }
@@ -491,7 +491,7 @@ int lfs2_emubd_bdcrc(const struct lfs2_config *cfg, uint32_t *crc) {
uint32_t crc_ = 0xffffffff; uint32_t crc_ = 0xffffffff;
for (lfs2_block_t i = 0; i < cfg->block_count; i++) { for (lfs2_block_t i = 0; i < cfg->block_count; i++) {
uint32_t i_crc; uint32_t i_crc;
int err = lfs2_emubd_rawcrc(cfg, i, &i_crc); int err = lfs2_emubd_crc_(cfg, i, &i_crc);
if (err) { if (err) {
LFS2_EMUBD_TRACE("lfs2_emubd_bdcrc -> %d", err); LFS2_EMUBD_TRACE("lfs2_emubd_bdcrc -> %d", err);
return err; return err;
+295 -183
View File
File diff suppressed because it is too large Load Diff
+51 -27
View File
@@ -21,7 +21,7 @@ extern "C"
// Software library version // Software library version
// Major (top-nibble), incremented on backwards incompatible changes // Major (top-nibble), incremented on backwards incompatible changes
// Minor (bottom-nibble), incremented on feature additions // Minor (bottom-nibble), incremented on feature additions
#define LFS2_VERSION 0x00020008 #define LFS2_VERSION 0x00020009
#define LFS2_VERSION_MAJOR (0xffff & (LFS2_VERSION >> 16)) #define LFS2_VERSION_MAJOR (0xffff & (LFS2_VERSION >> 16))
#define LFS2_VERSION_MINOR (0xffff & (LFS2_VERSION >> 0)) #define LFS2_VERSION_MINOR (0xffff & (LFS2_VERSION >> 0))
@@ -52,10 +52,8 @@ typedef uint32_t lfs2_block_t;
#endif #endif
// Maximum size of a file in bytes, may be redefined to limit to support other // Maximum size of a file in bytes, may be redefined to limit to support other
// drivers. Limited on disk to <= 4294967296. However, above 2147483647 the // drivers. Limited on disk to <= 2147483647. Stored in superblock and must be
// functions lfs2_file_seek, lfs2_file_size, and lfs2_file_tell will return // respected by other littlefs drivers.
// incorrect values due to using signed integers. Stored in superblock and
// must be respected by other littlefs drivers.
#ifndef LFS2_FILE_MAX #ifndef LFS2_FILE_MAX
#define LFS2_FILE_MAX 2147483647 #define LFS2_FILE_MAX 2147483647
#endif #endif
@@ -226,9 +224,20 @@ struct lfs2_config {
// Size of the lookahead buffer in bytes. A larger lookahead buffer // Size of the lookahead buffer in bytes. A larger lookahead buffer
// increases the number of blocks found during an allocation pass. The // increases the number of blocks found during an allocation pass. The
// lookahead buffer is stored as a compact bitmap, so each byte of RAM // lookahead buffer is stored as a compact bitmap, so each byte of RAM
// can track 8 blocks. Must be a multiple of 8. // can track 8 blocks.
lfs2_size_t lookahead_size; lfs2_size_t lookahead_size;
// Threshold for metadata compaction during lfs2_fs_gc in bytes. Metadata
// pairs that exceed this threshold will be compacted during lfs2_fs_gc.
// Defaults to ~88% block_size when zero, though the default may change
// in the future.
//
// Note this only affects lfs2_fs_gc. Normal compactions still only occur
// when full.
//
// Set to -1 to disable metadata compaction during lfs2_fs_gc.
lfs2_size_t compact_thresh;
// Optional statically allocated read buffer. Must be cache_size. // Optional statically allocated read buffer. Must be cache_size.
// By default lfs2_malloc is used to allocate this buffer. // By default lfs2_malloc is used to allocate this buffer.
void *read_buffer; void *read_buffer;
@@ -237,9 +246,8 @@ struct lfs2_config {
// By default lfs2_malloc is used to allocate this buffer. // By default lfs2_malloc is used to allocate this buffer.
void *prog_buffer; void *prog_buffer;
// Optional statically allocated lookahead buffer. Must be lookahead_size // Optional statically allocated lookahead buffer. Must be lookahead_size.
// and aligned to a 32-bit boundary. By default lfs2_malloc is used to // By default lfs2_malloc is used to allocate this buffer.
// allocate this buffer.
void *lookahead_buffer; void *lookahead_buffer;
// Optional upper limit on length of file names in bytes. No downside for // Optional upper limit on length of file names in bytes. No downside for
@@ -264,6 +272,15 @@ struct lfs2_config {
// Defaults to block_size when zero. // Defaults to block_size when zero.
lfs2_size_t metadata_max; lfs2_size_t metadata_max;
// Optional upper limit on inlined files in bytes. Inlined files live in
// metadata and decrease storage requirements, but may be limited to
// improve metadata-related performance. Must be <= cache_size, <=
// attr_max, and <= block_size/8. Defaults to the largest possible
// inline_max when zero.
//
// Set to -1 to disable inlined files.
lfs2_size_t inline_max;
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
// On-disk version to use when writing in the form of 16-bit major version // On-disk version to use when writing in the form of 16-bit major version
// + 16-bit minor version. This limiting metadata to what is supported by // + 16-bit minor version. This limiting metadata to what is supported by
@@ -430,19 +447,20 @@ typedef struct lfs2 {
lfs2_gstate_t gdisk; lfs2_gstate_t gdisk;
lfs2_gstate_t gdelta; lfs2_gstate_t gdelta;
struct lfs2_free { struct lfs2_lookahead {
lfs2_block_t off; lfs2_block_t start;
lfs2_block_t size; lfs2_block_t size;
lfs2_block_t i; lfs2_block_t next;
lfs2_block_t ack; lfs2_block_t ckpoint;
uint32_t *buffer; uint8_t *buffer;
} free; } lookahead;
const struct lfs2_config *cfg; const struct lfs2_config *cfg;
lfs2_size_t block_count; lfs2_size_t block_count;
lfs2_size_t name_max; lfs2_size_t name_max;
lfs2_size_t file_max; lfs2_size_t file_max;
lfs2_size_t attr_max; lfs2_size_t attr_max;
lfs2_size_t inline_max;
#ifdef LFS2_MIGRATE #ifdef LFS2_MIGRATE
struct lfs21 *lfs21; struct lfs21 *lfs21;
@@ -712,18 +730,6 @@ lfs2_ssize_t lfs2_fs_size(lfs2_t *lfs2);
// Returns a negative error code on failure. // Returns a negative error code on failure.
int lfs2_fs_traverse(lfs2_t *lfs2, int (*cb)(void*, lfs2_block_t), void *data); int lfs2_fs_traverse(lfs2_t *lfs2, int (*cb)(void*, lfs2_block_t), void *data);
// Attempt to proactively find free blocks
//
// Calling this function is not required, but may allowing the offloading of
// the expensive block allocation scan to a less time-critical code path.
//
// Note: littlefs currently does not persist any found free blocks to disk.
// This may change in the future.
//
// Returns a negative error code on failure. Finding no free blocks is
// not an error.
int lfs2_fs_gc(lfs2_t *lfs2);
#ifndef LFS2_READONLY #ifndef LFS2_READONLY
// Attempt to make the filesystem consistent and ready for writing // Attempt to make the filesystem consistent and ready for writing
// //
@@ -736,6 +742,24 @@ int lfs2_fs_gc(lfs2_t *lfs2);
int lfs2_fs_mkconsistent(lfs2_t *lfs2); int lfs2_fs_mkconsistent(lfs2_t *lfs2);
#endif #endif
#ifndef LFS2_READONLY
// Attempt any janitorial work
//
// This currently:
// 1. Calls mkconsistent if not already consistent
// 2. Compacts metadata > compact_thresh
// 3. Populates the block allocator
//
// Though additional janitorial work may be added in the future.
//
// Calling this function is not required, but may allow the offloading of
// expensive janitorial work to a less time-critical code path.
//
// Returns a negative error code on failure. Accomplishing nothing is not
// an error.
int lfs2_fs_gc(lfs2_t *lfs2);
#endif
#ifndef LFS2_READONLY #ifndef LFS2_READONLY
// Grows the filesystem to a new size, updating the superblock with the new // Grows the filesystem to a new size, updating the superblock with the new
// block count. // block count.
+3
View File
@@ -11,6 +11,8 @@
#ifndef LFS2_CONFIG #ifndef LFS2_CONFIG
// If user provides their own CRC impl we don't need this
#ifndef LFS2_CRC
// Software CRC implementation with small lookup table // Software CRC implementation with small lookup table
uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size) { uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size) {
static const uint32_t rtable[16] = { static const uint32_t rtable[16] = {
@@ -29,6 +31,7 @@ uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size) {
return crc; return crc;
} }
#endif
#endif #endif
+15 -3
View File
@@ -212,12 +212,22 @@ static inline uint32_t lfs2_tobe32(uint32_t a) {
} }
// Calculate CRC-32 with polynomial = 0x04c11db7 // Calculate CRC-32 with polynomial = 0x04c11db7
#ifdef LFS2_CRC
uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size) {
return LFS2_CRC(crc, buffer, size)
}
#else
uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size); uint32_t lfs2_crc(uint32_t crc, const void *buffer, size_t size);
#endif
// Allocate memory, only used if buffers are not provided to littlefs // Allocate memory, only used if buffers are not provided to littlefs
// Note, memory must be 64-bit aligned //
// littlefs current has no alignment requirements, as it only allocates
// byte-level buffers.
static inline void *lfs2_malloc(size_t size) { static inline void *lfs2_malloc(size_t size) {
#ifndef LFS2_NO_MALLOC #if defined(LFS2_MALLOC)
return LFS2_MALLOC(size);
#elif !defined(LFS2_NO_MALLOC)
return malloc(size); return malloc(size);
#else #else
(void)size; (void)size;
@@ -227,7 +237,9 @@ static inline void *lfs2_malloc(size_t size) {
// Deallocate memory, only used if buffers are not provided to littlefs // Deallocate memory, only used if buffers are not provided to littlefs
static inline void lfs2_free(void *p) { static inline void lfs2_free(void *p) {
#ifndef LFS2_NO_MALLOC #if defined(LFS2_FREE)
LFS2_FREE(p);
#elif !defined(LFS2_NO_MALLOC)
free(p); free(p);
#else #else
(void)p; (void)p;
+2
View File
@@ -1321,6 +1321,8 @@ void perm_run(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
}; };
struct lfs2_emubd_config bdcfg = { struct lfs2_emubd_config bdcfg = {
+12 -6
View File
@@ -95,11 +95,13 @@ intmax_t bench_define(size_t define);
#define BLOCK_COUNT_i 5 #define BLOCK_COUNT_i 5
#define CACHE_SIZE_i 6 #define CACHE_SIZE_i 6
#define LOOKAHEAD_SIZE_i 7 #define LOOKAHEAD_SIZE_i 7
#define BLOCK_CYCLES_i 8 #define COMPACT_THRESH_i 8
#define ERASE_VALUE_i 9 #define INLINE_MAX_i 9
#define ERASE_CYCLES_i 10 #define BLOCK_CYCLES_i 10
#define BADBLOCK_BEHAVIOR_i 11 #define ERASE_VALUE_i 11
#define POWERLOSS_BEHAVIOR_i 12 #define ERASE_CYCLES_i 12
#define BADBLOCK_BEHAVIOR_i 13
#define POWERLOSS_BEHAVIOR_i 14
#define READ_SIZE bench_define(READ_SIZE_i) #define READ_SIZE bench_define(READ_SIZE_i)
#define PROG_SIZE bench_define(PROG_SIZE_i) #define PROG_SIZE bench_define(PROG_SIZE_i)
@@ -109,6 +111,8 @@ intmax_t bench_define(size_t define);
#define BLOCK_COUNT bench_define(BLOCK_COUNT_i) #define BLOCK_COUNT bench_define(BLOCK_COUNT_i)
#define CACHE_SIZE bench_define(CACHE_SIZE_i) #define CACHE_SIZE bench_define(CACHE_SIZE_i)
#define LOOKAHEAD_SIZE bench_define(LOOKAHEAD_SIZE_i) #define LOOKAHEAD_SIZE bench_define(LOOKAHEAD_SIZE_i)
#define COMPACT_THRESH bench_define(COMPACT_THRESH_i)
#define INLINE_MAX bench_define(INLINE_MAX_i)
#define BLOCK_CYCLES bench_define(BLOCK_CYCLES_i) #define BLOCK_CYCLES bench_define(BLOCK_CYCLES_i)
#define ERASE_VALUE bench_define(ERASE_VALUE_i) #define ERASE_VALUE bench_define(ERASE_VALUE_i)
#define ERASE_CYCLES bench_define(ERASE_CYCLES_i) #define ERASE_CYCLES bench_define(ERASE_CYCLES_i)
@@ -124,6 +128,8 @@ intmax_t bench_define(size_t define);
BENCH_DEF(BLOCK_COUNT, ERASE_COUNT/lfs2_max(BLOCK_SIZE/ERASE_SIZE,1))\ BENCH_DEF(BLOCK_COUNT, ERASE_COUNT/lfs2_max(BLOCK_SIZE/ERASE_SIZE,1))\
BENCH_DEF(CACHE_SIZE, lfs2_max(64,lfs2_max(READ_SIZE,PROG_SIZE))) \ BENCH_DEF(CACHE_SIZE, lfs2_max(64,lfs2_max(READ_SIZE,PROG_SIZE))) \
BENCH_DEF(LOOKAHEAD_SIZE, 16) \ BENCH_DEF(LOOKAHEAD_SIZE, 16) \
BENCH_DEF(COMPACT_THRESH, 0) \
BENCH_DEF(INLINE_MAX, 0) \
BENCH_DEF(BLOCK_CYCLES, -1) \ BENCH_DEF(BLOCK_CYCLES, -1) \
BENCH_DEF(ERASE_VALUE, 0xff) \ BENCH_DEF(ERASE_VALUE, 0xff) \
BENCH_DEF(ERASE_CYCLES, 0) \ BENCH_DEF(ERASE_CYCLES, 0) \
@@ -131,7 +137,7 @@ intmax_t bench_define(size_t define);
BENCH_DEF(POWERLOSS_BEHAVIOR, LFS2_EMUBD_POWERLOSS_NOOP) BENCH_DEF(POWERLOSS_BEHAVIOR, LFS2_EMUBD_POWERLOSS_NOOP)
#define BENCH_GEOMETRY_DEFINE_COUNT 4 #define BENCH_GEOMETRY_DEFINE_COUNT 4
#define BENCH_IMPLICIT_DEFINE_COUNT 13 #define BENCH_IMPLICIT_DEFINE_COUNT 15
#endif #endif
+10
View File
@@ -1346,6 +1346,8 @@ static void run_powerloss_none(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
.disk_version = DISK_VERSION, .disk_version = DISK_VERSION,
#endif #endif
@@ -1422,6 +1424,8 @@ static void run_powerloss_linear(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
.disk_version = DISK_VERSION, .disk_version = DISK_VERSION,
#endif #endif
@@ -1515,6 +1519,8 @@ static void run_powerloss_log(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
.disk_version = DISK_VERSION, .disk_version = DISK_VERSION,
#endif #endif
@@ -1606,6 +1612,8 @@ static void run_powerloss_cycles(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
.disk_version = DISK_VERSION, .disk_version = DISK_VERSION,
#endif #endif
@@ -1795,6 +1803,8 @@ static void run_powerloss_exhaustive(
.block_cycles = BLOCK_CYCLES, .block_cycles = BLOCK_CYCLES,
.cache_size = CACHE_SIZE, .cache_size = CACHE_SIZE,
.lookahead_size = LOOKAHEAD_SIZE, .lookahead_size = LOOKAHEAD_SIZE,
.compact_thresh = COMPACT_THRESH,
.inline_max = INLINE_MAX,
#ifdef LFS2_MULTIVERSION #ifdef LFS2_MULTIVERSION
.disk_version = DISK_VERSION, .disk_version = DISK_VERSION,
#endif #endif
+13 -7
View File
@@ -88,12 +88,14 @@ intmax_t test_define(size_t define);
#define BLOCK_COUNT_i 5 #define BLOCK_COUNT_i 5
#define CACHE_SIZE_i 6 #define CACHE_SIZE_i 6
#define LOOKAHEAD_SIZE_i 7 #define LOOKAHEAD_SIZE_i 7
#define BLOCK_CYCLES_i 8 #define COMPACT_THRESH_i 8
#define ERASE_VALUE_i 9 #define INLINE_MAX_i 9
#define ERASE_CYCLES_i 10 #define BLOCK_CYCLES_i 10
#define BADBLOCK_BEHAVIOR_i 11 #define ERASE_VALUE_i 11
#define POWERLOSS_BEHAVIOR_i 12 #define ERASE_CYCLES_i 12
#define DISK_VERSION_i 13 #define BADBLOCK_BEHAVIOR_i 13
#define POWERLOSS_BEHAVIOR_i 14
#define DISK_VERSION_i 15
#define READ_SIZE TEST_DEFINE(READ_SIZE_i) #define READ_SIZE TEST_DEFINE(READ_SIZE_i)
#define PROG_SIZE TEST_DEFINE(PROG_SIZE_i) #define PROG_SIZE TEST_DEFINE(PROG_SIZE_i)
@@ -103,6 +105,8 @@ intmax_t test_define(size_t define);
#define BLOCK_COUNT TEST_DEFINE(BLOCK_COUNT_i) #define BLOCK_COUNT TEST_DEFINE(BLOCK_COUNT_i)
#define CACHE_SIZE TEST_DEFINE(CACHE_SIZE_i) #define CACHE_SIZE TEST_DEFINE(CACHE_SIZE_i)
#define LOOKAHEAD_SIZE TEST_DEFINE(LOOKAHEAD_SIZE_i) #define LOOKAHEAD_SIZE TEST_DEFINE(LOOKAHEAD_SIZE_i)
#define COMPACT_THRESH TEST_DEFINE(COMPACT_THRESH_i)
#define INLINE_MAX TEST_DEFINE(INLINE_MAX_i)
#define BLOCK_CYCLES TEST_DEFINE(BLOCK_CYCLES_i) #define BLOCK_CYCLES TEST_DEFINE(BLOCK_CYCLES_i)
#define ERASE_VALUE TEST_DEFINE(ERASE_VALUE_i) #define ERASE_VALUE TEST_DEFINE(ERASE_VALUE_i)
#define ERASE_CYCLES TEST_DEFINE(ERASE_CYCLES_i) #define ERASE_CYCLES TEST_DEFINE(ERASE_CYCLES_i)
@@ -119,6 +123,8 @@ intmax_t test_define(size_t define);
TEST_DEF(BLOCK_COUNT, ERASE_COUNT/lfs2_max(BLOCK_SIZE/ERASE_SIZE,1)) \ TEST_DEF(BLOCK_COUNT, ERASE_COUNT/lfs2_max(BLOCK_SIZE/ERASE_SIZE,1)) \
TEST_DEF(CACHE_SIZE, lfs2_max(64,lfs2_max(READ_SIZE,PROG_SIZE))) \ TEST_DEF(CACHE_SIZE, lfs2_max(64,lfs2_max(READ_SIZE,PROG_SIZE))) \
TEST_DEF(LOOKAHEAD_SIZE, 16) \ TEST_DEF(LOOKAHEAD_SIZE, 16) \
TEST_DEF(COMPACT_THRESH, 0) \
TEST_DEF(INLINE_MAX, 0) \
TEST_DEF(BLOCK_CYCLES, -1) \ TEST_DEF(BLOCK_CYCLES, -1) \
TEST_DEF(ERASE_VALUE, 0xff) \ TEST_DEF(ERASE_VALUE, 0xff) \
TEST_DEF(ERASE_CYCLES, 0) \ TEST_DEF(ERASE_CYCLES, 0) \
@@ -127,7 +133,7 @@ intmax_t test_define(size_t define);
TEST_DEF(DISK_VERSION, 0) TEST_DEF(DISK_VERSION, 0)
#define TEST_GEOMETRY_DEFINE_COUNT 4 #define TEST_GEOMETRY_DEFINE_COUNT 4
#define TEST_IMPLICIT_DEFINE_COUNT 14 #define TEST_IMPLICIT_DEFINE_COUNT 16
#endif #endif
+2
View File
@@ -7,6 +7,7 @@ if = 'BLOCK_CYCLES == -1'
defines.FILES = 3 defines.FILES = 3
defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)'
defines.GC = [false, true] defines.GC = [false, true]
defines.COMPACT_THRESH = ['-1', '0', 'BLOCK_SIZE/2']
code = ''' code = '''
const char *names[] = {"bacon", "eggs", "pancakes"}; const char *names[] = {"bacon", "eggs", "pancakes"};
lfs2_file_t files[FILES]; lfs2_file_t files[FILES];
@@ -60,6 +61,7 @@ code = '''
defines.FILES = 3 defines.FILES = 3
defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)' defines.SIZE = '(((BLOCK_SIZE-8)*(BLOCK_COUNT-6)) / FILES)'
defines.GC = [false, true] defines.GC = [false, true]
defines.COMPACT_THRESH = ['-1', '0', 'BLOCK_SIZE/2']
code = ''' code = '''
const char *names[] = {"bacon", "eggs", "pancakes"}; const char *names[] = {"bacon", "eggs", "pancakes"};
+13
View File
@@ -747,6 +747,11 @@ code = '''
lfs2_file_open(&lfs2, &file, "potato", lfs2_file_open(&lfs2, &file, "potato",
LFS2_O_WRONLY | LFS2_O_CREAT) => LFS2_ERR_ISDIR; LFS2_O_WRONLY | LFS2_O_CREAT) => LFS2_ERR_ISDIR;
lfs2_file_open(&lfs2, &file, "tacoto", LFS2_O_WRONLY | LFS2_O_CREAT) => 0;
lfs2_file_close(&lfs2, &file) => 0;
lfs2_rename(&lfs2, "tacoto", "potato") => LFS2_ERR_ISDIR;
lfs2_rename(&lfs2, "potato", "tacoto") => LFS2_ERR_NOTDIR;
lfs2_mkdir(&lfs2, "/") => LFS2_ERR_EXIST; lfs2_mkdir(&lfs2, "/") => LFS2_ERR_EXIST;
lfs2_file_open(&lfs2, &file, "/", lfs2_file_open(&lfs2, &file, "/",
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => LFS2_ERR_EXIST; LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => LFS2_ERR_EXIST;
@@ -770,6 +775,10 @@ code = '''
lfs2_dir_read(&lfs2, &dir, &info) => 1; lfs2_dir_read(&lfs2, &dir, &info) => 1;
assert(info.type == LFS2_TYPE_DIR); assert(info.type == LFS2_TYPE_DIR);
assert(strcmp(info.name, "potato") == 0); assert(strcmp(info.name, "potato") == 0);
lfs2_dir_read(&lfs2, &dir, &info) => 1;
assert(info.type == LFS2_TYPE_REG);
assert(strcmp(info.name, "tacoto") == 0);
assert(info.size == 0);
lfs2_dir_read(&lfs2, &dir, &info) => 0; lfs2_dir_read(&lfs2, &dir, &info) => 0;
lfs2_dir_close(&lfs2, &dir) => 0; lfs2_dir_close(&lfs2, &dir) => 0;
@@ -790,6 +799,10 @@ code = '''
lfs2_dir_read(&lfs2, &dir, &info) => 1; lfs2_dir_read(&lfs2, &dir, &info) => 1;
assert(info.type == LFS2_TYPE_DIR); assert(info.type == LFS2_TYPE_DIR);
assert(strcmp(info.name, "potato") == 0); assert(strcmp(info.name, "potato") == 0);
lfs2_dir_read(&lfs2, &dir, &info) => 1;
assert(info.type == LFS2_TYPE_REG);
assert(strcmp(info.name, "tacoto") == 0);
assert(info.size == 0);
lfs2_dir_read(&lfs2, &dir, &info) => 0; lfs2_dir_read(&lfs2, &dir, &info) => 0;
lfs2_dir_close(&lfs2, &dir) => 0; lfs2_dir_close(&lfs2, &dir) => 0;
lfs2_unmount(&lfs2) => 0; lfs2_unmount(&lfs2) => 0;
+18 -3
View File
@@ -1,5 +1,6 @@
[cases.test_files_simple] [cases.test_files_simple]
defines.INLINE_MAX = [0, -1, 8]
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
lfs2_format(&lfs2, cfg) => 0; lfs2_format(&lfs2, cfg) => 0;
@@ -25,6 +26,7 @@ code = '''
[cases.test_files_large] [cases.test_files_large]
defines.SIZE = [32, 8192, 262144, 0, 7, 8193] defines.SIZE = [32, 8192, 262144, 0, 7, 8193]
defines.CHUNKSIZE = [31, 16, 33, 1, 1023] defines.CHUNKSIZE = [31, 16, 33, 1, 1023]
defines.INLINE_MAX = [0, -1, 8]
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
lfs2_format(&lfs2, cfg) => 0; lfs2_format(&lfs2, cfg) => 0;
@@ -67,6 +69,7 @@ code = '''
defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
defines.CHUNKSIZE = [31, 16, 1] defines.CHUNKSIZE = [31, 16, 1]
defines.INLINE_MAX = [0, -1, 8]
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
lfs2_format(&lfs2, cfg) => 0; lfs2_format(&lfs2, cfg) => 0;
@@ -152,6 +155,7 @@ code = '''
defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
defines.CHUNKSIZE = [31, 16, 1] defines.CHUNKSIZE = [31, 16, 1]
defines.INLINE_MAX = [0, -1, 8]
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
lfs2_format(&lfs2, cfg) => 0; lfs2_format(&lfs2, cfg) => 0;
@@ -232,6 +236,7 @@ code = '''
defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE1 = [32, 8192, 131072, 0, 7, 8193]
defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193] defines.SIZE2 = [32, 8192, 131072, 0, 7, 8193]
defines.CHUNKSIZE = [31, 16, 1] defines.CHUNKSIZE = [31, 16, 1]
defines.INLINE_MAX = [0, -1, 8]
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
lfs2_format(&lfs2, cfg) => 0; lfs2_format(&lfs2, cfg) => 0;
@@ -303,6 +308,7 @@ code = '''
[cases.test_files_reentrant_write] [cases.test_files_reentrant_write]
defines.SIZE = [32, 0, 7, 2049] defines.SIZE = [32, 0, 7, 2049]
defines.CHUNKSIZE = [31, 16, 65] defines.CHUNKSIZE = [31, 16, 65]
defines.INLINE_MAX = [0, -1, 8]
reentrant = true reentrant = true
code = ''' code = '''
lfs2_t lfs2; lfs2_t lfs2;
@@ -354,11 +360,20 @@ code = '''
[cases.test_files_reentrant_write_sync] [cases.test_files_reentrant_write_sync]
defines = [ defines = [
# append (O(n)) # append (O(n))
{MODE='LFS2_O_APPEND', SIZE=[32, 0, 7, 2049], CHUNKSIZE=[31, 16, 65]}, {MODE='LFS2_O_APPEND',
SIZE=[32, 0, 7, 2049],
CHUNKSIZE=[31, 16, 65],
INLINE_MAX=[0, -1, 8]},
# truncate (O(n^2)) # truncate (O(n^2))
{MODE='LFS2_O_TRUNC', SIZE=[32, 0, 7, 200], CHUNKSIZE=[31, 16, 65]}, {MODE='LFS2_O_TRUNC',
SIZE=[32, 0, 7, 200],
CHUNKSIZE=[31, 16, 65],
INLINE_MAX=[0, -1, 8]},
# rewrite (O(n^2)) # rewrite (O(n^2))
{MODE=0, SIZE=[32, 0, 7, 200], CHUNKSIZE=[31, 16, 65]}, {MODE=0,
SIZE=[32, 0, 7, 200],
CHUNKSIZE=[31, 16, 65],
INLINE_MAX=[0, -1, 8]},
] ]
reentrant = true reentrant = true
code = ''' code = '''
+2 -2
View File
@@ -98,7 +98,7 @@ code = '''
lfs2_mount(&lfs2, cfg) => 0; lfs2_mount(&lfs2, cfg) => 0;
// create an orphan // create an orphan
lfs2_mdir_t orphan; lfs2_mdir_t orphan;
lfs2_alloc_ack(&lfs2); lfs2_alloc_ckpoint(&lfs2);
lfs2_dir_alloc(&lfs2, &orphan) => 0; lfs2_dir_alloc(&lfs2, &orphan) => 0;
lfs2_dir_commit(&lfs2, &orphan, NULL, 0) => 0; lfs2_dir_commit(&lfs2, &orphan, NULL, 0) => 0;
@@ -170,7 +170,7 @@ code = '''
lfs2_mount(&lfs2, cfg) => 0; lfs2_mount(&lfs2, cfg) => 0;
// create an orphan // create an orphan
lfs2_mdir_t orphan; lfs2_mdir_t orphan;
lfs2_alloc_ack(&lfs2); lfs2_alloc_ckpoint(&lfs2);
lfs2_dir_alloc(&lfs2, &orphan) => 0; lfs2_dir_alloc(&lfs2, &orphan) => 0;
lfs2_dir_commit(&lfs2, &orphan, NULL, 0) => 0; lfs2_dir_commit(&lfs2, &orphan, NULL, 0) => 0;