lib/littlefs: Update LittleFS to v2.10.2.
Going above the root directory (/../foo) now gives an error. This is an intentional change made by LittleFS. It required a update of the testsuite and is a (minor) compatibility break. Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
This commit is contained in:
committed by
Damien George
parent
80d03b7780
commit
9287a1e6ea
File diff suppressed because it is too large
Load Diff
@@ -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 0x0002000a
|
||||||
#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,16 +52,15 @@ 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
|
||||||
|
|
||||||
// Maximum size of custom attributes in bytes, may be redefined, but there is
|
// Maximum size of custom attributes in bytes, may be redefined, but there is
|
||||||
// no real benefit to using a smaller LFS2_ATTR_MAX. Limited to <= 1022.
|
// no real benefit to using a smaller LFS2_ATTR_MAX. Limited to <= 1022. Stored
|
||||||
|
// in superblock and must be respected by other littlefs drivers.
|
||||||
#ifndef LFS2_ATTR_MAX
|
#ifndef LFS2_ATTR_MAX
|
||||||
#define LFS2_ATTR_MAX 1022
|
#define LFS2_ATTR_MAX 1022
|
||||||
#endif
|
#endif
|
||||||
@@ -205,7 +204,8 @@ struct lfs2_config {
|
|||||||
// program sizes.
|
// program sizes.
|
||||||
lfs2_size_t block_size;
|
lfs2_size_t block_size;
|
||||||
|
|
||||||
// Number of erasable blocks on the device.
|
// Number of erasable blocks on the device. Defaults to block_count stored
|
||||||
|
// on disk when zero.
|
||||||
lfs2_size_t block_count;
|
lfs2_size_t block_count;
|
||||||
|
|
||||||
// Number of erase cycles before littlefs evicts metadata logs and moves
|
// Number of erase cycles before littlefs evicts metadata logs and moves
|
||||||
@@ -226,9 +226,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,25 +248,24 @@ 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
|
||||||
// larger names except the size of the info struct which is controlled by
|
// larger names except the size of the info struct which is controlled by
|
||||||
// the LFS2_NAME_MAX define. Defaults to LFS2_NAME_MAX when zero. Stored in
|
// the LFS2_NAME_MAX define. Defaults to LFS2_NAME_MAX or name_max stored on
|
||||||
// superblock and must be respected by other littlefs drivers.
|
// disk when zero.
|
||||||
lfs2_size_t name_max;
|
lfs2_size_t name_max;
|
||||||
|
|
||||||
// Optional upper limit on files in bytes. No downside for larger files
|
// Optional upper limit on files in bytes. No downside for larger files
|
||||||
// but must be <= LFS2_FILE_MAX. Defaults to LFS2_FILE_MAX when zero. Stored
|
// but must be <= LFS2_FILE_MAX. Defaults to LFS2_FILE_MAX or file_max stored
|
||||||
// in superblock and must be respected by other littlefs drivers.
|
// on disk when zero.
|
||||||
lfs2_size_t file_max;
|
lfs2_size_t file_max;
|
||||||
|
|
||||||
// Optional upper limit on custom attributes in bytes. No downside for
|
// Optional upper limit on custom attributes in bytes. No downside for
|
||||||
// larger attributes size but must be <= LFS2_ATTR_MAX. Defaults to
|
// larger attributes size but must be <= LFS2_ATTR_MAX. Defaults to
|
||||||
// LFS2_ATTR_MAX when zero.
|
// LFS2_ATTR_MAX or attr_max stored on disk when zero.
|
||||||
lfs2_size_t attr_max;
|
lfs2_size_t attr_max;
|
||||||
|
|
||||||
// Optional upper limit on total space given to metadata pairs in bytes. On
|
// Optional upper limit on total space given to metadata pairs in bytes. On
|
||||||
@@ -264,6 +274,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 +449,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 +732,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 +744,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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
#ifndef LFS2_UTIL_H
|
#ifndef LFS2_UTIL_H
|
||||||
#define LFS2_UTIL_H
|
#define LFS2_UTIL_H
|
||||||
|
|
||||||
|
#define LFS2_STRINGIZE(x) LFS2_STRINGIZE2(x)
|
||||||
|
#define LFS2_STRINGIZE2(x) #x
|
||||||
|
|
||||||
// Users can override lfs2_util.h with their own configuration by defining
|
// Users can override lfs2_util.h with their own configuration by defining
|
||||||
// LFS2_CONFIG as a header file to include (-DLFS2_CONFIG=lfs2_config.h).
|
// LFS2_CONFIG as a header file to include (-DLFS2_CONFIG=lfs2_config.h).
|
||||||
//
|
//
|
||||||
@@ -15,11 +18,26 @@
|
|||||||
// provided by the config file. To start, I would suggest copying lfs2_util.h
|
// provided by the config file. To start, I would suggest copying lfs2_util.h
|
||||||
// and modifying as needed.
|
// and modifying as needed.
|
||||||
#ifdef LFS2_CONFIG
|
#ifdef LFS2_CONFIG
|
||||||
#define LFS2_STRINGIZE(x) LFS2_STRINGIZE2(x)
|
|
||||||
#define LFS2_STRINGIZE2(x) #x
|
|
||||||
#include LFS2_STRINGIZE(LFS2_CONFIG)
|
#include LFS2_STRINGIZE(LFS2_CONFIG)
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
// Alternatively, users can provide a header file which defines
|
||||||
|
// macros and other things consumed by littlefs.
|
||||||
|
//
|
||||||
|
// For example, provide my_defines.h, which contains
|
||||||
|
// something like:
|
||||||
|
//
|
||||||
|
// #include <stddef.h>
|
||||||
|
// extern void *my_malloc(size_t sz);
|
||||||
|
// #define LFS2_MALLOC(sz) my_malloc(sz)
|
||||||
|
//
|
||||||
|
// And build littlefs with the header by defining LFS2_DEFINES.
|
||||||
|
// (-DLFS2_DEFINES=my_defines.h)
|
||||||
|
|
||||||
|
#ifdef LFS2_DEFINES
|
||||||
|
#include LFS2_STRINGIZE(LFS2_DEFINES)
|
||||||
|
#endif
|
||||||
|
|
||||||
// System includes
|
// System includes
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -212,12 +230,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 +255,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;
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ def test(bdev, vfs_class):
|
|||||||
print(fs.getcwd())
|
print(fs.getcwd())
|
||||||
fs.chdir("../testdir")
|
fs.chdir("../testdir")
|
||||||
print(fs.getcwd())
|
print(fs.getcwd())
|
||||||
fs.chdir("../..")
|
fs.chdir("..")
|
||||||
print(fs.getcwd())
|
print(fs.getcwd())
|
||||||
fs.chdir(".//testdir")
|
fs.chdir(".//testdir")
|
||||||
print(fs.getcwd())
|
print(fs.getcwd())
|
||||||
|
|||||||
Reference in New Issue
Block a user