diff options
| author | Amlal <amlal@nekernel.org> | 2025-04-26 16:56:37 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-04-26 17:15:56 +0200 |
| commit | 360c69daf7a83ec31c384390d9ec37064b78b40e (patch) | |
| tree | bf78f6267b032815f992f02768251186dbeda7d5 /dev/kernel | |
| parent | 9c33e844d76f9db6d7110de4f05cbe2084cdbca1 (diff) | |
dev, kernel, tooling: add HeFS tooling and early allocation stategy.
why?
- we need to format it externally too.
- a in-kernel format doesn't handle every case.
- and i have to fix the createdir, createfile methods for correct inode dir linking.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel')
| -rw-r--r-- | dev/kernel/FSKit/HeFS.h | 7 | ||||
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 72 |
2 files changed, 43 insertions, 36 deletions
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 693ec2d3..a2dd9fe0 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -29,7 +29,10 @@ #define kHeFSDefaultVoluneName u"HeFS Volume"
#define kHeFSDIMBootDir u"boot-x/dir"
-#define kHeFSDIMBootFile u"boot-x/file"
+#define kHeFSMIMEBootFile u"boot-x/file"
+
+#define kHeFSDIMSystemDir u"system-x/dir"
+#define kHeFSMIMESystemFile u"system-x/file"
#define kHeFSSearchAllStr u"*"
@@ -123,7 +126,7 @@ struct PACKED HEFS_BOOT_NODE final { };
inline constexpr Kernel::ATime kHeFSTimeInvalid = 0x0000000000000000;
-inline constexpr Kernel::ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF;
+inline constexpr Kernel::ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF - 1;
/// @brief HeFS index node.
/// @details This structure is used to store the file information of a file.
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 81316ba5..13d79c8f 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -78,29 +78,20 @@ namespace Detail { hefsi_traverse_tree(HEFS_INDEX_NODE_DIRECTORY* dir, HEFS_BOOT_NODE* node, Lba& start) { NE_UNUSED(node); - if (!dir) { - ke_panic(RUNTIME_CHECK_FILESYSTEM, "Error: Invalid directory node in RB-Tree traversal.\r"); + if (!dir || !node) { + ke_panic(RUNTIME_CHECK_FILESYSTEM, "Error: Invalid directory node/boot_node in RB-Tree traversal."); } - start = dir->fNext; - - if (dir->fColor == kHeFSBlack && start == 0) { - if (dir->fParent != 0) start = dir->fParent; - } else if (dir->fColor == kHeFSRed && start == 0) { - if (dir->fChild != 0) - start = dir->fChild; - else if (dir->fNext != 0) - start = dir->fNext; - else if (dir->fPrev != 0) - start = dir->fPrev; - else - start = dir->fParent; - } - - if (start == 0) { - ke_panic(RUNTIME_CHECK_FILESYSTEM, "Error: Invalid start value in RB-Tree traversal.\r"); - - return; + if (dir->fChild != 0) { + start = dir->fChild; + } else if (dir->fNext != 0) { + start = dir->fNext; + } else if (dir->fParent != 0) { + start = dir->fParent; + } else if (dir->fPrev != 0) { + start = dir->fPrev; + } else { + start = node->fStartIND; } } @@ -324,13 +315,16 @@ namespace Detail { return NO; } - if (parent->fDeleted) { + if (parent->fDeleted || + !parent->fCreated) { mnt->fPacket.fPacketLba = start; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); mnt->fPacket.fPacketContent = dir; mnt->fOutput(mnt->fPacket); + hefsi_balance_filesystem(root, mnt); + return YES; } @@ -866,14 +860,14 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input wrt_copy_memory((VoidPtr) u"/", root_dir->fName, wrt_string_len(u"/")); wrt_copy_memory((VoidPtr) kHeFSDIMBootDir, root_dir->fDim, wrt_string_len(kHeFSDIMBootDir)); - root_dir->fKind = kHeFSFileKindDirectory; - root_dir->fColor = kHeFSBlack; // Every RB-Tree root starts black. (a condition of the algorithm) - root_dir->fParent = 0; // No parent (it's the real root) - root_dir->fChild = 0; // No children yet - root_dir->fNext = 0; // No next - root_dir->fPrev = 0; // No previous + root_dir->fKind = kHeFSFileKindDirectory; + root_dir->fColor = kHeFSBlack; // Every RB-Tree root starts black. (a condition of the algorithm) + root_dir->fParent = root->fStartIND; // No parent (it's the real root) + root_dir->fChild = root->fEndIND; // No children yet + root_dir->fNext = 0; // No next + root_dir->fPrev = 0; // No previous - root_dir->fEntryCount = 0; + root_dir->fEntryCount = 1; drive->fPacket.fPacketLba = drive->fLbaStart + sizeof(HEFS_BOOT_NODE) + sizeof(HEFS_BOOT_NODE); drive->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); @@ -881,6 +875,8 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input drive->fOutput(drive->fPacket); + Detail::hefsi_balance_filesystem(root, drive); + delete root_dir; delete root; @@ -942,6 +938,8 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu drive->fInput(drive->fPacket); + Detail::hefsi_balance_filesystem(root, drive); + auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir); if (dirent) { @@ -963,20 +961,22 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu wrt_copy_memory((VoidPtr) dir, dirent->fName, wrt_string_len(dir)); dirent->fAccessed = 0; - dirent->fCreated = 0; + dirent->fCreated = 0; /// TODO: Add the current time. dirent->fDeleted = 0; dirent->fModified = 0; dirent->fEntryCount = 0; - dirent->fParent = 0; // No parent (it's the real root) - dirent->fChild = 0; // No children yet - dirent->fNext = 0; // No next - dirent->fPrev = 0; // No previous + dirent->fParent = root->fStartIND; // No parent (it's the real root) + dirent->fChild = root->fEndIND; // No children yet + dirent->fNext = 0; // No next + dirent->fPrev = 0; // No previous dirent->fKind = kHeFSFileKindDirectory; dirent->fFlags = flags; dirent->fChecksum = 0; + dirent->fEntryCount = 1; + if (Detail::hefs_allocate_index_directory_node(root, drive, dirent)) { delete dirent; dirent = nullptr; @@ -1033,6 +1033,8 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con drive->fInput(drive->fPacket); + Detail::hefsi_balance_filesystem(root, drive); + auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir); if (!dirent) { @@ -1077,6 +1079,8 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con return NO; } +/// @brief Initialize the HeFS filesystem. +/// @return To check its status, see err_local_get(). Boolean fs_init_hefs(Void) noexcept { kout << "Creating main disk with HeFS in it...\r"; |
