mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 00:38:29 +01:00
Compare commits
9 Commits
fix-travis
...
fix-trunca
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bf45c3a29 | ||
|
|
f35fb8c148 | ||
|
|
0a1f706ca2 | ||
|
|
fdd239fe21 | ||
|
|
780ef2fce4 | ||
|
|
73ea008b74 | ||
|
|
c849748453 | ||
|
|
905727b684 | ||
|
|
26d25608b6 |
@@ -136,6 +136,7 @@ jobs:
|
||||
env:
|
||||
- STAGE=test
|
||||
- NAME=littlefs-migration
|
||||
if: branch !~ -prefix$
|
||||
install:
|
||||
- sudo apt-get install libfuse-dev
|
||||
- git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha v2
|
||||
|
||||
26
lfs.c
26
lfs.c
@@ -29,7 +29,7 @@ static inline void lfs_cache_drop(lfs_t *lfs, lfs_cache_t *rcache) {
|
||||
|
||||
static inline void lfs_cache_zero(lfs_t *lfs, lfs_cache_t *pcache) {
|
||||
// zero to avoid information leak
|
||||
memset(pcache->buffer, 0xff, lfs->cfg->prog_size);
|
||||
memset(pcache->buffer, 0xff, lfs->cfg->cache_size);
|
||||
pcache->block = 0xffffffff;
|
||||
}
|
||||
|
||||
@@ -80,21 +80,6 @@ static int lfs_bd_read(lfs_t *lfs,
|
||||
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
|
||||
LFS_ASSERT(block < lfs->cfg->block_count);
|
||||
rcache->block = block;
|
||||
@@ -2864,6 +2849,10 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) {
|
||||
return LFS_ERR_BADF;
|
||||
}
|
||||
|
||||
if (size > LFS_FILE_MAX) {
|
||||
return LFS_ERR_INVAL;
|
||||
}
|
||||
|
||||
lfs_off_t oldsize = lfs_file_size(lfs, file);
|
||||
if (size < oldsize) {
|
||||
// need to flush since directly changing metadata
|
||||
@@ -2875,13 +2864,14 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) {
|
||||
// lookup new head in ctz skip list
|
||||
err = lfs_ctz_find(lfs, NULL, &file->cache,
|
||||
file->ctz.head, file->ctz.size,
|
||||
size, &file->ctz.head, &(lfs_off_t){0});
|
||||
size, &file->block, &file->off);
|
||||
if (err) {
|
||||
return err;
|
||||
}
|
||||
|
||||
file->ctz.head = file->block;
|
||||
file->ctz.size = size;
|
||||
file->flags |= LFS_F_DIRTY;
|
||||
file->flags |= LFS_F_DIRTY | LFS_F_READING;
|
||||
} else if (size > oldsize) {
|
||||
lfs_off_t pos = file->pos;
|
||||
|
||||
|
||||
3
lfs.h
3
lfs.h
@@ -578,7 +578,8 @@ int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir);
|
||||
// Read an entry in the directory
|
||||
//
|
||||
// Fills out the info structure, based on the specified file or directory.
|
||||
// Returns a negative error code on failure.
|
||||
// Returns a positive value on success, 0 at the end of directory,
|
||||
// or a negative error code on failure.
|
||||
int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info);
|
||||
|
||||
// Change the position of the directory
|
||||
|
||||
@@ -11,6 +11,150 @@ tests/test.py << TEST
|
||||
lfs_format(&lfs, &cfg) => 0;
|
||||
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() {
|
||||
STARTSIZES="$1"
|
||||
STARTSEEKS="$2"
|
||||
|
||||
Reference in New Issue
Block a user