summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src/FS/HeFS.cc
diff options
context:
space:
mode:
authorAmlal <amlal@nekernel.org>2025-04-28 21:24:37 +0200
committerAmlal <amlal@nekernel.org>2025-04-28 21:24:37 +0200
commita435ad97c1dac5282e148e6dac2d82aabcb553e5 (patch)
tree8e5ba5d7ba21d4d78f7793a8de375c880b1fd62c /dev/kernel/src/FS/HeFS.cc
parentfc91bc6dacb8e53e081695054a31fe3e34bef5a0 (diff)
kernel: getting that filesystem to work as intended.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src/FS/HeFS.cc')
-rw-r--r--dev/kernel/src/FS/HeFS.cc208
1 files changed, 116 insertions, 92 deletions
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index 94f7dac1..f0bb5d78 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -219,21 +219,8 @@ namespace Detail {
SizeT sz = 0UL;
auto start = root->fStartIND;
- auto end = root->fEndIND;
-
- auto hop_watch = 0UL;
while (YES) {
- if (start > end) {
- kout << "Error: Invalid start/end values.\r";
- break;
- }
-
- if (hop_watch++ > (root->fEndIND / sizeof(HEFS_INDEX_NODE_DIRECTORY))) {
- kout << "Error: Hop watch exceeded, filesystem is stalling.\r";
- break;
- }
-
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
mnt->fPacket.fPacketContent = dir;
@@ -327,11 +314,54 @@ namespace Detail {
dirent->fEntryCount = 0;
- dirent->fChild = tmpdir->fChild;
- dirent->fParent = tmpdir->fParent;
- dirent->fNext = tmpdir->fNext;
- dirent->fPrev = tmpdir->fPrev;
- dirent->fColor = tmpdir->fColor;
+ dirent->fNext = tmpdir->fNext;
+ dirent->fPrev = tmpdir->fPrev;
+
+ if (dirent->fPrev == 0) {
+ dirent->fPrev = root->fStartIND;
+ }
+
+ if (dirent->fNext == 0) {
+ if (start == root->fEndIND) {
+ dirent->fNext = start + sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ }
+ }
+
+ if (tmpdir->fParent == 0) {
+ tmpdir->fParent = root->fStartIND;
+ }
+
+ if (tmpdir->fChild == 0) {
+ auto child = root->fEndIND;
+
+ while (YES) {
+ mnt->fPacket.fPacketLba = child;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = tmpdir;
+
+ mnt->fInput(mnt->fPacket);
+
+ if ((!tmpdir->fCreated && tmpdir->fDeleted) || *tmpdir->fName == u8'\0') {
+ break;
+ }
+
+ child -= sizeof(HEFS_INDEX_NODE_DIRECTORY);
+ if (child > root->fEndIND) break;
+ }
+
+ dirent->fColor = kHeFSRed;
+ dirent->fChild = child;
+
+ if (child > root->fEndIND) dirent->fChild = root->fEndIND;
+ } else {
+ dirent->fColor = tmpdir->fColor;
+ dirent->fChild = tmpdir->fChild;
+ }
+
+ for (SizeT index = 0UL; index < (kHeFSBlockCount * 2); index += 2) {
+ dirent->fIndexNode[index] = root->fStartIN;
+ dirent->fIndexNode[index + 1] = 0UL;
+ }
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
@@ -351,6 +381,7 @@ namespace Detail {
}
hefsi_traverse_tree(tmpdir, root, start);
+ if (start > root->fEndIND) break;
}
err_global_get() = kErrorDisk;
@@ -368,22 +399,9 @@ namespace Detail {
if (root && mnt) {
HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY();
- auto start = mnt->fLbaStart + kHeFSINDStartLBA;
- auto end = mnt->fLbaEnd;
-
- auto hop_watch = 0UL;
+ auto start = root->fStartIND;
while (YES) {
- if (start > end) {
- kout << "Error: Invalid start/end values.\r";
- break;
- }
-
- if (hop_watch++ > (root->fEndIND / sizeof(HEFS_INDEX_NODE_DIRECTORY))) {
- kout << "Error: Hop watch exceeded, filesystem is stalling.\r";
- break;
- }
-
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
mnt->fPacket.fPacketContent = dir;
@@ -392,7 +410,6 @@ namespace Detail {
if (!mnt->fPacket.fPacketGood) {
delete dir;
-
dir = nullptr;
err_global_get() = kErrorFileNotFound;
@@ -441,23 +458,10 @@ namespace Detail {
}
auto start = root->fStartIND;
- auto end = root->fEndIND;
auto start_cnt = 0UL;
- auto hop_watch = 0UL;
-
while (YES) {
- if (start > end) {
- kout << "Error: Invalid start/end values.\r";
- break;
- }
-
- if (hop_watch++ > (root->fEndIND / sizeof(HEFS_INDEX_NODE_DIRECTORY))) {
- kout << "Error: Hop watch exceeded, filesystem is stalling.\r";
- break;
- }
-
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
mnt->fPacket.fPacketContent = dir;
@@ -479,7 +483,7 @@ namespace Detail {
if (dir->fKind == kHeFSFileKindDirectory) {
if (KStringBuilder::Equals(dir_name, dir->fName) ||
KStringBuilder::Equals(dir_name, kHeFSSearchAllStr)) {
- for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) {
+ for (SizeT inode_index = 0UL; inode_index < (kHeFSBlockCount * 2); inode_index += 2) {
if (dir->fIndexNode[inode_index] != 0) {
mnt->fPacket.fPacketLba = dir->fIndexNode[inode_index];
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
@@ -551,16 +555,7 @@ namespace Detail {
auto start = root->fStartIND;
- auto hop_watch = 0UL;
-
while (YES) {
- if (start > root->fEndIND) break;
-
- if (hop_watch++ > (root->fEndIND / sizeof(HEFS_INDEX_NODE_DIRECTORY))) {
- kout << "Error: Hop watch exceeded, filesystem is stalling.\r";
- break;
- }
-
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
mnt->fPacket.fPacketContent = dir;
@@ -568,7 +563,7 @@ namespace Detail {
mnt->fInput(mnt->fPacket);
if (KStringBuilder::Equals(dir->fName, parent_dir_name)) {
- for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) {
+ for (SizeT inode_index = 0UL; inode_index < (kHeFSBlockCount * 2); inode_index += 2) {
if (dir->fIndexNode[inode_index] != 0) {
HEFS_INDEX_NODE prev_node;
@@ -580,26 +575,23 @@ namespace Detail {
mnt->fInput(mnt->fPacket);
- if (prev_node.fDeleted > 0 && !prev_node.fCreated) {
- mnt->fPacket.fPacketLba = lba;
- mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
- mnt->fPacket.fPacketContent = node;
+ mnt->fPacket.fPacketLba = lba;
+ mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE);
+ mnt->fPacket.fPacketContent = node;
- mnt->fOutput(mnt->fPacket);
+ mnt->fOutput(mnt->fPacket);
- if (mnt->fPacket.fPacketGood) {
- delete dir;
- dir = nullptr;
+ if (mnt->fPacket.fPacketGood) {
+ delete dir;
+ dir = nullptr;
- return YES;
- }
+ return YES;
}
}
}
}
hefsi_traverse_tree(dir, root, start);
-
if (start > root->fEndIND) break;
}
@@ -624,22 +616,13 @@ namespace Detail {
auto start = root->fStartIND;
- SizeT hop_watch = 0UL;
-
while (YES) {
- if (start > root->fEndIND) break;
-
mnt->fPacket.fPacketLba = start;
mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY);
mnt->fPacket.fPacketContent = dir;
mnt->fInput(mnt->fPacket);
- if (hop_watch++ > (root->fSectorCount)) { // <-- NEW (stall protection)
- kout << "Warning: Traversal stalled during balancing.\r";
- break; // Exit cleanly instead of hanging forever
- }
-
if (!mnt->fPacket.fPacketGood) {
delete dir;
dir = nullptr;
@@ -717,7 +700,6 @@ namespace Detail {
}
hefsi_traverse_tree(dir, root, start);
-
if (start > root->fEndIND) break;
continue;
@@ -726,7 +708,6 @@ namespace Detail {
hefsi_rotate_left(dir, start, mnt);
hefsi_traverse_tree(dir, root, start);
-
if (start > root->fEndIND) break;
continue;
@@ -753,7 +734,6 @@ namespace Detail {
}
hefsi_traverse_tree(dir, root, start);
-
if (start > root->fEndIND) break;
}
@@ -840,12 +820,6 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
urt_copy_memory((VoidPtr) part_name, root->fVolName, urt_string_len(part_name));
rt_copy_memory((VoidPtr) kHeFSMagic, root->fMagic, kHeFSMagicLen - 1);
- root->fBadSectors = 0;
-
- root->fSectorCount = drv_std_get_sector_count();
-
- root->fSectorSize = drive->fSectorSz;
-
SizeT start = drive->fLbaStart + kHeFSINDStartLBA;
if (start > drive->fLbaEnd) {
@@ -857,8 +831,21 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
return NO;
}
+ root->fBadSectors = 0;
+
+ root->fSectorCount = drv_std_get_sector_count();
+ root->fSectorSize = drive->fSectorSz;
+
+ SizeT disk_sectors = drv_std_get_size() / drive->fSectorSz; // Get total sectors
+
+ SizeT dir_sectors = disk_sectors / 20; // 5% for directory metadata
+ SizeT inode_sectors = disk_sectors / 10; // 10% for inodes
+
root->fStartIND = start;
- root->fEndIND = drive->fLbaEnd;
+ root->fEndIND = root->fStartIND + dir_sectors - sizeof(HEFS_INDEX_NODE_DIRECTORY);
+
+ root->fStartIN = root->fEndIND + 1;
+ root->fEndIN = root->fStartIN + inode_sectors - sizeof(HEFS_INDEX_NODE);
root->fINDCount = 0;
@@ -898,6 +885,45 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
return NO;
}
+ start = root->fStartIND;
+
+ HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY();
+
+ rt_set_memory(dir, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY));
+ urt_copy_memory((VoidPtr) u8".CoreFS", dir->fName, urt_string_len(u8".CoreFS"));
+
+ 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 = root->fStartIND;
+ dir->fParent = root->fStartIND;
+ dir->fNext = root->fStartIND;
+ dir->fPrev = root->fStartIND;
+
+ 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);
+
+ delete dir;
+
constexpr SizeT kHeFSPreallocateCount = 0x7UL;
const Utf8Char* kFileMap[kHeFSPreallocateCount] = {
@@ -908,8 +934,6 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input
this->CreateDirectory(drive, kHeFSEncodingUTF8, kFileMap[i]);
}
- Detail::hefsi_balance_filesystem(root, drive);
-
delete root;
root = nullptr;
@@ -938,8 +962,6 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu
if (!root) {
kout << "Error: Failed to allocate memory for boot node.\r";
- if (root) delete root;
-
return NO;
}
@@ -960,7 +982,7 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu
err_global_get() = kErrorDiskIsCorrupted;
- kout << "Invalid BootNode!\r";
+ kout << "Invalid Boot Node, this can't continue!\r";
return NO;
}
@@ -1087,6 +1109,8 @@ Boolean fs_init_hefs(Void) noexcept {
parser.Format(&kMountPoint, kHeFSEncodingUTF8, kHeFSDefaultVoluneName);
+ parser.CreateFile(&kMountPoint, kHeFSEncodingUTF8, u8"/", u8"bootnet.efi");
+
return YES;
}
} // namespace Kernel::HeFS