@@ -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