diff options
Diffstat (limited to 'dev/kernel/src')
| -rw-r--r-- | dev/kernel/src/DriveMgr.cc | 34 | ||||
| -rw-r--r-- | dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc | 28 |
2 files changed, 40 insertions, 22 deletions
diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index a0f7bb77..cf31928c 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -72,8 +72,6 @@ Void io_drv_output(DriveTrait::DrivePacket& pckt) { /// @param pckt the packet to read. /// @return Void io_drv_init(DriveTrait::DrivePacket& pckt) { - NE_UNUSED(pckt); - #if defined(__ATA_PIO__) || defined(__ATA_DMA__) kATAMaster = 0; kATAIO = 0; @@ -97,10 +95,9 @@ Void io_drv_init(DriveTrait::DrivePacket& pckt) { pckt.fPacketGood = YES; #elif defined(__AHCI__) kAHCIPortsImplemented = 0; + drv_std_init(kAHCIPortsImplemented); - if (drv_std_init(kAHCIPortsImplemented)) { - pckt.fPacketGood = YES; - } + pckt.fPacketGood = kAHCIPortsImplemented > 0; #endif // if defined(__ATA_PIO__) || defined (__ATA_DMA__) } @@ -154,6 +151,8 @@ DriveTrait io_construct_blank_drive() noexcept { namespace Probe { Void io_detect_drive(DriveTrait& trait) { + trait.fInit(trait.fPacket); + EPM_PART_BLOCK block_struct; trait.fPacket.fPacketLba = kEPMBootBlockLba; @@ -163,8 +162,6 @@ namespace Probe { rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime, rt_string_len("fs/detect-packet")); - trait.fInit(trait.fPacket); - trait.fInput(trait.fPacket); if (rt_string_cmp(block_struct.Magic, kEPMMagic, kEPMMagicLength) == 0) { @@ -215,14 +212,14 @@ namespace Probe { trait.fPacket.fPacketSize = 0UL; trait.fPacket.fPacketContent = nullptr; } -} // namespace Detail +} // namespace Probe /// @brief Fetches the main drive. /// @return the new drive. (returns kEPMDrive if EPM formatted) DriveTrait io_construct_main_drive() noexcept { constexpr auto kMainDrive = "/media/main/"; - DriveTrait trait{}; + DriveTrait trait; rt_copy_memory((VoidPtr) kMainDrive, trait.fName, rt_string_len(kMainDrive)); MUST_PASS(trait.fName[0] != 0); @@ -232,9 +229,26 @@ DriveTrait io_construct_main_drive() noexcept { trait.fInput = io_drv_input; trait.fInit = io_drv_init; trait.fProtocol = io_drv_kind; - + Probe::io_detect_drive(trait); return trait; } + +/// @brief Replacement for io_construct_main_drive that works with IMountpoint. +/// @return the new drive. (returns kEPMDrive if EPM formatted) +Void io_construct_main_drive(DriveTrait& trait) noexcept { + constexpr auto kMainDrive = "/media/main/"; + + rt_copy_memory((VoidPtr) kMainDrive, trait.fName, rt_string_len(kMainDrive)); + MUST_PASS(trait.fName[0] != 0); + + trait.fVerify = io_drv_unimplemented; + trait.fOutput = io_drv_output; + trait.fInput = io_drv_input; + trait.fInit = io_drv_init; + trait.fProtocol = io_drv_kind; + + Probe::io_detect_drive(trait); +} } // namespace Kernel diff --git a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc index 8bfbf7fb..5d9bbd55 100644 --- a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc @@ -86,7 +86,7 @@ namespace Detail { ((val << 8) & 0x000000FF00000000ULL) | ((val << 24) & 0x0000FF0000000000ULL) | ((val << 40) & 0x00FF000000000000ULL) | ((val << 56) & 0xFF00000000000000ULL); } - + /// @brief Simple algorithm to hash directory entries for INDs. /// @param path the directory path. /// @return The hashed path. @@ -759,15 +759,14 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c // if disk isn't good, then error out. if (false == mnt->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; - return false; + return NO; } if (drv_std_get_size() < kHeFSMinimumDiskSize) { (Void)(kout << "OpenHeFS recommends at least 128 GiB of free space." << kendl); - (Void)( - kout - << "The OS will still try to format a OpenHeFS disk here anyway, don't expect perfect geometry." - << kendl); + (Void)(kout << "The OS will still try to format a OpenHeFS disk here anyway, don't expect " + "perfect geometry." + << kendl); } HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); @@ -1145,23 +1144,28 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } -STATIC DriveTrait kMountPoint; +STATIC IMountpoint kMountpoint; /// @brief Initialize the OpenHeFS filesystem. /// @return To check its status, see err_local_get(). Boolean OpenHeFS::fs_init_openhefs(Void) noexcept { - kout << "Verifying disk...\r"; + io_construct_main_drive(kMountpoint.A()); - kMountPoint = io_construct_main_drive(); - - if (kMountPoint.fPacket.fPacketReadOnly == YES) { + if (kMountpoint.A().fPacket.fPacketReadOnly == YES) { kout << "Main disk cannot be mounted (read-only media).\r"; return NO; } HeFileSystemParser parser; - return parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName); + if (!parser.Format(&kMountpoint.A(), kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName)) { + kout << "Failed to format OpenHeFS partition!\r"; + return NO; + } + + kout << "Valid OpenHeFS disk...\r"; + + return YES; } } // namespace Kernel |
