From a6f01b7d6edb95f8a385955cc17d52d8df263c4a Mon Sep 17 00:00:00 2001 From: robekras Date: Sun, 16 Jan 2022 20:50:01 +0100 Subject: [PATCH] Update lfs.c This should fix the performance issue if a new seek position belongs to currently cached data. This avoids unnecessary rereads of file data. --- lfs.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lfs.c b/lfs.c index e165e54..15543a8 100644 --- a/lfs.c +++ b/lfs.c @@ -3091,6 +3091,21 @@ static lfs_soff_t lfs_file_rawseek(lfs_t *lfs, lfs_file_t *file, return npos; } + // Get the difference between new and current file position + // If new position is after the current file position + // If new position belongs to the currently cached data + // Set new file position, + // and update also the block related position + int offset = npos - file->pos; + if (offset > 0) { + if ((file->off + offset) < lfs->cfg->block_size) { + file->pos = npos; + file->off += offset; + + return npos; + } + } + // write out everything beforehand, may be noop if rdonly int err = lfs_file_flush(lfs, file); if (err) {