Merge branch 'master' into test-revamp

This commit is contained in:
Christopher Haster
2020-03-31 18:24:54 -05:00
committed by GitHub
4 changed files with 44 additions and 22 deletions

View File

@@ -115,6 +115,9 @@ the filesystem until sync or close is called on the file.
## Other notes ## Other notes
Littlefs is written in C, and specifically should compile with any compiler
that conforms to the `C99` standard.
All littlefs calls have the potential to return a negative error code. The All littlefs calls have the potential to return a negative error code. The
errors can be either one of those found in the `enum lfs_error` in errors can be either one of those found in the `enum lfs_error` in
[lfs.h](lfs.h), or an error returned by the user's block device operations. [lfs.h](lfs.h), or an error returned by the user's block device operations.

10
SPEC.md
View File

@@ -289,7 +289,7 @@ Layout of the name tag:
``` ```
tag data tag data
[-- 32 --][--- variable length ---] [-- 32 --][--- variable length ---]
[1| 3| 8 | 10 | 10 ][--- (size) ---] [1| 3| 8 | 10 | 10 ][--- (size * 8) ---]
^ ^ ^ ^ ^- size ^- file name ^ ^ ^ ^ ^- size ^- file name
| | | '------ id | | | '------ id
| | '----------- file type | | '----------- file type
@@ -470,7 +470,7 @@ Layout of the inline-struct tag:
``` ```
tag data tag data
[-- 32 --][--- variable length ---] [-- 32 --][--- variable length ---]
[1|- 11 -| 10 | 10 ][--- (size) ---] [1|- 11 -| 10 | 10 ][--- (size * 8) ---]
^ ^ ^ ^- size ^- inline data ^ ^ ^ ^- size ^- inline data
| | '------ id | | '------ id
| '------------ type (0x201) | '------------ type (0x201)
@@ -556,7 +556,7 @@ Layout of the user-attr tag:
``` ```
tag data tag data
[-- 32 --][--- variable length ---] [-- 32 --][--- variable length ---]
[1| 3| 8 | 10 | 10 ][--- (size) ---] [1| 3| 8 | 10 | 10 ][--- (size * 8) ---]
^ ^ ^ ^ ^- size ^- attr data ^ ^ ^ ^ ^- size ^- attr data
| | | '------ id | | | '------ id
| | '----------- attr type | | '----------- attr type
@@ -764,9 +764,9 @@ Layout of the CRC tag:
``` ```
tag data tag data
[-- 32 --][-- 32 --|--- variable length ---] [-- 32 --][-- 32 --|--- variable length ---]
[1| 3| 8 | 10 | 10 ][-- 32 --|--- (size) ---] [1| 3| 8 | 10 | 10 ][-- 32 --|--- (size * 8 - 32) ---]
^ ^ ^ ^ ^ ^- crc ^- padding ^ ^ ^ ^ ^ ^- crc ^- padding
| | | | '- size (12) | | | | '- size
| | | '------ id (0x3ff) | | | '------ id (0x3ff)
| | '----------- valid state | | '----------- valid state
| '-------------- type1 (0x5) | '-------------- type1 (0x5)

15
lfs.c
View File

@@ -71,6 +71,21 @@ static int lfs_bd_read(lfs_t *lfs,
diff = lfs_min(diff, rcache->off-off); diff = lfs_min(diff, rcache->off-off);
} }
if (size >= hint && off % lfs->cfg->read_size == 0 &&
size >= lfs->cfg->read_size) {
// bypass cache?
diff = lfs_aligndown(diff, lfs->cfg->read_size);
int err = lfs->cfg->read(lfs->cfg, block, off, data, diff);
if (err) {
return err;
}
data += diff;
off += diff;
size -= diff;
continue;
}
// load to cache, first condition can no longer fail // load to cache, first condition can no longer fail
LFS_ASSERT(block < lfs->cfg->block_count); LFS_ASSERT(block < lfs->cfg->block_count);
rcache->block = block; rcache->block = block;

View File

@@ -50,31 +50,35 @@ extern "C"
// Logging functions // Logging functions
#ifdef LFS_YES_TRACE #ifdef LFS_YES_TRACE
#define LFS_TRACE(fmt, ...) \ #define LFS_TRACE_(fmt, ...) \
printf("%s:%d:trace: " fmt "\n", __FILE__, __LINE__, __VA_ARGS__) printf("%s:%d:trace: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
#define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "")
#else #else
#define LFS_TRACE(fmt, ...) #define LFS_TRACE(...)
#endif #endif
#ifndef LFS_NO_DEBUG #ifndef LFS_NO_DEBUG
#define LFS_DEBUG(fmt, ...) \ #define LFS_DEBUG_(fmt, ...) \
printf("%s:%d:debug: " fmt "\n", __FILE__, __LINE__, __VA_ARGS__) printf("%s:%d:debug: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
#define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "")
#else #else
#define LFS_DEBUG(fmt, ...) #define LFS_DEBUG(...)
#endif #endif
#ifndef LFS_NO_WARN #ifndef LFS_NO_WARN
#define LFS_WARN(fmt, ...) \ #define LFS_WARN_(fmt, ...) \
printf("%s:%d:warn: " fmt "\n", __FILE__, __LINE__, __VA_ARGS__) printf("%s:%d:warn: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
#define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "")
#else #else
#define LFS_WARN(fmt, ...) #define LFS_WARN(...)
#endif #endif
#ifndef LFS_NO_ERROR #ifndef LFS_NO_ERROR
#define LFS_ERROR(fmt, ...) \ #define LFS_ERROR_(fmt, ...) \
printf("%s:%d:error: " fmt "\n", __FILE__, __LINE__, __VA_ARGS__) printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__)
#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "")
#else #else
#define LFS_ERROR(fmt, ...) #define LFS_ERROR(...)
#endif #endif
// Runtime assertions // Runtime assertions
@@ -107,7 +111,7 @@ static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) {
return lfs_aligndown(a + alignment-1, alignment); return lfs_aligndown(a + alignment-1, alignment);
} }
// Find the next smallest power of 2 less than or equal to a // Find the smallest power of 2 greater than or equal to a
static inline uint32_t lfs_npw2(uint32_t a) { static inline uint32_t lfs_npw2(uint32_t a) {
#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) #if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM))
return 32 - __builtin_clz(a-1); return 32 - __builtin_clz(a-1);