From 2f396cc0bcabf122dda1ee56fbad393afac35501 Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Fri, 3 Feb 2023 21:16:20 +0100 Subject: [PATCH] Replace LOOKAHEADWORDS_SIZE with LOOKAHEAD_SIZE This patch replaces the LOOKAHEADWORDS_SIZE in driver::Storage (measured in 4 bytes) with LOOKAHEAD_SIZE (measure in 8 bytes). This makes it impossible to set illegal values. --- CHANGELOG.md | 4 ++++ src/driver.rs | 7 ++----- src/fs.rs | 9 ++------- src/macros.rs | 16 ++++++++-------- src/tests.rs | 4 ++-- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af9436c5..211f04ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Made `Path::from_bytes_with_nul_unchecked` `const`. +- Replaced `LOOKAHEADWORDS_SIZE` (measured in multiples of four bytes) with + `LOOKAHEAD_SIZE` (measured in multiples of eight bytes) in `driver::Storage` + so that all possible values are valid. (See the lookahead size fix below for + context.) ### Fixed - Fixed the lookahead size reported to `littlefs2-sys`. Previously, the diff --git a/src/driver.rs b/src/driver.rs index 127f8d79..205e0c5f 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -52,11 +52,8 @@ pub trait Storage { /// Must be a factor of `BLOCK_SIZE`. type CACHE_SIZE: ArrayLength; - /// littlefs itself has a `LOOKAHEAD_SIZE`, which must be a multiple of 8 bytes. For - /// historical reasons, `LOOKAHEADWORDS_SIZE` is measured in 4 bytes. This means that users - /// must always provide a multiple of 2 here. - type LOOKAHEADWORDS_SIZE: ArrayLength; - // type LOOKAHEAD_SIZE: ArrayLength; + /// Size of the lookahead buffer used by littlefs, measured in multiples of 8 bytes. + type LOOKAHEAD_SIZE: ArrayLength; ///// Maximum length of a filename plus one. Stored in superblock. ///// Should default to 255+1, but associated type defaults don't exist currently. diff --git a/src/fs.rs b/src/fs.rs index 4af1865e..666cf6fe 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -20,8 +20,7 @@ struct Cache { read: Bytes, write: Bytes, // lookahead: aligned::Aligned>, - // lookahead buffer must be aligned to 32 bytes - lookahead: generic_array::GenericArray, + lookahead: generic_array::GenericArray, } impl Cache { @@ -60,7 +59,7 @@ impl Allocation { let write_size: u32 = Storage::WRITE_SIZE as _; let block_size: u32 = Storage::BLOCK_SIZE as _; let cache_size: u32 = ::CACHE_SIZE::U32; - let lookahead_size: u32 = 4 * ::LOOKAHEADWORDS_SIZE::U32; + let lookahead_size: u32 = 8 * ::LOOKAHEAD_SIZE::U32; let block_cycles: i32 = Storage::BLOCK_CYCLES as _; let block_count: u32 = Storage::BLOCK_COUNT as _; @@ -88,10 +87,6 @@ impl Allocation { debug_assert!(cache_size <= block_size); debug_assert!(block_size % cache_size == 0); - // lookahead words size (measured in 4 bytes) must be a multiple of 2 so that the actual - // lookahead size is a multiple of 8 bytes - debug_assert!(lookahead_size % 2 == 0); - let cache = Cache::new(); let filename_max_plus_one: u32 = crate::consts::FILENAME_MAX_PLUS_ONE; diff --git a/src/macros.rs b/src/macros.rs index fd887d6f..34a55304 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -14,7 +14,7 @@ macro_rules! ram_storage { ( cache_size_ty=$cache_size:path, block_size=$block_size:expr, block_count=$block_count:expr, - lookaheadwords_size_ty=$lookaheadwords_size:path, + lookahead_size_ty=$lookahead_size:path, filename_max_plus_one_ty=$filename_max_plus_one:path, path_max_plus_one_ty=$path_max_plus_one:path, result=$Result:ident, @@ -49,7 +49,7 @@ macro_rules! ram_storage { ( type CACHE_SIZE = $cache_size; const BLOCK_SIZE: usize = $block_size; const BLOCK_COUNT: usize = $block_count; - type LOOKAHEADWORDS_SIZE = $lookaheadwords_size; + type LOOKAHEAD_SIZE = $lookahead_size; fn read(&mut self, offset: usize, buf: &mut [u8]) -> $Result { let read_size: usize = Self::READ_SIZE; @@ -93,7 +93,7 @@ macro_rules! ram_storage { ( cache_size_ty=$crate::consts::U32, block_size=128, block_count=$bytes/128, - lookaheadwords_size_ty=$crate::consts::U2, + lookahead_size_ty=$crate::consts::U1, filename_max_plus_one_ty=$crate::consts::U256, path_max_plus_one_ty=$crate::consts::U256, result=LfsResult, @@ -110,7 +110,7 @@ macro_rules! ram_storage { ( cache_size_ty=$crate::consts::U32, block_size=128, block_count=8, - lookaheadwords_size_ty=$crate::consts::U2, + lookahead_size_ty=$crate::consts::U1, filename_max_plus_one_ty=$crate::consts::U256, path_max_plus_one_ty=$crate::consts::U256, result=Result, @@ -127,7 +127,7 @@ macro_rules! ram_storage { ( cache_size_ty=$crate::consts::U32, block_size=256, block_count=512, - lookaheadwords_size_ty=$crate::consts::U4, + lookahead_size_ty=$crate::consts::U4, filename_max_plus_one_ty=$crate::consts::U256, path_max_plus_one_ty=$crate::consts::U256, result=Result, @@ -146,7 +146,7 @@ macro_rules! const_ram_storage { ( cache_size_ty=$cache_size:path, block_size=$block_size:expr, block_count=$block_count:expr, - lookaheadwords_size_ty=$lookaheadwords_size:path, + lookahead_size_ty=$lookahead_size:path, filename_max_plus_one_ty=$filename_max_plus_one:path, path_max_plus_one_ty=$path_max_plus_one:path, result=$Result:ident, @@ -178,7 +178,7 @@ macro_rules! const_ram_storage { ( type CACHE_SIZE = $cache_size; const BLOCK_SIZE: usize = $block_size; const BLOCK_COUNT: usize = $block_count; - type LOOKAHEADWORDS_SIZE = $lookaheadwords_size; + type LOOKAHEAD_SIZE = $lookahead_size; fn read(&mut self, offset: usize, buf: &mut [u8]) -> $Result { let read_size: usize = Self::READ_SIZE; @@ -221,7 +221,7 @@ macro_rules! const_ram_storage { ( cache_size_ty=$crate::consts::U512, block_size=512, block_count=$bytes/512, - lookaheadwords_size_ty=$crate::consts::U2, + lookahead_size_ty=$crate::consts::U1, filename_max_plus_one_ty=$crate::consts::U256, path_max_plus_one_ty=$crate::consts::U256, result=LfsResult, diff --git a/src/tests.rs b/src/tests.rs index 70625574..fb99c34b 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -26,7 +26,7 @@ ram_storage!( cache_size_ty=consts::U32, block_size=256, block_count=512, - lookaheadwords_size_ty=consts::U2, + lookahead_size_ty=consts::U1, filename_max_plus_one_ty=consts::U256, path_max_plus_one_ty=consts::U256, result=Result, @@ -42,7 +42,7 @@ ram_storage!( cache_size_ty=consts::U700, block_size=20*35, block_count=32, - lookaheadwords_size_ty=consts::U16, + lookahead_size_ty=consts::U16, filename_max_plus_one_ty=consts::U256, path_max_plus_one_ty=consts::U256, result=Result,