Skip to content

Commit ea8cd4c

Browse files
authored
Merge pull request #191 from rust-embedded-community/release-v0.8.2-backport
2 parents bbb7374 + da39b6f commit ea8cd4c

File tree

4 files changed

+79
-12
lines changed

4 files changed

+79
-12
lines changed

CHANGELOG.md

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ The format is based on [Keep a Changelog] and this project adheres to [Semantic
1818

1919
- None
2020

21+
## [Version 0.8.2] - 2025-06-07
22+
23+
### Changed
24+
25+
* Fixed writing at block start mid-file (previously overwrote subsequent file data with zeros up to the end of the block)
26+
2127
## [Version 0.8.1] - 2024-11-03
2228

2329
### Changed
@@ -174,13 +180,15 @@ The format is based on [Keep a Changelog] and this project adheres to [Semantic
174180

175181
[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/
176182
[Semantic Versioning]: http://semver.org/spec/v2.0.0.html
177-
[Unreleased]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.8.0...develop
178-
[Version 0.8.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.8.0...v0.7.0
179-
[Version 0.7.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.7.0...v0.6.0
180-
[Version 0.6.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.6.0...v0.5.0
181-
[Version 0.5.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.5.0...v0.4.0
182-
[Version 0.4.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.4.0...v0.3.0
183-
[Version 0.3.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.3.0...v0.2.1
184-
[Version 0.2.1]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.2.1...v0.2.0
185-
[Version 0.2.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.2.0...v0.1.1
183+
[Unreleased]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.8.2...develop
184+
[Version 0.8.2]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.8.1...v0.8.2
185+
[Version 0.8.1]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.8.0...v0.8.1
186+
[Version 0.8.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.7.0...v0.8.0
187+
[Version 0.7.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.6.0...v0.7.0
188+
[Version 0.6.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.5.0...v0.6.0
189+
[Version 0.5.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.4.0...v0.5.0
190+
[Version 0.4.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.3.0...v0.4.0
191+
[Version 0.3.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.2.1...v0.3.0
192+
[Version 0.2.1]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.2.0...v0.2.1
193+
[Version 0.2.0]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/compare/v0.1.1...v0.2.0
186194
[Version 0.1.1]: https://github.com/rust-embedded-community/embedded-sdmmc-rs/releases/tag/v0.1.1

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0"
88
name = "embedded-sdmmc"
99
readme = "README.md"
1010
repository = "https://github.com/rust-embedded-community/embedded-sdmmc-rs"
11-
version = "0.8.1"
11+
version = "0.8.2"
1212

1313
[dependencies]
1414
byteorder = {version = "1", default-features = false}

src/volume_mgr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,8 +753,8 @@ where
753753
};
754754
let mut blocks = [Block::new()];
755755
let to_copy = core::cmp::min(block_avail, bytes_to_write - written);
756-
if block_offset != 0 {
757-
debug!("Partial block write");
756+
if block_offset != 0 || to_copy != block_avail {
757+
debug!("Partial block read/modify/write");
758758
self.block_device
759759
.read(&mut blocks, block_idx, "read")
760760
.map_err(Error::DeviceError)?;

tests/write_file.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,65 @@ fn flush_file() {
102102
assert_eq!(entry.size, 64 * 3);
103103
}
104104

105+
#[test]
106+
fn random_access_write_file() {
107+
let time_source = utils::make_time_source();
108+
let disk = utils::make_block_device(utils::DISK_SOURCE).unwrap();
109+
let mut volume_mgr: VolumeManager<utils::RamDisk<Vec<u8>>, utils::TestTimeSource, 4, 2, 1> =
110+
VolumeManager::new_with_limits(disk, time_source, 0xAA00_0000);
111+
let volume = volume_mgr
112+
.open_raw_volume(VolumeIdx(0))
113+
.expect("open volume");
114+
let root_dir = volume_mgr.open_root_dir(volume).expect("open root dir");
115+
116+
// Open with string
117+
let f = volume_mgr
118+
.open_file_in_dir(root_dir, "README.TXT", Mode::ReadWriteTruncate)
119+
.expect("open file");
120+
121+
let test_data = vec![0xCC; 1024];
122+
volume_mgr.write(f, &test_data).expect("file write");
123+
124+
let length = volume_mgr.file_length(f).expect("get length");
125+
assert_eq!(length, 1024);
126+
127+
for seek_offset in [100, 0] {
128+
let mut expected_buffer = [0u8; 4];
129+
130+
// fetch some data at offset seek_offset
131+
volume_mgr
132+
.file_seek_from_start(f, seek_offset)
133+
.expect("Seeking");
134+
volume_mgr.read(f, &mut expected_buffer).expect("read file");
135+
136+
// modify first byte
137+
expected_buffer[0] ^= 0xff;
138+
139+
// write only first byte, expecting the rest to not change
140+
volume_mgr
141+
.file_seek_from_start(f, seek_offset)
142+
.expect("Seeking");
143+
volume_mgr
144+
.write(f, &expected_buffer[0..1])
145+
.expect("file write");
146+
volume_mgr.flush_file(f).expect("file flush");
147+
148+
// read and verify
149+
volume_mgr
150+
.file_seek_from_start(f, seek_offset)
151+
.expect("file seek");
152+
let mut read_buffer = [0xffu8, 0xff, 0xff, 0xff];
153+
volume_mgr.read(f, &mut read_buffer).expect("file read");
154+
assert_eq!(
155+
read_buffer, expected_buffer,
156+
"mismatch seek+write at offset {seek_offset} from start"
157+
);
158+
}
159+
160+
volume_mgr.close_file(f).expect("close file");
161+
volume_mgr.close_dir(root_dir).expect("close dir");
162+
volume_mgr.close_volume(volume).expect("close volume");
163+
}
105164
// ****************************************************************************
106165
//
107166
// End Of File

0 commit comments

Comments
 (0)