@@ -176,8 +176,9 @@ impl FatVolume {
176
176
return Ok ( ( ) ) ;
177
177
}
178
178
let mut blocks = [ Block :: new ( ) ] ;
179
+ trace ! ( "Reading info sector" ) ;
179
180
block_device
180
- . read ( & mut blocks, fat32_info. info_location , "read_info_sector" )
181
+ . read ( & mut blocks, fat32_info. info_location )
181
182
. map_err ( Error :: DeviceError ) ?;
182
183
let block = & mut blocks[ 0 ] ;
183
184
if let Some ( count) = self . free_clusters_count {
@@ -186,6 +187,7 @@ impl FatVolume {
186
187
if let Some ( next_free_cluster) = self . next_free_cluster {
187
188
block[ 492 ..496 ] . copy_from_slice ( & next_free_cluster. 0 . to_le_bytes ( ) ) ;
188
189
}
190
+ trace ! ( "Writing info sector" ) ;
189
191
block_device
190
192
. write ( & blocks, fat32_info. info_location )
191
193
. map_err ( Error :: DeviceError ) ?;
@@ -219,8 +221,9 @@ impl FatVolume {
219
221
let fat_offset = cluster. 0 * 2 ;
220
222
this_fat_block_num = self . lba_start + self . fat_start . offset_bytes ( fat_offset) ;
221
223
let this_fat_ent_offset = ( fat_offset % Block :: LEN_U32 ) as usize ;
224
+ trace ! ( "Reading FAT" ) ;
222
225
block_device
223
- . read ( & mut blocks, this_fat_block_num, "read_fat" )
226
+ . read ( & mut blocks, this_fat_block_num)
224
227
. map_err ( Error :: DeviceError ) ?;
225
228
// See <https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system>
226
229
let entry = match new_value {
@@ -240,8 +243,9 @@ impl FatVolume {
240
243
let fat_offset = cluster. 0 * 4 ;
241
244
this_fat_block_num = self . lba_start + self . fat_start . offset_bytes ( fat_offset) ;
242
245
let this_fat_ent_offset = ( fat_offset % Block :: LEN_U32 ) as usize ;
246
+ trace ! ( "Reading FAT" ) ;
243
247
block_device
244
- . read ( & mut blocks, this_fat_block_num, "read_fat" )
248
+ . read ( & mut blocks, this_fat_block_num)
245
249
. map_err ( Error :: DeviceError ) ?;
246
250
let entry = match new_value {
247
251
ClusterId :: INVALID => 0x0FFF_FFF6 ,
@@ -259,6 +263,7 @@ impl FatVolume {
259
263
) ;
260
264
}
261
265
}
266
+ trace ! ( "Writing FAT" ) ;
262
267
block_device
263
268
. write ( & blocks, this_fat_block_num)
264
269
. map_err ( Error :: DeviceError ) ?;
@@ -283,8 +288,8 @@ impl FatVolume {
283
288
let fat_offset = cluster. 0 * 2 ;
284
289
let this_fat_block_num = self . lba_start + self . fat_start . offset_bytes ( fat_offset) ;
285
290
let this_fat_ent_offset = ( fat_offset % Block :: LEN_U32 ) as usize ;
286
- let block =
287
- fat_block_cache. read ( block_device, this_fat_block_num, "next_cluster" ) ?;
291
+ trace ! ( "Reading FAT" ) ;
292
+ let block = fat_block_cache. read ( block_device, this_fat_block_num) ?;
288
293
let fat_entry =
289
294
LittleEndian :: read_u16 ( & block[ this_fat_ent_offset..=this_fat_ent_offset + 1 ] ) ;
290
295
match fat_entry {
@@ -306,8 +311,8 @@ impl FatVolume {
306
311
let fat_offset = cluster. 0 * 4 ;
307
312
let this_fat_block_num = self . lba_start + self . fat_start . offset_bytes ( fat_offset) ;
308
313
let this_fat_ent_offset = ( fat_offset % Block :: LEN_U32 ) as usize ;
309
- let block =
310
- fat_block_cache. read ( block_device, this_fat_block_num, "next_cluster" ) ?;
314
+ trace ! ( "Reading FAT" ) ;
315
+ let block = fat_block_cache. read ( block_device, this_fat_block_num) ?;
311
316
let fat_entry =
312
317
LittleEndian :: read_u32 ( & block[ this_fat_ent_offset..=this_fat_ent_offset + 3 ] )
313
318
& 0x0FFF_FFFF ;
@@ -406,14 +411,14 @@ impl FatVolume {
406
411
let mut blocks = [ Block :: new ( ) ] ;
407
412
while let Some ( cluster) = current_cluster {
408
413
for block in first_dir_block_num. range ( dir_size) {
414
+ trace ! ( "Reading directory" ) ;
409
415
block_device
410
- . read ( & mut blocks, block, "read_dir" )
416
+ . read ( & mut blocks, block)
411
417
. map_err ( Error :: DeviceError ) ?;
412
- let entries_per_block = Block :: LEN / OnDiskDirEntry :: LEN ;
413
- for entry in 0 ..entries_per_block {
414
- let start = entry * OnDiskDirEntry :: LEN ;
415
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
416
- let dir_entry = OnDiskDirEntry :: new ( & blocks[ 0 ] [ start..end] ) ;
418
+ for ( i, dir_entry_bytes) in
419
+ blocks[ 0 ] . chunks_exact_mut ( OnDiskDirEntry :: LEN ) . enumerate ( )
420
+ {
421
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes) ;
417
422
// 0x00 or 0xE5 represents a free entry
418
423
if !dir_entry. is_valid ( ) {
419
424
let ctime = time_source. get_timestamp ( ) ;
@@ -423,10 +428,11 @@ impl FatVolume {
423
428
ClusterId :: EMPTY ,
424
429
ctime,
425
430
block,
426
- start as u32 ,
431
+ ( i * OnDiskDirEntry :: LEN ) as u32 ,
427
432
) ;
428
- blocks [ 0 ] [ start..start + 32 ]
433
+ dir_entry_bytes
429
434
. copy_from_slice ( & entry. serialize ( FatType :: Fat16 ) [ ..] ) ;
435
+ trace ! ( "Updating directory" ) ;
430
436
block_device
431
437
. write ( & blocks, block)
432
438
. map_err ( Error :: DeviceError ) ?;
@@ -472,15 +478,16 @@ impl FatVolume {
472
478
// Loop through the blocks in the cluster
473
479
for block in first_dir_block_num. range ( dir_size) {
474
480
// Read a block of directory entries
481
+ trace ! ( "Reading directory" ) ;
475
482
block_device
476
- . read ( & mut blocks, block, "read_dir" )
483
+ . read ( & mut blocks, block)
477
484
. map_err ( Error :: DeviceError ) ?;
478
485
// Are any entries in the block we just loaded blank? If so
479
486
// we can use them.
480
- for entry in 0 .. Block :: LEN / OnDiskDirEntry :: LEN {
481
- let start = entry * OnDiskDirEntry :: LEN ;
482
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
483
- let dir_entry = OnDiskDirEntry :: new ( & blocks [ 0 ] [ start..end ] ) ;
487
+ for ( i , dir_entry_bytes ) in
488
+ blocks [ 0 ] . chunks_exact_mut ( OnDiskDirEntry :: LEN ) . enumerate ( )
489
+ {
490
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes ) ;
484
491
// 0x00 or 0xE5 represents a free entry
485
492
if !dir_entry. is_valid ( ) {
486
493
let ctime = time_source. get_timestamp ( ) ;
@@ -490,10 +497,11 @@ impl FatVolume {
490
497
ClusterId ( 0 ) ,
491
498
ctime,
492
499
block,
493
- start as u32 ,
500
+ ( i * OnDiskDirEntry :: LEN ) as u32 ,
494
501
) ;
495
- blocks [ 0 ] [ start..start + 32 ]
502
+ dir_entry_bytes
496
503
. copy_from_slice ( & entry. serialize ( FatType :: Fat32 ) [ ..] ) ;
504
+ trace ! ( "Updating directory" ) ;
497
505
block_device
498
506
. write ( & blocks, block)
499
507
. map_err ( Error :: DeviceError ) ?;
@@ -578,17 +586,16 @@ impl FatVolume {
578
586
let mut block_cache = BlockCache :: empty ( ) ;
579
587
while let Some ( cluster) = current_cluster {
580
588
for block_idx in first_dir_block_num. range ( dir_size) {
581
- let block = block_cache. read ( block_device, block_idx, "read_dir" ) ?;
582
- for entry in 0 ..Block :: LEN / OnDiskDirEntry :: LEN {
583
- let start = entry * OnDiskDirEntry :: LEN ;
584
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
585
- let dir_entry = OnDiskDirEntry :: new ( & block[ start..end] ) ;
589
+ trace ! ( "Reading FAT" ) ;
590
+ let block = block_cache. read ( block_device, block_idx) ?;
591
+ for ( i, dir_entry_bytes) in block. chunks_exact ( OnDiskDirEntry :: LEN ) . enumerate ( ) {
592
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes) ;
586
593
if dir_entry. is_end ( ) {
587
594
// Can quit early
588
595
return Ok ( ( ) ) ;
589
596
} else if dir_entry. is_valid ( ) && !dir_entry. is_lfn ( ) {
590
597
// Block::LEN always fits on a u32
591
- let start = start as u32 ;
598
+ let start = ( i * OnDiskDirEntry :: LEN ) as u32 ;
592
599
let entry = dir_entry. get_entry ( FatType :: Fat16 , block_idx, start) ;
593
600
func ( & entry) ;
594
601
}
@@ -631,19 +638,20 @@ impl FatVolume {
631
638
while let Some ( cluster) = current_cluster {
632
639
let block_idx = self . cluster_to_block ( cluster) ;
633
640
for block in block_idx. range ( BlockCount ( u32:: from ( self . blocks_per_cluster ) ) ) {
641
+ trace ! ( "Reading FAT" ) ;
634
642
block_device
635
- . read ( & mut blocks, block, "read_dir" )
643
+ . read ( & mut blocks, block)
636
644
. map_err ( Error :: DeviceError ) ?;
637
- for entry in 0 .. Block :: LEN / OnDiskDirEntry :: LEN {
638
- let start = entry * OnDiskDirEntry :: LEN ;
639
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
640
- let dir_entry = OnDiskDirEntry :: new ( & blocks [ 0 ] [ start..end ] ) ;
645
+ for ( i , dir_entry_bytes ) in
646
+ blocks [ 0 ] . chunks_exact_mut ( OnDiskDirEntry :: LEN ) . enumerate ( )
647
+ {
648
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes ) ;
641
649
if dir_entry. is_end ( ) {
642
650
// Can quit early
643
651
return Ok ( ( ) ) ;
644
652
} else if dir_entry. is_valid ( ) && !dir_entry. is_lfn ( ) {
645
653
// Block::LEN always fits on a u32
646
- let start = start as u32 ;
654
+ let start = ( i * OnDiskDirEntry :: LEN ) as u32 ;
647
655
let entry = dir_entry. get_entry ( FatType :: Fat32 , block, start) ;
648
656
func ( & entry) ;
649
657
}
@@ -757,20 +765,19 @@ impl FatVolume {
757
765
D : BlockDevice ,
758
766
{
759
767
let mut blocks = [ Block :: new ( ) ] ;
768
+ trace ! ( "Reading directory" ) ;
760
769
block_device
761
- . read ( & mut blocks, block, "read_dir" )
770
+ . read ( & mut blocks, block)
762
771
. map_err ( Error :: DeviceError ) ?;
763
- for entry in 0 ..Block :: LEN / OnDiskDirEntry :: LEN {
764
- let start = entry * OnDiskDirEntry :: LEN ;
765
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
766
- let dir_entry = OnDiskDirEntry :: new ( & blocks[ 0 ] [ start..end] ) ;
772
+ for ( i, dir_entry_bytes) in blocks[ 0 ] . chunks_exact_mut ( OnDiskDirEntry :: LEN ) . enumerate ( ) {
773
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes) ;
767
774
if dir_entry. is_end ( ) {
768
775
// Can quit early
769
776
break ;
770
777
} else if dir_entry. matches ( match_name) {
771
778
// Found it
772
779
// Block::LEN always fits on a u32
773
- let start = start as u32 ;
780
+ let start = ( i * OnDiskDirEntry :: LEN ) as u32 ;
774
781
return Ok ( dir_entry. get_entry ( fat_type, block, start) ) ;
775
782
}
776
783
}
@@ -893,19 +900,21 @@ impl FatVolume {
893
900
D : BlockDevice ,
894
901
{
895
902
let mut blocks = [ Block :: new ( ) ] ;
903
+ trace ! ( "Reading directory" ) ;
896
904
block_device
897
- . read ( & mut blocks, block, "read_dir" )
905
+ . read ( & mut blocks, block)
898
906
. map_err ( Error :: DeviceError ) ?;
899
- for entry in 0 ..Block :: LEN / OnDiskDirEntry :: LEN {
900
- let start = entry * OnDiskDirEntry :: LEN ;
901
- let end = ( entry + 1 ) * OnDiskDirEntry :: LEN ;
902
- let dir_entry = OnDiskDirEntry :: new ( & blocks[ 0 ] [ start..end] ) ;
907
+ for ( i, dir_entry_bytes) in blocks[ 0 ] . chunks_exact_mut ( OnDiskDirEntry :: LEN ) . enumerate ( ) {
908
+ let dir_entry = OnDiskDirEntry :: new ( dir_entry_bytes) ;
903
909
if dir_entry. is_end ( ) {
904
910
// Can quit early
905
911
break ;
906
912
} else if dir_entry. matches ( match_name) {
907
913
let mut blocks = blocks;
914
+ let start = i * OnDiskDirEntry :: LEN ;
915
+ // set first byte to the 'unused' marker
908
916
blocks[ 0 ] . contents [ start] = 0xE5 ;
917
+ trace ! ( "Updating directory" ) ;
909
918
return block_device
910
919
. write ( & blocks, block)
911
920
. map_err ( Error :: DeviceError ) ;
@@ -943,7 +952,7 @@ impl FatVolume {
943
952
. map_err ( |_| Error :: ConversionError ) ?;
944
953
trace ! ( "Reading block {:?}" , this_fat_block_num) ;
945
954
block_device
946
- . read ( & mut blocks, this_fat_block_num, "next_cluster" )
955
+ . read ( & mut blocks, this_fat_block_num)
947
956
. map_err ( Error :: DeviceError ) ?;
948
957
949
958
while this_fat_ent_offset <= Block :: LEN - 2 {
@@ -974,7 +983,7 @@ impl FatVolume {
974
983
. map_err ( |_| Error :: ConversionError ) ?;
975
984
trace ! ( "Reading block {:?}" , this_fat_block_num) ;
976
985
block_device
977
- . read ( & mut blocks, this_fat_block_num, "next_cluster" )
986
+ . read ( & mut blocks, this_fat_block_num)
978
987
. map_err ( Error :: DeviceError ) ?;
979
988
980
989
while this_fat_ent_offset <= Block :: LEN - 4 {
@@ -1070,6 +1079,7 @@ impl FatVolume {
1070
1079
let first_block = self . cluster_to_block ( new_cluster) ;
1071
1080
let num_blocks = BlockCount ( u32:: from ( self . blocks_per_cluster ) ) ;
1072
1081
for block in first_block. range ( num_blocks) {
1082
+ trace ! ( "Zeroing cluster" ) ;
1073
1083
block_device
1074
1084
. write ( & blocks, block)
1075
1085
. map_err ( Error :: DeviceError ) ?;
@@ -1142,14 +1152,16 @@ impl FatVolume {
1142
1152
FatSpecificInfo :: Fat32 ( _) => FatType :: Fat32 ,
1143
1153
} ;
1144
1154
let mut blocks = [ Block :: new ( ) ] ;
1155
+ trace ! ( "Reading directory for update" ) ;
1145
1156
block_device
1146
- . read ( & mut blocks, entry. entry_block , "read" )
1157
+ . read ( & mut blocks, entry. entry_block )
1147
1158
. map_err ( Error :: DeviceError ) ?;
1148
1159
let block = & mut blocks[ 0 ] ;
1149
1160
1150
1161
let start = usize:: try_from ( entry. entry_offset ) . map_err ( |_| Error :: ConversionError ) ?;
1151
1162
block[ start..start + 32 ] . copy_from_slice ( & entry. serialize ( fat_type) [ ..] ) ;
1152
1163
1164
+ trace ! ( "Updating directory" ) ;
1153
1165
block_device
1154
1166
. write ( & blocks, entry. entry_block )
1155
1167
. map_err ( Error :: DeviceError ) ?;
@@ -1169,8 +1181,9 @@ where
1169
1181
D :: Error : core:: fmt:: Debug ,
1170
1182
{
1171
1183
let mut blocks = [ Block :: new ( ) ] ;
1184
+ trace ! ( "Reading BPB" ) ;
1172
1185
block_device
1173
- . read ( & mut blocks, lba_start, "read_bpb" )
1186
+ . read ( & mut blocks, lba_start)
1174
1187
. map_err ( Error :: DeviceError ) ?;
1175
1188
let block = & blocks[ 0 ] ;
1176
1189
let bpb = Bpb :: create_from_bytes ( block) . map_err ( Error :: FormatError ) ?;
@@ -1214,12 +1227,9 @@ where
1214
1227
// Safe to unwrap since this is a Fat32 Type
1215
1228
let info_location = bpb. fs_info_block ( ) . unwrap ( ) ;
1216
1229
let mut info_blocks = [ Block :: new ( ) ] ;
1230
+ trace ! ( "Reading info block" ) ;
1217
1231
block_device
1218
- . read (
1219
- & mut info_blocks,
1220
- lba_start + info_location,
1221
- "read_info_sector" ,
1222
- )
1232
+ . read ( & mut info_blocks, lba_start + info_location)
1223
1233
. map_err ( Error :: DeviceError ) ?;
1224
1234
let info_block = & info_blocks[ 0 ] ;
1225
1235
let info_sector =
0 commit comments