Kernel/FATFS: Read the FAT32 FSInfo structure

This structure contains information about free clusters which
is going to be useful when allocating clusters.
This commit is contained in:
Undefine
2024-01-14 17:30:31 +01:00
committed by Tim Schumacher
parent 7e251c3b4f
commit 92d58a91a6
2 changed files with 23 additions and 0 deletions

View File

@@ -239,6 +239,24 @@ ErrorOr<void> FATFS::initialize_while_locked()
root_entry.attributes = FATAttributes::Directory;
m_root_inode = TRY(FATInode::create(*this, root_entry, { 0, 1 }));
if (m_fat_version == FATVersion::FAT32) {
auto fs_info_buffer = UserOrKernelBuffer::for_kernel_buffer(bit_cast<u8*>(&m_fs_info));
// We know that there is a DOS7 BPB, because if it wasn't present
// we would have returned EINVAL above.
TRY(read_block(ebpb.dos7_bpb()->fs_info_sector, &fs_info_buffer, sizeof(m_fs_info)));
if (m_fs_info.lead_signature != fs_info_signature_1 || m_fs_info.struct_signature != fs_info_signature_2 || m_fs_info.trailing_signature != fs_info_signature_3) {
dbgln("FATFS: Invalid FSInfo struct signature");
dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature1: {:#x}, expected: {:#x}", m_fs_info.lead_signature, fs_info_signature_1);
dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature2: {:#x}, expected: {:#x}", m_fs_info.struct_signature, fs_info_signature_2);
dbgln_if(FAT_DEBUG, "FATFS: FSInfo signature3: {:#x}, expected: {:#x}", m_fs_info.trailing_signature, fs_info_signature_3);
return Error::from_errno(EINVAL);
}
dbgln_if(FAT_DEBUG, "FATFS: fs_info.last_known_free_cluster_count: {}", m_fs_info.last_known_free_cluster_count);
dbgln_if(FAT_DEBUG, "FATFS: fs_info.next_free_cluster_hint: {}", m_fs_info.next_free_cluster_hint);
}
return {};
}

View File

@@ -78,6 +78,10 @@ private:
static constexpr u8 signature_1 = 0x28;
static constexpr u8 signature_2 = 0x29;
static constexpr u32 fs_info_signature_1 = 0x41615252;
static constexpr u32 fs_info_signature_2 = 0x61417272;
static constexpr u32 fs_info_signature_3 = 0xAA550000;
static constexpr u32 first_data_cluster = 2;
FatBlockSpan first_block_of_cluster(u32 cluster) const;
@@ -91,6 +95,7 @@ private:
ErrorOr<void> fat_write(u32 cluster, u32 value);
OwnPtr<KBuffer> m_boot_record;
FAT32FSInfo m_fs_info;
OwnPtr<DOSBIOSParameterBlock> m_parameter_block;
RefPtr<FATInode> m_root_inode;
u32 m_first_data_sector { 0 };