From 9610712ae4a793f50c30e8a45676f830cba09588 Mon Sep 17 00:00:00 2001 From: Amlal Date: Mon, 28 Apr 2025 19:32:21 +0200 Subject: dev, kernel: Fixed HeFS directory allocation routine. Signed-off-by: Amlal --- dev/kernel/FSKit/HeFS.h | 12 +- dev/kernel/FSKit/NeFS.h | 4 +- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 16 ++- dev/kernel/src/FS/HeFS.cc | 173 ++++++++++-------------- 4 files changed, 93 insertions(+), 112 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index a6fab1c5..feaee7bc 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -24,7 +24,7 @@ #define kHeFSFileNameLen (256U) #define kHeFSPartNameLen (128U) -#define kHeFSMinimumDiskSize (gib_cast(4)) +#define kHeFSMinimumDiskSize (mib_cast(16)) #define kHeFSDefaultVoluneName u8"HeFS Volume" @@ -108,7 +108,7 @@ struct PACKED HEFS_BOOT_NODE final { /// Drive, etc). Kernel::UInt8 fEncoding; /// @brief Encoding of the filesystem. (UTF-8, UTF-16, etc). Kernel::UInt64 fStartIND; /// @brief Start of the INode tree. - Kernel::UInt64 fEndIND; /// @brief End of the INode tree. + Kernel::UInt64 fEndIND; /// @brief End of the INode tree. it is used to track down the last ind offset. Kernel::UInt64 fINDCount; /// @brief Number of leafs in the INode tree. Kernel::UInt64 fDiskSize; /// @brief Size of the disk. (Could be a virtual size, that is not the /// real size of the disk.) @@ -116,10 +116,10 @@ struct PACKED HEFS_BOOT_NODE final { Kernel::UInt16 fDiskFlags; /// @brief Flags of the disk. (read-only, read-write, etc). Kernel::UInt16 fVID; /// @brief Virtual Identification Number within an EPM disk. (0xFFFF if not used). - Kernel::UInt64 fReserved; /// @brief Reserved for future use. - Kernel::UInt64 fReserved2; /// @brief Reserved for future use. - Kernel::UInt64 fReserved3; /// @brief Reserved for future use. - Kernel::UInt64 fReserved4; /// @brief Reserved for future use. + Kernel::UInt64 fStartIN; /// @brief Reserved for future use. + Kernel::UInt64 fEndIN; /// @brief Reserved for future use. + Kernel::UInt64 fReserved; /// @brief Reserved for future use. + Kernel::UInt64 fReserved1; /// @brief Reserved for future use. Kernel::Char fPad[272]; }; diff --git a/dev/kernel/FSKit/NeFS.h b/dev/kernel/FSKit/NeFS.h index 2235ca4f..588cbe69 100644 --- a/dev/kernel/FSKit/NeFS.h +++ b/dev/kernel/FSKit/NeFS.h @@ -108,7 +108,7 @@ default. #define kNeFSFlagCreated (71) #define kNeFSMimeNameLen (200) -#define kNeFSForkNameLen (200) +#define kNeFSForkNameLen (199) #define kNeFSFrameworkExt ".fwrk/" #define kNeFSStepsExt ".step/" @@ -200,8 +200,6 @@ struct PACKED NEFS_FORK_STRUCT final { Kernel::Lba NextSibling; Kernel::Lba PreviousSibling; - - Kernel::Char Pad[2] = {0}; }; /// @brief Partition block type diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index c3c49533..3994a1a9 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -248,6 +248,14 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz rtl_dma_flush(ptr, size_buffer); } + if ((kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)) == 0) { + goto ahci_io_end; + } else { + kout << "Warning: Disk still busy after command completion!\r"; + while (kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)); + } + + ahci_io_end: rtl_dma_free(size_buffer); err_global_get() = kErrorSuccess; @@ -434,16 +442,16 @@ Bool drv_std_detected_ahci() { /// //////////////////////////////////////////////////// Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci(lba, reinterpret_cast(buffer), - sector_sz, size_buffer); + drv_std_input_output_ahci(lba, reinterpret_cast(buffer), sector_sz, + size_buffer); } //////////////////////////////////////////////////// /// //////////////////////////////////////////////////// Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci(lba, reinterpret_cast(buffer), - sector_sz, size_buffer); + drv_std_input_output_ahci(lba, reinterpret_cast(buffer), sector_sz, + size_buffer); } //////////////////////////////////////////////////// diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 4f05214a..94f7dac1 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -93,6 +93,8 @@ namespace Detail { } else { start += sizeof(HEFS_INDEX_NODE_DIRECTORY); } + + kout << "Traversing RB-Tree...\r"; } /***********************************************************************************/ @@ -152,7 +154,7 @@ namespace Detail { delete grand_parent; grand_parent = nullptr; - dir->fColor = kHeFSBlack; + kout << "Rotate tree to left.\r"; } /***********************************************************************************/ @@ -196,6 +198,8 @@ namespace Detail { mnt->fPacket.fPacketContent = dir; mnt->fOutput(mnt->fPacket); + + kout << "Rotate tree to right.\r"; } /// @brief Get the index node size. @@ -280,7 +284,7 @@ namespace Detail { } STATIC _Output BOOL hefs_allocate_index_directory_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, - HEFS_INDEX_NODE_DIRECTORY* dir) noexcept { + const Utf8Char* dir_name) noexcept { if (root && mnt) { HEFS_INDEX_NODE_DIRECTORY* tmpdir = new HEFS_INDEX_NODE_DIRECTORY(); @@ -299,32 +303,60 @@ namespace Detail { mnt->fInput(mnt->fPacket); if (!mnt->fPacket.fPacketGood) { - delete tmpdir; - return NO; + break; } - if (!tmpdir->fCreated && tmpdir->fDeleted) { + if ((!tmpdir->fCreated && tmpdir->fDeleted) || *tmpdir->fName == u8'\0') { + HEFS_INDEX_NODE_DIRECTORY* dirent = new HEFS_INDEX_NODE_DIRECTORY(); + + rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); + + urt_copy_memory((VoidPtr) dir_name, dirent->fName, urt_string_len(dir_name)); + + dirent->fAccessed = 0; + dirent->fCreated = 1UL; /// TODO: Add the current time. + dirent->fDeleted = 0; + dirent->fModified = 0; + dirent->fEntryCount = 0; + + dirent->fKind = kHeFSFileKindDirectory; + dirent->fFlags = kHeFSEncodingUTF8; + dirent->fChecksum = 0; + + dirent->fChecksum = ke_calculate_crc32((Char*) dirent, sizeof(HEFS_INDEX_NODE_DIRECTORY)); + + dirent->fEntryCount = 0; + + dirent->fChild = tmpdir->fChild; + dirent->fParent = tmpdir->fParent; + dirent->fNext = tmpdir->fNext; + dirent->fPrev = tmpdir->fPrev; + dirent->fColor = tmpdir->fColor; + mnt->fPacket.fPacketLba = start; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); - mnt->fPacket.fPacketContent = dir; - - dir->fChild = tmpdir->fChild; - dir->fParent = tmpdir->fParent; - dir->fNext = tmpdir->fNext; - dir->fPrev = tmpdir->fPrev; - dir->fColor = tmpdir->fColor; + mnt->fPacket.fPacketContent = dirent; mnt->fOutput(mnt->fPacket); + delete dirent; + dirent = nullptr; + + delete tmpdir; + tmpdir = nullptr; + + err_global_get() = kErrorSuccess; + return YES; } - auto old_start = start; hefsi_traverse_tree(tmpdir, root, start); - if (start > root->fEndIND || start == old_start) break; } + err_global_get() = kErrorDisk; + delete tmpdir; + return NO; } err_global_get() = kErrorDiskIsFull; @@ -336,8 +368,8 @@ namespace Detail { if (root && mnt) { HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY(); - auto start = root->fStartIND; - auto end = root->fEndIND; + auto start = mnt->fLbaStart + kHeFSINDStartLBA; + auto end = mnt->fLbaEnd; auto hop_watch = 0UL; @@ -375,9 +407,8 @@ namespace Detail { } } - auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; } delete dir; @@ -487,9 +518,8 @@ namespace Detail { } } - auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; } delete dir; @@ -568,11 +598,9 @@ namespace Detail { } } - auto old_start = start; - hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; } delete dir; @@ -688,20 +716,18 @@ namespace Detail { return NO; } - auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; continue; } else { if (dir_parent->fNext == start) { hefsi_rotate_left(dir, start, mnt); - auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; continue; } @@ -726,10 +752,9 @@ namespace Detail { hefsi_rotate_right(dir, start, mnt); } - auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start > root->fEndIND || start == old_start) break; + if (start > root->fEndIND) break; } delete dir; @@ -821,7 +846,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fSectorSize = drive->fSectorSz; - Lba start = drive->fLbaStart + kHeFSINDStartLBA; + SizeT start = drive->fLbaStart + kHeFSINDStartLBA; if (start > drive->fLbaEnd) { delete root; @@ -850,9 +875,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input } root->fReserved = 0; - root->fReserved2 = 0; - root->fReserved3 = 0; - root->fReserved4 = 0; + root->fReserved1 = 0; root->fVersion = kHeFSVersion; @@ -875,56 +898,21 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input return NO; } - start = root->fStartIND; - - constexpr SizeT kHeFSPreallocateCount = 0x10UL; + constexpr SizeT kHeFSPreallocateCount = 0x7UL; - HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY(); + const Utf8Char* kFileMap[kHeFSPreallocateCount] = { + u8"/", u8"/boot", u8"/system", u8"/devices", u8"/network", u8"/users", u8"/home", + }; - // Pre-allocate index node directory tree for (SizeT i = 0; i < kHeFSPreallocateCount; ++i) { - rt_set_memory(dir, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); - urt_copy_memory((VoidPtr) u8".deleted", dir->fName, urt_string_len(u8".deleted")); - - dir->fFlags = flags; - dir->fKind = kHeFSFileKindDirectory; - - dir->fCreated = 0; - dir->fDeleted = kHeFSTimeMax; /// TODO: Add current time. - - dir->fEntryCount = 0; - - dir->fIndexNodeChecksum = 0; - - dir->fUID = 0; - dir->fGID = 0; - dir->fMode = 0; - - dir->fColor = kHeFSBlack; - dir->fChild = 0; - dir->fParent = 0; - dir->fNext = 0; - dir->fPrev = 0; - - dir->fChecksum = ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)); - - drive->fPacket.fPacketLba = start; - drive->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); - drive->fPacket.fPacketContent = dir; - - start += sizeof(HEFS_INDEX_NODE_DIRECTORY); - - drive->fOutput(drive->fPacket); + this->CreateDirectory(drive, kHeFSEncodingUTF8, kFileMap[i]); } - delete dir; - dir = nullptr; + Detail::hefsi_balance_filesystem(root, drive); delete root; root = nullptr; - Detail::hefsi_balance_filesystem(root, drive); - err_global_get() = kErrorSuccess; if (drive->fPacket.fPacketGood) return YES; @@ -943,6 +931,8 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu const Utf8Char* dir) { HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE(); + NE_UNUSED(flags); + kout << "CreateDirectory...\r"; if (!root) { @@ -964,41 +954,26 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu drive->fInput(drive->fPacket); - HEFS_INDEX_NODE_DIRECTORY* dirent = new HEFS_INDEX_NODE_DIRECTORY(); - - rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); - - urt_copy_memory((VoidPtr) dir, dirent->fName, urt_string_len(dir)); - - dirent->fAccessed = 0; - dirent->fCreated = kHeFSTimeMax; /// TODO: Add the current time. - dirent->fDeleted = 0; - dirent->fModified = 0; - dirent->fEntryCount = 0; + if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { + delete root; + root = nullptr; - dirent->fKind = kHeFSFileKindDirectory; - dirent->fFlags = flags; - dirent->fChecksum = 0; + err_global_get() = kErrorDiskIsCorrupted; - dirent->fChecksum = ke_calculate_crc32((Char*) dirent, sizeof(HEFS_INDEX_NODE_DIRECTORY)); + kout << "Invalid BootNode!\r"; - dirent->fEntryCount = 0; + return NO; + } - if (Detail::hefs_allocate_index_directory_node(root, drive, dirent)) { - delete dirent; - dirent = nullptr; + if (Detail::hefs_allocate_index_directory_node(root, drive, dir)) { + Detail::hefsi_balance_filesystem(root, drive); delete root; root = nullptr; - Detail::hefsi_balance_filesystem(root, drive); - return YES; } - delete dirent; - dirent = nullptr; - delete root; root = nullptr; @@ -1068,7 +1043,7 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con } node->fAccessed = 0; - node->fCreated = kHeFSTimeMax; + node->fCreated = 1UL; node->fDeleted = 0; node->fModified = 0; node->fSize = 0; -- cgit v1.2.3