fix: Make backup boot-sector part of reserved region when formatting volume
Change number of reserved sectors to 8. Previously backup boot-sector was over-written by FAT formatting code soon after it was initialized.
This commit is contained in:
parent
f2863e8f46
commit
b4455a86a8
@ -513,8 +513,9 @@ fn format_bpb(options: &FormatVolumeOptions) -> io::Result<(BiosParameterBlock,
|
||||
let sectors_per_cluster = (bytes_per_cluster / bytes_per_sector as u32) as u8;
|
||||
|
||||
// Note: most of implementations use 32 reserved sectors for FAT32 but it's wasting of space
|
||||
// We use 4 because there are two boot sectors and one FS Info sector (1 sector remains unused)
|
||||
let reserved_sectors: u16 = if fat_type == FatType::Fat32 { 4 } else { 1 };
|
||||
// This implementation uses only 8. This is enough to fit in two boot sectors (main and backup) with additional
|
||||
// bootstrap code and one FSInfo sector. It also makes FAT alligned to 4096 which is a nice number.
|
||||
let reserved_sectors: u16 = if fat_type == FatType::Fat32 { 8 } else { 1 };
|
||||
|
||||
let fats = 2u8;
|
||||
let is_fat32 = fat_type == FatType::Fat32;
|
||||
|
@ -913,6 +913,7 @@ pub fn format_volume<T: ReadWriteSeek>(mut disk: T, options: FormatVolumeOptions
|
||||
write_zeros_until_end_of_sector(&mut disk, bytes_per_sector)?;
|
||||
|
||||
// backup boot sector
|
||||
debug_assert!(boot.bpb.backup_boot_sector() < boot.bpb.reserved_sectors());
|
||||
disk.seek(SeekFrom::Start(boot.bpb.bytes_from_sectors(boot.bpb.backup_boot_sector())))?;
|
||||
boot.serialize(&mut disk)?;
|
||||
write_zeros_until_end_of_sector(&mut disk, bytes_per_sector)?;
|
||||
|
@ -14,6 +14,14 @@ const TEST_STR: &str = "Hi there Rust programmer!\n";
|
||||
type FileSystem = fatfs::FileSystem<BufStream<io::Cursor<Vec<u8>>>>;
|
||||
|
||||
fn basic_fs_test(fs: &FileSystem) {
|
||||
let stats = fs.stats().expect("stats");
|
||||
if fs.fat_type() == fatfs::FatType::Fat32 {
|
||||
// On FAT32 one cluster is allocated for root directory
|
||||
assert_eq!(stats.total_clusters(), stats.free_clusters() + 1);
|
||||
} else {
|
||||
assert_eq!(stats.total_clusters(), stats.free_clusters());
|
||||
}
|
||||
|
||||
let root_dir = fs.root_dir();
|
||||
let entries = root_dir.iter().map(|r| r.unwrap()).collect::<Vec<_>>();
|
||||
assert_eq!(entries.len(), 0);
|
||||
|
Loading…
Reference in New Issue
Block a user