FileSystem.cpp 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright (c) 2022, Undefine <undefine@undefine.pl>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Debug.h>
  7. #include <Kernel/FileSystem/FATFS/FileSystem.h>
  8. #include <Kernel/FileSystem/FATFS/Inode.h>
  9. namespace Kernel {
  10. ErrorOr<NonnullLockRefPtr<FileSystem>> FATFS::try_create(OpenFileDescription& file_description)
  11. {
  12. return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) FATFS(file_description)));
  13. }
  14. FATFS::FATFS(OpenFileDescription& file_description)
  15. : BlockBasedFileSystem(file_description)
  16. {
  17. }
  18. bool FATFS::is_initialized_while_locked()
  19. {
  20. VERIFY(m_lock.is_locked());
  21. return !m_root_inode.is_null();
  22. }
  23. ErrorOr<void> FATFS::initialize_while_locked()
  24. {
  25. VERIFY(m_lock.is_locked());
  26. VERIFY(!is_initialized_while_locked());
  27. m_boot_record = TRY(KBuffer::try_create_with_size("FATFS: Boot Record"sv, m_logical_block_size));
  28. auto boot_record_buffer = UserOrKernelBuffer::for_kernel_buffer(m_boot_record->data());
  29. TRY(raw_read(0, boot_record_buffer));
  30. if constexpr (FAT_DEBUG) {
  31. dbgln("FATFS: oem_identifier: {}", boot_record()->oem_identifier);
  32. dbgln("FATFS: bytes_per_sector: {}", boot_record()->bytes_per_sector);
  33. dbgln("FATFS: sectors_per_cluster: {}", boot_record()->sectors_per_cluster);
  34. dbgln("FATFS: reserved_sector_count: {}", boot_record()->reserved_sector_count);
  35. dbgln("FATFS: fat_count: {}", boot_record()->fat_count);
  36. dbgln("FATFS: root_directory_entry_count: {}", boot_record()->root_directory_entry_count);
  37. dbgln("FATFS: media_descriptor_type: {}", boot_record()->media_descriptor_type);
  38. dbgln("FATFS: sectors_per_track: {}", boot_record()->sectors_per_track);
  39. dbgln("FATFS: head_count: {}", boot_record()->head_count);
  40. dbgln("FATFS: hidden_sector_count: {}", boot_record()->hidden_sector_count);
  41. dbgln("FATFS: sector_count: {}", boot_record()->sector_count);
  42. dbgln("FATFS: sectors_per_fat: {}", boot_record()->sectors_per_fat);
  43. dbgln("FATFS: flags: {}", boot_record()->flags);
  44. dbgln("FATFS: fat_version: {}", boot_record()->fat_version);
  45. dbgln("FATFS: root_directory_cluster: {}", boot_record()->root_directory_cluster);
  46. dbgln("FATFS: fs_info_sector: {}", boot_record()->fs_info_sector);
  47. dbgln("FATFS: backup_boot_sector: {}", boot_record()->backup_boot_sector);
  48. dbgln("FATFS: drive_number: {}", boot_record()->drive_number);
  49. dbgln("FATFS: volume_id: {}", boot_record()->volume_id);
  50. }
  51. if (boot_record()->signature != signature_1 && boot_record()->signature != signature_2) {
  52. dbgln("FATFS: Invalid signature");
  53. return EINVAL;
  54. }
  55. m_logical_block_size = boot_record()->bytes_per_sector;
  56. set_block_size(m_logical_block_size);
  57. u32 root_directory_sectors = ((boot_record()->root_directory_entry_count * sizeof(FATEntry)) + (m_logical_block_size - 1)) / m_logical_block_size;
  58. m_first_data_sector = boot_record()->reserved_sector_count + (boot_record()->fat_count * boot_record()->sectors_per_fat) + root_directory_sectors;
  59. TRY(BlockBasedFileSystem::initialize_while_locked());
  60. FATEntry root_entry {};
  61. root_entry.first_cluster_low = boot_record()->root_directory_cluster & 0xFFFF;
  62. root_entry.first_cluster_high = boot_record()->root_directory_cluster >> 16;
  63. root_entry.attributes = FATAttributes::Directory;
  64. m_root_inode = TRY(FATInode::create(*this, root_entry));
  65. return {};
  66. }
  67. Inode& FATFS::root_inode()
  68. {
  69. return *m_root_inode;
  70. }
  71. BlockBasedFileSystem::BlockIndex FATFS::first_block_of_cluster(u32 cluster) const
  72. {
  73. return ((cluster - first_data_cluster) * boot_record()->sectors_per_cluster) + m_first_data_sector;
  74. }
  75. }