@@ -313,11 +313,10 @@ impl FatVolume {
313
313
block_device
314
314
. read ( & mut blocks, block, "read_dir" )
315
315
. 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) ;
321
320
// 0x00 or 0xE5 represents a free entry
322
321
if !dir_entry. is_valid ( ) {
323
322
let ctime = time_source. get_timestamp ( ) ;
@@ -327,9 +326,9 @@ impl FatVolume {
327
326
ClusterId :: EMPTY ,
328
327
ctime,
329
328
block,
330
- start as u32 ,
329
+ ( i * OnDiskDirEntry :: LEN ) as u32 ,
331
330
) ;
332
- blocks [ 0 ] [ start..start + 32 ]
331
+ dir_entry_bytes
333
332
. copy_from_slice ( & entry. serialize ( FatType :: Fat16 ) [ ..] ) ;
334
333
block_device
335
334
. write ( & blocks, block)
@@ -381,10 +380,10 @@ impl FatVolume {
381
380
. map_err ( Error :: DeviceError ) ?;
382
381
// Are any entries in the block we just loaded blank? If so
383
382
// 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 ) ;
388
387
// 0x00 or 0xE5 represents a free entry
389
388
if !dir_entry. is_valid ( ) {
390
389
let ctime = time_source. get_timestamp ( ) ;
@@ -394,9 +393,9 @@ impl FatVolume {
394
393
ClusterId ( 0 ) ,
395
394
ctime,
396
395
block,
397
- start as u32 ,
396
+ ( i * OnDiskDirEntry :: LEN ) as u32 ,
398
397
) ;
399
- blocks [ 0 ] [ start..start + 32 ]
398
+ dir_entry_bytes
400
399
. copy_from_slice ( & entry. serialize ( FatType :: Fat32 ) [ ..] ) ;
401
400
block_device
402
401
. write ( & blocks, block)
@@ -483,16 +482,14 @@ impl FatVolume {
483
482
while let Some ( cluster) = current_cluster {
484
483
for block_idx in first_dir_block_num. range ( dir_size) {
485
484
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) ;
490
487
if dir_entry. is_end ( ) {
491
488
// Can quit early
492
489
return Ok ( ( ) ) ;
493
490
} else if dir_entry. is_valid ( ) && !dir_entry. is_lfn ( ) {
494
491
// 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 ;
496
493
let entry = dir_entry. get_entry ( FatType :: Fat16 , block_idx, start) ;
497
494
func ( & entry) ;
498
495
}
@@ -538,16 +535,16 @@ impl FatVolume {
538
535
block_device
539
536
. read ( & mut blocks, block, "read_dir" )
540
537
. 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 ) ;
545
542
if dir_entry. is_end ( ) {
546
543
// Can quit early
547
544
return Ok ( ( ) ) ;
548
545
} else if dir_entry. is_valid ( ) && !dir_entry. is_lfn ( ) {
549
546
// 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 ;
551
548
let entry = dir_entry. get_entry ( FatType :: Fat32 , block, start) ;
552
549
func ( & entry) ;
553
550
}
@@ -664,17 +661,15 @@ impl FatVolume {
664
661
block_device
665
662
. read ( & mut blocks, block, "read_dir" )
666
663
. 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) ;
671
666
if dir_entry. is_end ( ) {
672
667
// Can quit early
673
668
break ;
674
669
} else if dir_entry. matches ( match_name) {
675
670
// Found it
676
671
// 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 ;
678
673
return Ok ( dir_entry. get_entry ( fat_type, block, start) ) ;
679
674
}
680
675
}
@@ -800,15 +795,15 @@ impl FatVolume {
800
795
block_device
801
796
. read ( & mut blocks, block, "read_dir" )
802
797
. 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) ;
807
800
if dir_entry. is_end ( ) {
808
801
// Can quit early
809
802
break ;
810
803
} else if dir_entry. matches ( match_name) {
811
804
let mut blocks = blocks;
805
+ let start = i * OnDiskDirEntry :: LEN ;
806
+ // set first byte to the 'unused' marker
812
807
blocks[ 0 ] . contents [ start] = 0xE5 ;
813
808
return block_device
814
809
. write ( & blocks, block)
0 commit comments