Skip to content

Commit ef96021

Browse files
yanshayyanshay
authored andcommitted
fix seek and write to block start zeros rest of block after written data (#188)
1 parent 7e98d11 commit ef96021

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/volume_mgr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ where
878878
Err(e) => return Err(e),
879879
};
880880
let to_copy = core::cmp::min(block_avail, bytes_to_write - written);
881-
let block = if block_offset != 0 {
881+
let block = if block_offset != 0 || data.open_files[file_idx].current_offset < data.open_files[file_idx].entry.size {
882882
debug!("Reading for partial block write");
883883
data.block_cache
884884
.read_mut(block_idx)

tests/write_file.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,54 @@ 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 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.file_seek_from_start(f, seek_offset).expect("Seeking");
132+
volume_mgr.read(f, &mut expected_buffer).expect("read file");
133+
134+
// modify first byte
135+
expected_buffer[0] ^= 0xff;
136+
137+
// write only first byte, expecting the rest to not change
138+
volume_mgr.file_seek_from_start(f, seek_offset).expect("Seeking");
139+
volume_mgr.write(f, &expected_buffer[0..1]).expect("file write");
140+
volume_mgr.flush_file(f).expect("file flush");
141+
142+
// read and verify
143+
volume_mgr.file_seek_from_start(f, seek_offset).expect("file seek");
144+
let mut read_buffer = [0xffu8, 0xff, 0xff, 0xff];
145+
volume_mgr.read(f, &mut read_buffer).expect("file read");
146+
assert_eq!(read_buffer, expected_buffer, "mismatch seek+write at offset {seek_offset} from start");
147+
}
148+
149+
volume_mgr.close_file(f).expect("close file");
150+
volume_mgr.close_dir(root_dir).expect("close dir");
151+
volume_mgr.close_volume(volume).expect("close volume");
152+
}
105153
// ****************************************************************************
106154
//
107155
// End Of File

0 commit comments

Comments
 (0)