Skip to content

Commit 3e672aa

Browse files
committed
Prefer chunks_exact.
1 parent 011726b commit 3e672aa

File tree

1 file changed

+27
-32
lines changed

1 file changed

+27
-32
lines changed

src/fat/volume.rs

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,10 @@ impl FatVolume {
313313
block_device
314314
.read(&mut blocks, block, "read_dir")
315315
.map_err(Error::DeviceError)?;
316-
let entries_per_block = Block::LEN / OnDiskDirEntry::LEN;
317-
for entry in 0..entries_per_block {
318-
let start = entry * OnDiskDirEntry::LEN;
319-
let end = (entry + 1) * OnDiskDirEntry::LEN;
320-
let dir_entry = OnDiskDirEntry::new(&blocks[0][start..end]);
316+
for (i, dir_entry_bytes) in
317+
blocks[0].chunks_exact_mut(OnDiskDirEntry::LEN).enumerate()
318+
{
319+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
321320
// 0x00 or 0xE5 represents a free entry
322321
if !dir_entry.is_valid() {
323322
let ctime = time_source.get_timestamp();
@@ -327,9 +326,9 @@ impl FatVolume {
327326
ClusterId::EMPTY,
328327
ctime,
329328
block,
330-
start as u32,
329+
(i * OnDiskDirEntry::LEN) as u32,
331330
);
332-
blocks[0][start..start + 32]
331+
dir_entry_bytes
333332
.copy_from_slice(&entry.serialize(FatType::Fat16)[..]);
334333
block_device
335334
.write(&blocks, block)
@@ -381,10 +380,10 @@ impl FatVolume {
381380
.map_err(Error::DeviceError)?;
382381
// Are any entries in the block we just loaded blank? If so
383382
// we can use them.
384-
for entry in 0..Block::LEN / OnDiskDirEntry::LEN {
385-
let start = entry * OnDiskDirEntry::LEN;
386-
let end = (entry + 1) * OnDiskDirEntry::LEN;
387-
let dir_entry = OnDiskDirEntry::new(&blocks[0][start..end]);
383+
for (i, dir_entry_bytes) in
384+
blocks[0].chunks_exact_mut(OnDiskDirEntry::LEN).enumerate()
385+
{
386+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
388387
// 0x00 or 0xE5 represents a free entry
389388
if !dir_entry.is_valid() {
390389
let ctime = time_source.get_timestamp();
@@ -394,9 +393,9 @@ impl FatVolume {
394393
ClusterId(0),
395394
ctime,
396395
block,
397-
start as u32,
396+
(i * OnDiskDirEntry::LEN) as u32,
398397
);
399-
blocks[0][start..start + 32]
398+
dir_entry_bytes
400399
.copy_from_slice(&entry.serialize(FatType::Fat32)[..]);
401400
block_device
402401
.write(&blocks, block)
@@ -483,16 +482,14 @@ impl FatVolume {
483482
while let Some(cluster) = current_cluster {
484483
for block_idx in first_dir_block_num.range(dir_size) {
485484
let block = block_cache.read(block_device, block_idx, "read_dir")?;
486-
for entry in 0..Block::LEN / OnDiskDirEntry::LEN {
487-
let start = entry * OnDiskDirEntry::LEN;
488-
let end = (entry + 1) * OnDiskDirEntry::LEN;
489-
let dir_entry = OnDiskDirEntry::new(&block[start..end]);
485+
for (i, dir_entry_bytes) in block.chunks_exact(OnDiskDirEntry::LEN).enumerate() {
486+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
490487
if dir_entry.is_end() {
491488
// Can quit early
492489
return Ok(());
493490
} else if dir_entry.is_valid() && !dir_entry.is_lfn() {
494491
// Safe, since Block::LEN always fits on a u32
495-
let start = u32::try_from(start).unwrap();
492+
let start = (i * OnDiskDirEntry::LEN) as u32;
496493
let entry = dir_entry.get_entry(FatType::Fat16, block_idx, start);
497494
func(&entry);
498495
}
@@ -538,16 +535,16 @@ impl FatVolume {
538535
block_device
539536
.read(&mut blocks, block, "read_dir")
540537
.map_err(Error::DeviceError)?;
541-
for entry in 0..Block::LEN / OnDiskDirEntry::LEN {
542-
let start = entry * OnDiskDirEntry::LEN;
543-
let end = (entry + 1) * OnDiskDirEntry::LEN;
544-
let dir_entry = OnDiskDirEntry::new(&blocks[0][start..end]);
538+
for (i, dir_entry_bytes) in
539+
blocks[0].chunks_exact_mut(OnDiskDirEntry::LEN).enumerate()
540+
{
541+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
545542
if dir_entry.is_end() {
546543
// Can quit early
547544
return Ok(());
548545
} else if dir_entry.is_valid() && !dir_entry.is_lfn() {
549546
// Safe, since Block::LEN always fits on a u32
550-
let start = u32::try_from(start).unwrap();
547+
let start = (i * OnDiskDirEntry::LEN) as u32;
551548
let entry = dir_entry.get_entry(FatType::Fat32, block, start);
552549
func(&entry);
553550
}
@@ -664,17 +661,15 @@ impl FatVolume {
664661
block_device
665662
.read(&mut blocks, block, "read_dir")
666663
.map_err(Error::DeviceError)?;
667-
for entry in 0..Block::LEN / OnDiskDirEntry::LEN {
668-
let start = entry * OnDiskDirEntry::LEN;
669-
let end = (entry + 1) * OnDiskDirEntry::LEN;
670-
let dir_entry = OnDiskDirEntry::new(&blocks[0][start..end]);
664+
for (i, dir_entry_bytes) in blocks[0].chunks_exact_mut(OnDiskDirEntry::LEN).enumerate() {
665+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
671666
if dir_entry.is_end() {
672667
// Can quit early
673668
break;
674669
} else if dir_entry.matches(match_name) {
675670
// Found it
676671
// Safe, since Block::LEN always fits on a u32
677-
let start = u32::try_from(start).unwrap();
672+
let start = (i * OnDiskDirEntry::LEN) as u32;
678673
return Ok(dir_entry.get_entry(fat_type, block, start));
679674
}
680675
}
@@ -800,15 +795,15 @@ impl FatVolume {
800795
block_device
801796
.read(&mut blocks, block, "read_dir")
802797
.map_err(Error::DeviceError)?;
803-
for entry in 0..Block::LEN / OnDiskDirEntry::LEN {
804-
let start = entry * OnDiskDirEntry::LEN;
805-
let end = (entry + 1) * OnDiskDirEntry::LEN;
806-
let dir_entry = OnDiskDirEntry::new(&blocks[0][start..end]);
798+
for (i, dir_entry_bytes) in blocks[0].chunks_exact_mut(OnDiskDirEntry::LEN).enumerate() {
799+
let dir_entry = OnDiskDirEntry::new(dir_entry_bytes);
807800
if dir_entry.is_end() {
808801
// Can quit early
809802
break;
810803
} else if dir_entry.matches(match_name) {
811804
let mut blocks = blocks;
805+
let start = i * OnDiskDirEntry::LEN;
806+
// set first byte to the 'unused' marker
812807
blocks[0].contents[start] = 0xE5;
813808
return block_device
814809
.write(&blocks, block)

0 commit comments

Comments
 (0)