mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 16:14:13 +01:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef77195a64 | ||
|
|
12e464e9c3 | ||
|
|
9899c7fe48 | ||
|
|
bc7bed740b | ||
|
|
cf9afdddff | ||
|
|
2533a0f6d6 | ||
|
|
2a7f0ed11b | ||
|
|
f35fb8c148 | ||
|
|
0a1f706ca2 | ||
|
|
fdd239fe21 |
@@ -136,6 +136,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
- STAGE=test
|
- STAGE=test
|
||||||
- NAME=littlefs-migration
|
- NAME=littlefs-migration
|
||||||
|
if: branch !~ -prefix$
|
||||||
install:
|
install:
|
||||||
- sudo apt-get install libfuse-dev
|
- sudo apt-get install libfuse-dev
|
||||||
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha v2
|
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha v2
|
||||||
|
|||||||
33
lfs.c
33
lfs.c
@@ -80,28 +80,16 @@ 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;
|
||||||
rcache->off = lfs_aligndown(off, lfs->cfg->read_size);
|
rcache->off = lfs_aligndown(off, lfs->cfg->read_size);
|
||||||
rcache->size = lfs_min(lfs_alignup(off+hint, lfs->cfg->read_size),
|
rcache->size = lfs_min(
|
||||||
lfs_min(lfs->cfg->block_size - rcache->off,
|
lfs_min(
|
||||||
lfs->cfg->cache_size));
|
lfs_alignup(off+hint, lfs->cfg->read_size),
|
||||||
|
lfs->cfg->block_size)
|
||||||
|
- rcache->off,
|
||||||
|
lfs->cfg->cache_size);
|
||||||
int err = lfs->cfg->read(lfs->cfg, rcache->block,
|
int err = lfs->cfg->read(lfs->cfg, rcache->block,
|
||||||
rcache->off, rcache->buffer, rcache->size);
|
rcache->off, rcache->buffer, rcache->size);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -2749,7 +2737,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
|
|||||||
|
|
||||||
if ((file->flags & LFS_F_INLINE) &&
|
if ((file->flags & LFS_F_INLINE) &&
|
||||||
lfs_max(file->pos+nsize, file->ctz.size) >
|
lfs_max(file->pos+nsize, file->ctz.size) >
|
||||||
lfs_min(LFS_ATTR_MAX, lfs_min(
|
lfs_min(0x3fe, lfs_min(
|
||||||
lfs->cfg->cache_size, lfs->cfg->block_size/8))) {
|
lfs->cfg->cache_size, lfs->cfg->block_size/8))) {
|
||||||
// inline file doesn't fit anymore
|
// inline file doesn't fit anymore
|
||||||
file->off = file->pos;
|
file->off = file->pos;
|
||||||
@@ -2879,13 +2867,14 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) {
|
|||||||
// lookup new head in ctz skip list
|
// lookup new head in ctz skip list
|
||||||
err = lfs_ctz_find(lfs, NULL, &file->cache,
|
err = lfs_ctz_find(lfs, NULL, &file->cache,
|
||||||
file->ctz.head, file->ctz.size,
|
file->ctz.head, file->ctz.size,
|
||||||
size, &file->ctz.head, &(lfs_off_t){0});
|
size, &file->block, &file->off);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file->ctz.head = file->block;
|
||||||
file->ctz.size = size;
|
file->ctz.size = size;
|
||||||
file->flags |= LFS_F_DIRTY;
|
file->flags |= LFS_F_DIRTY | LFS_F_READING;
|
||||||
} else if (size > oldsize) {
|
} else if (size > oldsize) {
|
||||||
lfs_off_t pos = file->pos;
|
lfs_off_t pos = file->pos;
|
||||||
|
|
||||||
@@ -3915,7 +3904,7 @@ typedef struct lfs1_superblock {
|
|||||||
|
|
||||||
|
|
||||||
/// Low-level wrappers v1->v2 ///
|
/// Low-level wrappers v1->v2 ///
|
||||||
void lfs1_crc(uint32_t *crc, const void *buffer, size_t size) {
|
static void lfs1_crc(uint32_t *crc, const void *buffer, size_t size) {
|
||||||
*crc = lfs_crc(*crc, buffer, size);
|
*crc = lfs_crc(*crc, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
24
lfs_util.h
24
lfs_util.h
@@ -143,14 +143,14 @@ static inline int lfs_scmp(uint32_t a, uint32_t b) {
|
|||||||
// Convert between 32-bit little-endian and native order
|
// Convert between 32-bit little-endian and native order
|
||||||
static inline uint32_t lfs_fromle32(uint32_t a) {
|
static inline uint32_t lfs_fromle32(uint32_t a) {
|
||||||
#if !defined(LFS_NO_INTRINSICS) && ( \
|
#if !defined(LFS_NO_INTRINSICS) && ( \
|
||||||
(defined( BYTE_ORDER ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \
|
(defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \
|
(defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
|
(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
|
||||||
return a;
|
return a;
|
||||||
#elif !defined(LFS_NO_INTRINSICS) && ( \
|
#elif !defined(LFS_NO_INTRINSICS) && ( \
|
||||||
(defined( BYTE_ORDER ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \
|
(defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \
|
(defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
|
(defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
|
||||||
return __builtin_bswap32(a);
|
return __builtin_bswap32(a);
|
||||||
#else
|
#else
|
||||||
return (((uint8_t*)&a)[0] << 0) |
|
return (((uint8_t*)&a)[0] << 0) |
|
||||||
@@ -167,14 +167,14 @@ static inline uint32_t lfs_tole32(uint32_t a) {
|
|||||||
// Convert between 32-bit big-endian and native order
|
// Convert between 32-bit big-endian and native order
|
||||||
static inline uint32_t lfs_frombe32(uint32_t a) {
|
static inline uint32_t lfs_frombe32(uint32_t a) {
|
||||||
#if !defined(LFS_NO_INTRINSICS) && ( \
|
#if !defined(LFS_NO_INTRINSICS) && ( \
|
||||||
(defined( BYTE_ORDER ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \
|
(defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \
|
(defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
|
(defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__))
|
||||||
return __builtin_bswap32(a);
|
return __builtin_bswap32(a);
|
||||||
#elif !defined(LFS_NO_INTRINSICS) && ( \
|
#elif !defined(LFS_NO_INTRINSICS) && ( \
|
||||||
(defined( BYTE_ORDER ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \
|
(defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \
|
(defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \
|
||||||
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
|
(defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
|
||||||
return a;
|
return a;
|
||||||
#else
|
#else
|
||||||
return (((uint8_t*)&a)[0] << 24) |
|
return (((uint8_t*)&a)[0] << 24) |
|
||||||
|
|||||||
@@ -11,6 +11,150 @@ tests/test.py << TEST
|
|||||||
lfs_format(&lfs, &cfg) => 0;
|
lfs_format(&lfs, &cfg) => 0;
|
||||||
TEST
|
TEST
|
||||||
|
|
||||||
|
echo "--- Simple truncate ---"
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldynoop",
|
||||||
|
LFS_O_WRONLY | LFS_O_CREAT) => 0;
|
||||||
|
|
||||||
|
strcpy((char*)buffer, "hair");
|
||||||
|
size = strlen((char*)buffer);
|
||||||
|
for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
|
||||||
|
lfs_file_write(&lfs, &file[0], buffer, size) => size;
|
||||||
|
}
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldynoop", LFS_O_RDWR) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldynoop", LFS_O_RDONLY) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
size = strlen("hair");
|
||||||
|
for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => size;
|
||||||
|
memcmp(buffer, "hair", size) => 0;
|
||||||
|
}
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => 0;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
|
||||||
|
echo "--- Truncate and read ---"
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldyread",
|
||||||
|
LFS_O_WRONLY | LFS_O_CREAT) => 0;
|
||||||
|
|
||||||
|
strcpy((char*)buffer, "hair");
|
||||||
|
size = strlen((char*)buffer);
|
||||||
|
for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
|
||||||
|
lfs_file_write(&lfs, &file[0], buffer, size) => size;
|
||||||
|
}
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldyread", LFS_O_RDWR) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
size = strlen("hair");
|
||||||
|
for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => size;
|
||||||
|
memcmp(buffer, "hair", size) => 0;
|
||||||
|
}
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => 0;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldyread", LFS_O_RDONLY) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
size = strlen("hair");
|
||||||
|
for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => size;
|
||||||
|
memcmp(buffer, "hair", size) => 0;
|
||||||
|
}
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => 0;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
|
||||||
|
echo "--- Truncate and write ---"
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldywrite",
|
||||||
|
LFS_O_WRONLY | LFS_O_CREAT) => 0;
|
||||||
|
|
||||||
|
strcpy((char*)buffer, "hair");
|
||||||
|
size = strlen((char*)buffer);
|
||||||
|
for (lfs_off_t j = 0; j < $LARGESIZE; j += size) {
|
||||||
|
lfs_file_write(&lfs, &file[0], buffer, size) => size;
|
||||||
|
}
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldywrite", LFS_O_RDWR) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $LARGESIZE;
|
||||||
|
|
||||||
|
lfs_file_truncate(&lfs, &file[0], $MEDIUMSIZE) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
strcpy((char*)buffer, "bald");
|
||||||
|
size = strlen((char*)buffer);
|
||||||
|
for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
|
||||||
|
lfs_file_write(&lfs, &file[0], buffer, size) => size;
|
||||||
|
}
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
tests/test.py << TEST
|
||||||
|
lfs_mount(&lfs, &cfg) => 0;
|
||||||
|
lfs_file_open(&lfs, &file[0], "baldywrite", LFS_O_RDONLY) => 0;
|
||||||
|
lfs_file_size(&lfs, &file[0]) => $MEDIUMSIZE;
|
||||||
|
|
||||||
|
size = strlen("bald");
|
||||||
|
for (lfs_off_t j = 0; j < $MEDIUMSIZE; j += size) {
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => size;
|
||||||
|
memcmp(buffer, "bald", size) => 0;
|
||||||
|
}
|
||||||
|
lfs_file_read(&lfs, &file[0], buffer, size) => 0;
|
||||||
|
|
||||||
|
lfs_file_close(&lfs, &file[0]) => 0;
|
||||||
|
lfs_unmount(&lfs) => 0;
|
||||||
|
TEST
|
||||||
|
|
||||||
|
# More aggressive general truncation tests
|
||||||
truncate_test() {
|
truncate_test() {
|
||||||
STARTSIZES="$1"
|
STARTSIZES="$1"
|
||||||
STARTSEEKS="$2"
|
STARTSEEKS="$2"
|
||||||
|
|||||||
Reference in New Issue
Block a user