Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/littlefs-project/littlefs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lfs.c
diff options
context:
space:
mode:
authorChristopher Haster <chaster@utexas.edu>2021-01-18 20:45:34 +0300
committerGitHub <noreply@github.com>2021-01-18 20:45:34 +0300
commit0db6466984f5715b82a7c735533beb604494a2c4 (patch)
treec058b1dea4a8d2b4f832fe2e90cc4b090a0d8d8c /lfs.c
parent21488d9e067ea8b5b5da4e6c9c911c8751c68217 (diff)
parent37f4de297672ee3ec05103d60e09bb7748c5e5b3 (diff)
Merge pull request #502 from mon/feature/meta_limits
Add metadata_max config to help performance on devices with large blocks
Diffstat (limited to 'lfs.c')
-rw-r--r--lfs.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/lfs.c b/lfs.c
index be2bbd7..6beff0c 100644
--- a/lfs.c
+++ b/lfs.c
@@ -1591,7 +1591,8 @@ static int lfs_dir_compact(lfs_t *lfs,
// for metadata updates.
if (end - begin < 0xff &&
size <= lfs_min(lfs->cfg->block_size - 36,
- lfs_alignup(lfs->cfg->block_size/2,
+ lfs_alignup((lfs->cfg->metadata_max ?
+ lfs->cfg->metadata_max : lfs->cfg->block_size)/2,
lfs->cfg->prog_size))) {
break;
}
@@ -1676,7 +1677,8 @@ static int lfs_dir_compact(lfs_t *lfs,
.crc = 0xffffffff,
.begin = 0,
- .end = lfs->cfg->block_size - 8,
+ .end = (lfs->cfg->metadata_max ?
+ lfs->cfg->metadata_max : lfs->cfg->block_size) - 8,
};
// erase block to write to
@@ -1886,7 +1888,8 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir,
.crc = 0xffffffff,
.begin = dir->off,
- .end = lfs->cfg->block_size - 8,
+ .end = (lfs->cfg->metadata_max ?
+ lfs->cfg->metadata_max : lfs->cfg->block_size) - 8,
};
// traverse attrs that need to be written out
@@ -2968,7 +2971,9 @@ static lfs_ssize_t lfs_file_rawwrite(lfs_t *lfs, lfs_file_t *file,
if ((file->flags & LFS_F_INLINE) &&
lfs_max(file->pos+nsize, file->ctz.size) >
lfs_min(0x3fe, lfs_min(
- lfs->cfg->cache_size, lfs->cfg->block_size/8))) {
+ lfs->cfg->cache_size,
+ (lfs->cfg->metadata_max ?
+ lfs->cfg->metadata_max : lfs->cfg->block_size) / 8))) {
// inline file doesn't fit anymore
int err = lfs_file_outline(lfs, file);
if (err) {
@@ -3538,6 +3543,8 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
lfs->attr_max = LFS_ATTR_MAX;
}
+ LFS_ASSERT(lfs->cfg->metadata_max <= lfs->cfg->block_size);
+
// setup default state
lfs->root[0] = LFS_BLOCK_NULL;
lfs->root[1] = LFS_BLOCK_NULL;
@@ -3831,7 +3838,7 @@ int lfs_fs_rawtraverse(lfs_t *lfs,
if (err) {
return err;
}
- } else if (includeorphans &&
+ } else if (includeorphans &&
lfs_tag_type3(tag) == LFS_TYPE_DIRSTRUCT) {
for (int i = 0; i < 2; i++) {
err = cb(data, (&ctz.head)[i]);